summaryrefslogtreecommitdiffstats
path: root/cpukit/score/include
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-05-09 06:49:53 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-05-12 13:20:34 +0200
commit1a9d36b921306eaef671127f281500945f287822 (patch)
tree136a5da705ae644025823f77e724c7c02c58624f /cpukit/score/include
parentscore: Fix CORE mutex initialization (diff)
downloadrtems-1a9d36b921306eaef671127f281500945f287822.tar.bz2
score: Add _ISR_lock_Is_owner()
Diffstat (limited to '')
-rw-r--r--cpukit/score/include/rtems/score/isrlock.h19
-rw-r--r--cpukit/score/include/rtems/score/percpu.h2
-rw-r--r--cpukit/score/include/rtems/score/smplock.h48
3 files changed, 66 insertions, 3 deletions
diff --git a/cpukit/score/include/rtems/score/isrlock.h b/cpukit/score/include/rtems/score/isrlock.h
index 12afd081f1..f87f5550fc 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 6b60858595..a4a8ffbb24 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 f98f38a6a3..0cefe38aa3 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 {