forked from Imagelibrary/rtems
@@ -31,8 +31,7 @@ static int _POSIX_Spinlock_Return_codes[CORE_SPINLOCK_STATUS_LAST + 1] = {
|
||||
EPERM, /* CORE_SPINLOCK_NOT_HOLDER */
|
||||
-1, /* CORE_SPINLOCK_TIMEOUT */
|
||||
EBUSY, /* CORE_SPINLOCK_IS_BUSY */
|
||||
EBUSY, /* CORE_SPINLOCK_UNAVAILABLE */
|
||||
0 /* CORE_SPINLOCK_NOT_LOCKED */
|
||||
EBUSY /* CORE_SPINLOCK_UNAVAILABLE */
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -56,15 +56,11 @@ typedef enum {
|
||||
/** This status indicates that the spinlock is currently locked and thus
|
||||
* unavailable.
|
||||
*/
|
||||
CORE_SPINLOCK_UNAVAILABLE,
|
||||
/** This status indicates that the spinlock is not currently locked and thus
|
||||
* should not be released.
|
||||
*/
|
||||
CORE_SPINLOCK_NOT_LOCKED
|
||||
CORE_SPINLOCK_UNAVAILABLE
|
||||
} CORE_spinlock_Status;
|
||||
|
||||
/** This is a shorthand for the last status code. */
|
||||
#define CORE_SPINLOCK_STATUS_LAST CORE_SPINLOCK_NOT_LOCKED
|
||||
#define CORE_SPINLOCK_STATUS_LAST CORE_SPINLOCK_UNAVAILABLE
|
||||
|
||||
/** This indicates the lock is available. */
|
||||
#define CORE_SPINLOCK_UNLOCKED 0
|
||||
|
||||
@@ -31,18 +31,13 @@ CORE_spinlock_Status _CORE_spinlock_Release(
|
||||
|
||||
_ISR_Disable( level );
|
||||
|
||||
/*
|
||||
* It must locked before it can be unlocked.
|
||||
*/
|
||||
if ( the_spinlock->lock == CORE_SPINLOCK_UNLOCKED ) {
|
||||
_ISR_Enable( level );
|
||||
return CORE_SPINLOCK_NOT_LOCKED;
|
||||
}
|
||||
|
||||
/*
|
||||
* It must locked by the current thread before it can be unlocked.
|
||||
*/
|
||||
if ( the_spinlock->holder != _Thread_Executing->Object.id ) {
|
||||
if (
|
||||
the_spinlock->lock != CORE_SPINLOCK_LOCKED
|
||||
|| the_spinlock->holder != _Thread_Executing
|
||||
) {
|
||||
_ISR_Enable( level );
|
||||
return CORE_SPINLOCK_NOT_HOLDER;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
*** POSIX SPINLOCK TEST 01 ***
|
||||
*** BEGIN OF TEST PSXSPIN 1 ***
|
||||
pthread_spin_init( NULL, PTHREAD_PROCESS_PRIVATE ) -- EINVAL
|
||||
pthread_spin_init( NULL, PTHREAD_PROCESS_SHARED ) -- EINVAL
|
||||
pthread_spin_init( &spinlock, 0x1234 ) -- EINVAL
|
||||
@@ -14,7 +14,7 @@ pthread_spin_lock( &spinlock ) -- EINVAL
|
||||
pthread_spin_trylock( &spinlock ) -- EINVAL
|
||||
pthread_spin_unlock( &spinlock ) -- EINVAL
|
||||
pthread_spin_destroy( &spinlock ) -- EINVAL
|
||||
pthread_spin_unlock( &Spinlock ) -- already unlocked OK
|
||||
pthread_spin_unlock( &Spinlock ) -- EPERM
|
||||
pthread_spin_lock( &Spinlock ) -- OK
|
||||
pthread_spin_lock( &Spinlock ) -- EDEADLK
|
||||
pthread_spin_trylock( &Spinlock ) -- EDEADLK
|
||||
@@ -23,9 +23,10 @@ pthread_spin_trylock( &Spinlock ) -- OK
|
||||
pthread_spin_unlock( &Spinlock ) -- OK
|
||||
pthread_spin_lock( &Spinlock ) from Thread -- OK
|
||||
sleep to allow main thread to run
|
||||
pthread_spin_unlock( &Spinlock ) -- EPERM
|
||||
pthread_spin_lock( &Spinlock ) -- OK
|
||||
pthread_spin_unlock( &Spinlock ) from Thread -- OK
|
||||
pthread_spin_destroy( &Spinlock ) -- EBUSY
|
||||
pthread_spin_unlock( &Spinlock ) -- OK
|
||||
pthread_spin_destroy( &Spinlock ) -- OK
|
||||
*** END OF POSIX SPINLOCK TEST 01 ***
|
||||
*** END OF TEST PSXSPIN 1 ***
|
||||
|
||||
@@ -146,9 +146,9 @@ int main(
|
||||
status = pthread_spin_destroy( &spinlock );
|
||||
rtems_test_assert( status == EINVAL );
|
||||
|
||||
puts( "pthread_spin_unlock( &Spinlock ) -- already unlocked OK" );
|
||||
puts( "pthread_spin_unlock( &Spinlock ) -- EPERM" );
|
||||
status = pthread_spin_unlock( &Spinlock );
|
||||
rtems_test_assert( status == 0 );
|
||||
rtems_test_assert( status == EPERM );
|
||||
|
||||
/* Now some basic locking and unlocking with a deadlock verification */
|
||||
puts( "pthread_spin_lock( &Spinlock ) -- OK" );
|
||||
@@ -200,6 +200,11 @@ int main(
|
||||
*/
|
||||
|
||||
mainThreadSpinning = 1;
|
||||
|
||||
puts( "pthread_spin_unlock( &Spinlock ) -- EPERM" );
|
||||
status = pthread_spin_unlock( &Spinlock );
|
||||
rtems_test_assert( status == EPERM );
|
||||
|
||||
puts( "pthread_spin_lock( &Spinlock ) -- OK" );
|
||||
status = pthread_spin_lock( &Spinlock );
|
||||
rtems_test_assert( status == 0 );
|
||||
|
||||
Reference in New Issue
Block a user