aboutsummaryrefslogtreecommitdiff
path: root/pthreads/tests/cancel2.c
diff options
context:
space:
mode:
Diffstat (limited to 'pthreads/tests/cancel2.c')
-rw-r--r--pthreads/tests/cancel2.c59
1 files changed, 20 insertions, 39 deletions
diff --git a/pthreads/tests/cancel2.c b/pthreads/tests/cancel2.c
index 2ee596abb..941061369 100644
--- a/pthreads/tests/cancel2.c
+++ b/pthreads/tests/cancel2.c
@@ -6,10 +6,11 @@
*
* Pthreads-win32 - POSIX Threads Library for Win32
* Copyright(C) 1998 John E. Bossom
- * Copyright(C) 1999,2005 Pthreads-win32 contributors
- *
- * Contact Email: rpj@callisto.canberra.edu.au
- *
+ * Copyright(C) 1999,2012 Pthreads-win32 contributors
+ *
+ * Homepage1: http://sourceware.org/pthreads-win32/
+ * Homepage2: http://sourceforge.net/projects/pthreads4w/
+ *
* The current list of contributors is contained
* in the file CONTRIBUTORS included with the source
* code distribution. The list can also be seen at the
@@ -95,7 +96,7 @@ struct bag_t_ {
static bag_t threadbag[NUMTHREADS + 1];
-static pthread_mutex_t waitLock = PTHREAD_MUTEX_INITIALIZER;
+static pthread_barrier_t go = NULL;
void *
mythread(void * arg)
@@ -110,18 +111,8 @@ mythread(void * arg)
/* Set to known state and type */
assert(pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL) == 0);
-
- switch (bag->threadnum % 2)
- {
- case 0:
- assert(pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL) == 0);
- result = 0;
- break;
- case 1:
- assert(pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL) == 0);
- result = 1;
- break;
- }
+ assert(pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL) == 0);
+ result = 1;
#if !defined(__cplusplus)
__try
@@ -130,14 +121,10 @@ mythread(void * arg)
#endif
{
/* Wait for go from main */
- assert(pthread_mutex_lock(&waitLock) == 0);
- assert(pthread_mutex_unlock(&waitLock) == 0);
- sched_yield();
+ pthread_barrier_wait(&go);
+ pthread_barrier_wait(&go);
- for (;;)
- {
- pthread_testcancel();
- }
+ pthread_testcancel();
}
#if !defined(__cplusplus)
__except(EXCEPTION_EXECUTE_HANDLER)
@@ -160,7 +147,7 @@ mythread(void * arg)
*/
result += 1000;
- return (void *) (size_t)result;
+ return (void *)(size_t)result;
}
int
@@ -171,7 +158,7 @@ main()
pthread_t t[NUMTHREADS + 1];
assert((t[0] = pthread_self()).p != NULL);
- assert(pthread_mutex_lock(&waitLock) == 0);
+ assert(pthread_barrier_init(&go, NULL, NUMTHREADS + 1) == 0);
for (i = 1; i <= NUMTHREADS; i++)
{
@@ -181,23 +168,17 @@ main()
}
/*
- * Code to control or munipulate child threads should probably go here.
+ * Code to control or manipulate child threads should probably go here.
*/
- Sleep(500);
- assert(pthread_mutex_unlock(&waitLock) == 0);
-
- Sleep(500);
+ pthread_barrier_wait(&go);
for (i = 1; i <= NUMTHREADS; i++)
{
assert(pthread_cancel(t[i]) == 0);
}
- /*
- * Give threads time to run.
- */
- Sleep(NUMTHREADS * 100);
+ pthread_barrier_wait(&go);
/*
* Standard check that all threads started.
@@ -223,19 +204,19 @@ main()
void* result = (void*)0;
assert(pthread_join(t[i], &result) == 0);
- fail = ((int)(size_t)result != (int) PTHREAD_CANCELED);
+ fail = (result != PTHREAD_CANCELED);
if (fail)
{
- fprintf(stderr, "Thread %d: started %d: location %d: cancel type %s\n",
+ fprintf(stderr, "Thread %d: started %d: location %d\n",
i,
threadbag[i].started,
- (int)(size_t)result,
- (((int)(size_t)result % 2) == 0) ? "ASYNCHRONOUS" : "DEFERRED");
+ (int)(size_t)result);
}
failed |= fail;
}
assert(!failed);
+ assert(pthread_barrier_destroy(&go) == 0);
/*
* Success.