From ec27b9c8303540de6b5a8ebefee114f3cdd436f0 Mon Sep 17 00:00:00 2001 From: rpj Date: Thu, 5 Jul 2001 15:19:22 +0000 Subject: * barrier.c: Remove static initialisation - irrelevent for this object. * pthread.h (PTHREAD_BARRIER_INITIALIZER): Removed. * rwlock.c (pthread_rwlock_wrlock): This routine is not a cancelation point - disable deferred cancelation around call to pthread_cond_wait(). tests/ChangeLog: * spin1.c: New; testing spinlocks. * spin2.c: New; testing spinlocks. * spin3.c: New; testing spinlocks. * spin4.c: New; testing spinlocks. * barrier1.c: New; testing barriers. * barrier2.c: New; testing barriers. * barrier3.c: New; testing barriers. * barrier4.c: New; testing barriers. * GNUmakefile: Add new tests. * Makefile: Add new tests. --- tests/spin4.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 tests/spin4.c (limited to 'tests/spin4.c') diff --git a/tests/spin4.c b/tests/spin4.c new file mode 100644 index 0000000..a435d04 --- /dev/null +++ b/tests/spin4.c @@ -0,0 +1,65 @@ +/* + * spin4.c + * + * Declare a spinlock object, lock it, spin on it, + * and then unlock it again. + * + * For this to work on a single processor machine we have + * to static initialise the spinlock. This bypasses the + * check of the number of processors done by pthread_spin_init. + * This is a non-portable side-effect of this implementation. + */ + +#include "test.h" +#include + +pthread_spinlock_t lock = PTHREADS_SPINLOCK_INITIALIZER; +struct _timeb currSysTimeStart; +struct _timeb currSysTimeStop; + +#define GetDurationMilliSecs(_TStart, _TStop) ((_TStop.time*1000+_TStop.millitm) \ + - (_TStart.time*1000+_TStart.millitm)) + +static int washere = 0; + +void * func(void * arg) +{ + _ftime(&currSysTimeStart); + assert(pthread_spin_lock(&lock) == 0); + assert(pthread_spin_unlock(&lock) == 0); + _ftime(&currSysTimeStop); + washere = 1; + + return (void *) GetDurationMilliSecs(currSysTimeStart, currSysTimeStop); +} + +int +main() +{ + long result = 0; + pthread_t t; + + assert(pthread_spin_lock(&lock) == 0); + + assert(pthread_create(&t, NULL, func, NULL) == 0); + + /* + * This should relinqish the CPU to the func thread enough times + * to waste approximately 2000 millisecs only if the lock really + * is spinning in the func thread (assuming 10 millisec CPU quantum). + for (i = 0; i < 200; i++) + { + sched_yield(); + } + + assert(pthread_spin_unlock(&lock) == 0); + + assert(pthread_join(t, (void *) &result) == 0); + assert(result > 1000); + + assert(pthread_spin_destroy(&lock) == 0); + + assert(washere == 1); + + return 0; +} -- cgit v1.2.3