[PATCH 01/14] score: Add _ISR_lock_Is_owner()
Sebastian Huber
sebastian.huber at embedded-brains.de
Wed May 11 13:23:28 UTC 2016
---
cpukit/score/include/rtems/score/isrlock.h | 19 ++++++++++++
cpukit/score/include/rtems/score/percpu.h | 2 ++
cpukit/score/include/rtems/score/smplock.h | 48 ++++++++++++++++++++++++++++--
cpukit/score/src/smplock.c | 25 +++++++++++++++-
4 files changed, 90 insertions(+), 4 deletions(-)
diff --git a/cpukit/score/include/rtems/score/isrlock.h b/cpukit/score/include/rtems/score/isrlock.h
index 12afd08..f87f555 100644
--- a/cpukit/score/include/rtems/score/isrlock.h
+++ b/cpukit/score/include/rtems/score/isrlock.h
@@ -281,6 +281,25 @@ typedef struct {
(void) _context;
#endif
+#if defined( RTEMS_DEBUG )
+ /**
+ * @brief Returns true, if the ISR lock is owned by the current processor,
+ * otherwise false.
+ *
+ * On uni-processor configurations, this function returns true, if interrupts
+ * are disabled, otherwise false.
+ *
+ * @param[in] _lock The ISR lock control.
+ */
+ #if defined( RTEMS_SMP )
+ #define _ISR_lock_Is_owner( _lock ) \
+ _SMP_lock_Is_owner( &( _lock )->Lock )
+ #else
+ #define _ISR_lock_Is_owner( _lock ) \
+ ( _ISR_Get_level() != 0 )
+ #endif
+#endif
+
/**
* @brief Flashes an ISR lock.
*
diff --git a/cpukit/score/include/rtems/score/percpu.h b/cpukit/score/include/rtems/score/percpu.h
index 6b60858..a4a8ffb 100644
--- a/cpukit/score/include/rtems/score/percpu.h
+++ b/cpukit/score/include/rtems/score/percpu.h
@@ -43,6 +43,8 @@ extern "C" {
*/
#if defined( RTEMS_PROFILING )
#define PER_CPU_CONTROL_SIZE_LOG2 9
+ #elif defined( RTEMS_DEBUG )
+ #define PER_CPU_CONTROL_SIZE_LOG2 8
#else
#define PER_CPU_CONTROL_SIZE_LOG2 7
#endif
diff --git a/cpukit/score/include/rtems/score/smplock.h b/cpukit/score/include/rtems/score/smplock.h
index f98f38a..0cefe38 100644
--- a/cpukit/score/include/rtems/score/smplock.h
+++ b/cpukit/score/include/rtems/score/smplock.h
@@ -10,7 +10,7 @@
* COPYRIGHT (c) 1989-2011.
* On-Line Applications Research Corporation (OAR).
*
- * Copyright (c) 2013-2015 embedded brains GmbH
+ * Copyright (c) 2013, 2016 embedded brains GmbH
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
@@ -32,7 +32,7 @@
#include <string.h>
#endif
-#if defined( RTEMS_PROFILING )
+#if defined( RTEMS_PROFILING ) || defined( RTEMS_DEBUG )
#define RTEMS_SMP_LOCK_DO_NOT_INLINE
#endif
@@ -373,6 +373,21 @@ static inline void _SMP_ticket_lock_Do_release(
*/
typedef struct {
SMP_ticket_lock_Control Ticket_lock;
+#if defined( RTEMS_DEBUG )
+ /**
+ * @brief The index of the owning processor of this lock.
+ *
+ * The processor index is used instead of the executing thread, so that this
+ * works in interrupt and system initialization context. It is assumed that
+ * thread dispatching is disabled in SMP lock critical sections.
+ *
+ * In case the lock is free, then the value of this field is
+ * SMP_LOCK_NO_OWNER.
+ *
+ * @see _SMP_lock_Is_owner().
+ */
+ uint32_t owner;
+#endif
#if defined( RTEMS_PROFILING )
SMP_lock_Stats Stats;
#endif
@@ -388,10 +403,24 @@ typedef struct {
#endif
} SMP_lock_Context;
+#if defined( RTEMS_DEBUG )
+#define SMP_LOCK_NO_OWNER 0xffffffff
+#endif
+
/**
* @brief SMP lock control initializer for static initialization.
*/
-#if defined( RTEMS_PROFILING )
+#if defined( RTEMS_DEBUG ) && defined( RTEMS_PROFILING )
+ #define SMP_LOCK_INITIALIZER( name ) \
+ { \
+ SMP_TICKET_LOCK_INITIALIZER, \
+ SMP_LOCK_NO_OWNER, \
+ SMP_LOCK_STATS_INITIALIZER( name ) \
+ }
+#elif defined( RTEMS_DEBUG )
+ #define SMP_LOCK_INITIALIZER( name ) \
+ { SMP_TICKET_LOCK_INITIALIZER, SMP_LOCK_NO_OWNER }
+#elif defined( RTEMS_PROFILING )
#define SMP_LOCK_INITIALIZER( name ) \
{ SMP_TICKET_LOCK_INITIALIZER, SMP_LOCK_STATS_INITIALIZER( name ) }
#else
@@ -422,6 +451,9 @@ static inline void _SMP_lock_Initialize(
)
{
_SMP_ticket_lock_Initialize( &lock->Ticket_lock );
+#if defined( RTEMS_DEBUG )
+ lock->owner = SMP_LOCK_NO_OWNER;
+#endif
#if defined( RTEMS_PROFILING )
_SMP_lock_Stats_initialize( &lock->Stats, name );
#else
@@ -559,6 +591,16 @@ static inline void _SMP_lock_Release_and_ISR_enable(
_ISR_Enable_without_giant( context->isr_level );
}
+#if defined( RTEMS_DEBUG )
+/**
+ * @brief Returns true, if the SMP lock is owned by the current processor,
+ * otherwise false.
+ *
+ * @param[in] lock The SMP lock control.
+ */
+bool _SMP_lock_Is_owner( const SMP_lock_Control *lock );
+#endif
+
#if defined( RTEMS_PROFILING )
typedef struct {
diff --git a/cpukit/score/src/smplock.c b/cpukit/score/src/smplock.c
index 1440091..35b1930 100644
--- a/cpukit/score/src/smplock.c
+++ b/cpukit/score/src/smplock.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015 embedded brains GmbH. All rights reserved.
+ * Copyright (c) 2015, 2016 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Dornierstr. 4
@@ -17,6 +17,8 @@
#endif
#include <rtems/score/smplock.h>
+#include <rtems/score/assert.h>
+#include <rtems/score/smp.h>
#if defined(RTEMS_SMP_LOCK_DO_NOT_INLINE)
@@ -39,6 +41,9 @@ void _SMP_lock_Acquire(
)
{
_SMP_lock_Acquire_body( lock, context );
+#if defined(RTEMS_DEBUG)
+ lock->owner = _SMP_Get_current_processor();
+#endif
}
void _SMP_lock_Release(
@@ -46,6 +51,10 @@ void _SMP_lock_Release(
SMP_lock_Context *context
)
{
+#if defined(RTEMS_DEBUG)
+ _Assert( lock->owner == _SMP_Get_current_processor() );
+ lock->owner = SMP_LOCK_NO_OWNER;
+#endif
_SMP_lock_Release_body( lock, context );
}
@@ -55,6 +64,9 @@ void _SMP_lock_ISR_disable_and_acquire(
)
{
_SMP_lock_ISR_disable_and_acquire_body( lock, context );
+#if defined(RTEMS_DEBUG)
+ lock->owner = _SMP_Get_current_processor();
+#endif
}
void _SMP_lock_Release_and_ISR_enable(
@@ -62,7 +74,18 @@ void _SMP_lock_Release_and_ISR_enable(
SMP_lock_Context *context
)
{
+#if defined(RTEMS_DEBUG)
+ _Assert( lock->owner == _SMP_Get_current_processor() );
+ lock->owner = SMP_LOCK_NO_OWNER;
+#endif
_SMP_lock_Release_and_ISR_enable_body( lock, context );
}
+#if defined(RTEMS_DEBUG)
+bool _SMP_lock_Is_owner( const SMP_lock_Control *lock )
+{
+ return lock->owner == _SMP_Get_current_processor();
+}
+#endif
+
#endif /* defined(RTEMS_SMP_LOCK_DO_NOT_INLINE) */
--
1.8.4.5
More information about the devel
mailing list