forked from Imagelibrary/rtems
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.
This commit is contained in:
@@ -1,3 +1,10 @@
|
|||||||
|
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.
|
||||||
|
|
||||||
2011-10-17 Sebastian Huber <sebastian.huber@embedded-brains.de>
|
2011-10-17 Sebastian Huber <sebastian.huber@embedded-brains.de>
|
||||||
|
|
||||||
PR 1938/cpukit
|
PR 1938/cpukit
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ typedef uint32_t SMP_lock_spinlock_simple_Control;
|
|||||||
* times.
|
* times.
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
SMP_lock_spinlock_simple_Control lock;
|
||||||
uint32_t count;
|
uint32_t count;
|
||||||
int cpu_id;
|
int cpu_id;
|
||||||
} SMP_lock_spinlock_nested_Control;
|
} SMP_lock_spinlock_nested_Control;
|
||||||
|
|||||||
@@ -114,6 +114,7 @@ void _SMP_lock_spinlock_nested_Initialize(
|
|||||||
SMP_lock_spinlock_nested_Control *lock
|
SMP_lock_spinlock_nested_Control *lock
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
lock->lock = 0;
|
||||||
lock->count = 0;
|
lock->count = 0;
|
||||||
lock->cpu_id = -1;
|
lock->cpu_id = -1;
|
||||||
}
|
}
|
||||||
@@ -143,8 +144,9 @@ void _SMP_lock_spinlock_nested_Release(
|
|||||||
if (lock->count == 1) {
|
if (lock->count == 1) {
|
||||||
lock->cpu_id = -1;
|
lock->cpu_id = -1;
|
||||||
debug_logit( 'U', lock );
|
debug_logit( 'U', lock );
|
||||||
RTEMS_COMPILER_MEMORY_BARRIER();
|
|
||||||
lock->count = 0;
|
lock->count = 0;
|
||||||
|
RTEMS_COMPILER_MEMORY_BARRIER();
|
||||||
|
lock->lock = 0;
|
||||||
} else {
|
} else {
|
||||||
debug_logit( 'u', lock );
|
debug_logit( 'u', lock );
|
||||||
lock->count--;
|
lock->count--;
|
||||||
@@ -174,7 +176,7 @@ ISR_Level _SMP_lock_spinlock_nested_Obtain(
|
|||||||
*/
|
*/
|
||||||
while (1) {
|
while (1) {
|
||||||
RTEMS_COMPILER_MEMORY_BARRIER();
|
RTEMS_COMPILER_MEMORY_BARRIER();
|
||||||
SMP_CPU_SWAP( &lock->count, value, previous );
|
SMP_CPU_SWAP( &lock->lock, value, previous );
|
||||||
RTEMS_COMPILER_MEMORY_BARRIER();
|
RTEMS_COMPILER_MEMORY_BARRIER();
|
||||||
if ( previous == 0 ) {
|
if ( previous == 0 ) {
|
||||||
/* was not locked */
|
/* was not locked */
|
||||||
@@ -190,6 +192,7 @@ ISR_Level _SMP_lock_spinlock_nested_Obtain(
|
|||||||
}
|
}
|
||||||
|
|
||||||
lock->cpu_id = cpu_id;
|
lock->cpu_id = cpu_id;
|
||||||
|
lock->count = 1;
|
||||||
debug_logit( 'L', lock );
|
debug_logit( 'L', lock );
|
||||||
|
|
||||||
return level;
|
return level;
|
||||||
|
|||||||
Reference in New Issue
Block a user