summaryrefslogtreecommitdiffstats
path: root/cpukit/score
diff options
context:
space:
mode:
authorJennifer Averett <Jennifer.Averett@OARcorp.com>2011-10-17 18:51:44 +0000
committerJennifer Averett <Jennifer.Averett@OARcorp.com>2011-10-17 18:51:44 +0000
commit35453000cca96c44e0dcd6f5cd128d7f2bc9911e (patch)
tree50b7d5e5211458735832885e3324a20b36472c02 /cpukit/score
parent2011-10-17 Sebastian Huber <sebastian.huber@embedded-brains.de> (diff)
downloadrtems-35453000cca96c44e0dcd6f5cd128d7f2bc9911e.tar.bz2
2011-10-17 Daniel Hellstrom <daniel@gaisler.com>
PR 1935/cpukit * score/include/rtems/score/smplock.h, score/src/smplock.c: SMP nested count variable was being overritten when nested lock was taken more than once.
Diffstat (limited to 'cpukit/score')
-rw-r--r--cpukit/score/include/rtems/score/smplock.h1
-rw-r--r--cpukit/score/src/smplock.c7
2 files changed, 6 insertions, 2 deletions
diff --git a/cpukit/score/include/rtems/score/smplock.h b/cpukit/score/include/rtems/score/smplock.h
index df20599a34..a604d7bfe0 100644
--- a/cpukit/score/include/rtems/score/smplock.h
+++ b/cpukit/score/include/rtems/score/smplock.h
@@ -50,6 +50,7 @@ typedef uint32_t SMP_lock_spinlock_simple_Control;
* times.
*/
typedef struct {
+ SMP_lock_spinlock_simple_Control lock;
uint32_t count;
int cpu_id;
} SMP_lock_spinlock_nested_Control;
diff --git a/cpukit/score/src/smplock.c b/cpukit/score/src/smplock.c
index 6a737f2c40..1e84ffc192 100644
--- a/cpukit/score/src/smplock.c
+++ b/cpukit/score/src/smplock.c
@@ -114,6 +114,7 @@ void _SMP_lock_spinlock_nested_Initialize(
SMP_lock_spinlock_nested_Control *lock
)
{
+ lock->lock = 0;
lock->count = 0;
lock->cpu_id = -1;
}
@@ -143,8 +144,9 @@ void _SMP_lock_spinlock_nested_Release(
if (lock->count == 1) {
lock->cpu_id = -1;
debug_logit( 'U', lock );
- RTEMS_COMPILER_MEMORY_BARRIER();
lock->count = 0;
+ RTEMS_COMPILER_MEMORY_BARRIER();
+ lock->lock = 0;
} else {
debug_logit( 'u', lock );
lock->count--;
@@ -174,7 +176,7 @@ ISR_Level _SMP_lock_spinlock_nested_Obtain(
*/
while (1) {
RTEMS_COMPILER_MEMORY_BARRIER();
- SMP_CPU_SWAP( &lock->count, value, previous );
+ SMP_CPU_SWAP( &lock->lock, value, previous );
RTEMS_COMPILER_MEMORY_BARRIER();
if ( previous == 0 ) {
/* was not locked */
@@ -190,6 +192,7 @@ ISR_Level _SMP_lock_spinlock_nested_Obtain(
}
lock->cpu_id = cpu_id;
+ lock->count = 1;
debug_logit( 'L', lock );
return level;