diff options
author | Jennifer Averett <Jennifer.Averett@OARcorp.com> | 2011-10-17 18:51:44 +0000 |
---|---|---|
committer | Jennifer Averett <Jennifer.Averett@OARcorp.com> | 2011-10-17 18:51:44 +0000 |
commit | 35453000cca96c44e0dcd6f5cd128d7f2bc9911e (patch) | |
tree | 50b7d5e5211458735832885e3324a20b36472c02 /cpukit/score/src | |
parent | 2011-10-17 Sebastian Huber <sebastian.huber@embedded-brains.de> (diff) | |
download | rtems-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/src')
-rw-r--r-- | cpukit/score/src/smplock.c | 7 |
1 files changed, 5 insertions, 2 deletions
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; |