forked from Imagelibrary/rtems
@@ -31,8 +31,7 @@ static int _POSIX_Spinlock_Return_codes[CORE_SPINLOCK_STATUS_LAST + 1] = {
|
|||||||
EPERM, /* CORE_SPINLOCK_NOT_HOLDER */
|
EPERM, /* CORE_SPINLOCK_NOT_HOLDER */
|
||||||
-1, /* CORE_SPINLOCK_TIMEOUT */
|
-1, /* CORE_SPINLOCK_TIMEOUT */
|
||||||
EBUSY, /* CORE_SPINLOCK_IS_BUSY */
|
EBUSY, /* CORE_SPINLOCK_IS_BUSY */
|
||||||
EBUSY, /* CORE_SPINLOCK_UNAVAILABLE */
|
EBUSY /* CORE_SPINLOCK_UNAVAILABLE */
|
||||||
0 /* CORE_SPINLOCK_NOT_LOCKED */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -56,15 +56,11 @@ typedef enum {
|
|||||||
/** This status indicates that the spinlock is currently locked and thus
|
/** This status indicates that the spinlock is currently locked and thus
|
||||||
* unavailable.
|
* unavailable.
|
||||||
*/
|
*/
|
||||||
CORE_SPINLOCK_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_Status;
|
} CORE_spinlock_Status;
|
||||||
|
|
||||||
/** This is a shorthand for the last status code. */
|
/** 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. */
|
/** This indicates the lock is available. */
|
||||||
#define CORE_SPINLOCK_UNLOCKED 0
|
#define CORE_SPINLOCK_UNLOCKED 0
|
||||||
|
|||||||
@@ -31,18 +31,13 @@ CORE_spinlock_Status _CORE_spinlock_Release(
|
|||||||
|
|
||||||
_ISR_Disable( level );
|
_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.
|
* 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 );
|
_ISR_Enable( level );
|
||||||
return CORE_SPINLOCK_NOT_HOLDER;
|
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_PRIVATE ) -- EINVAL
|
||||||
pthread_spin_init( NULL, PTHREAD_PROCESS_SHARED ) -- EINVAL
|
pthread_spin_init( NULL, PTHREAD_PROCESS_SHARED ) -- EINVAL
|
||||||
pthread_spin_init( &spinlock, 0x1234 ) -- EINVAL
|
pthread_spin_init( &spinlock, 0x1234 ) -- EINVAL
|
||||||
@@ -14,7 +14,7 @@ pthread_spin_lock( &spinlock ) -- EINVAL
|
|||||||
pthread_spin_trylock( &spinlock ) -- EINVAL
|
pthread_spin_trylock( &spinlock ) -- EINVAL
|
||||||
pthread_spin_unlock( &spinlock ) -- EINVAL
|
pthread_spin_unlock( &spinlock ) -- EINVAL
|
||||||
pthread_spin_destroy( &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 ) -- OK
|
||||||
pthread_spin_lock( &Spinlock ) -- EDEADLK
|
pthread_spin_lock( &Spinlock ) -- EDEADLK
|
||||||
pthread_spin_trylock( &Spinlock ) -- EDEADLK
|
pthread_spin_trylock( &Spinlock ) -- EDEADLK
|
||||||
@@ -23,9 +23,10 @@ pthread_spin_trylock( &Spinlock ) -- OK
|
|||||||
pthread_spin_unlock( &Spinlock ) -- OK
|
pthread_spin_unlock( &Spinlock ) -- OK
|
||||||
pthread_spin_lock( &Spinlock ) from Thread -- OK
|
pthread_spin_lock( &Spinlock ) from Thread -- OK
|
||||||
sleep to allow main thread to run
|
sleep to allow main thread to run
|
||||||
|
pthread_spin_unlock( &Spinlock ) -- EPERM
|
||||||
pthread_spin_lock( &Spinlock ) -- OK
|
pthread_spin_lock( &Spinlock ) -- OK
|
||||||
pthread_spin_unlock( &Spinlock ) from Thread -- OK
|
pthread_spin_unlock( &Spinlock ) from Thread -- OK
|
||||||
pthread_spin_destroy( &Spinlock ) -- EBUSY
|
pthread_spin_destroy( &Spinlock ) -- EBUSY
|
||||||
pthread_spin_unlock( &Spinlock ) -- OK
|
pthread_spin_unlock( &Spinlock ) -- OK
|
||||||
pthread_spin_destroy( &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 );
|
status = pthread_spin_destroy( &spinlock );
|
||||||
rtems_test_assert( status == EINVAL );
|
rtems_test_assert( status == EINVAL );
|
||||||
|
|
||||||
puts( "pthread_spin_unlock( &Spinlock ) -- already unlocked OK" );
|
puts( "pthread_spin_unlock( &Spinlock ) -- EPERM" );
|
||||||
status = pthread_spin_unlock( &Spinlock );
|
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 */
|
/* Now some basic locking and unlocking with a deadlock verification */
|
||||||
puts( "pthread_spin_lock( &Spinlock ) -- OK" );
|
puts( "pthread_spin_lock( &Spinlock ) -- OK" );
|
||||||
@@ -200,6 +200,11 @@ int main(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
mainThreadSpinning = 1;
|
mainThreadSpinning = 1;
|
||||||
|
|
||||||
|
puts( "pthread_spin_unlock( &Spinlock ) -- EPERM" );
|
||||||
|
status = pthread_spin_unlock( &Spinlock );
|
||||||
|
rtems_test_assert( status == EPERM );
|
||||||
|
|
||||||
puts( "pthread_spin_lock( &Spinlock ) -- OK" );
|
puts( "pthread_spin_lock( &Spinlock ) -- OK" );
|
||||||
status = pthread_spin_lock( &Spinlock );
|
status = pthread_spin_lock( &Spinlock );
|
||||||
rtems_test_assert( status == 0 );
|
rtems_test_assert( status == 0 );
|
||||||
|
|||||||
Reference in New Issue
Block a user