|  | #include "test.h" | 
|  |  | 
|  | enum { | 
|  | NUMTHREADS = 100 | 
|  | }; | 
|  |  | 
|  | static int washere = 0; | 
|  |  | 
|  | void * func(void * arg) | 
|  | { | 
|  | washere = 1; | 
|  | return arg; | 
|  | } | 
|  |  | 
|  | int | 
|  | main() | 
|  | { | 
|  | pthread_t t, last_t; | 
|  | void *tp, *last_tp; | 
|  | pthread_attr_t attr; | 
|  | void * result = NULL; | 
|  | int i; | 
|  |  | 
|  | assert(pthread_attr_init(&attr) == 0);; | 
|  | assert(pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE) == 0); | 
|  |  | 
|  | washere = 0; | 
|  | assert(pthread_create(&t, &attr, func, NULL) == 0); | 
|  | assert(pthread_join(t, &result) == 0);; | 
|  | assert(result == NULL); | 
|  | assert(washere == 1); | 
|  | last_t = t; | 
|  | last_tp = __pth_gpointer_locked (t); | 
|  |  | 
|  | for (i = 1; i < NUMTHREADS; i++) | 
|  | { | 
|  | washere = 0; | 
|  | assert(pthread_create(&t, &attr, func, (void *) (intptr_t) i) == 0); | 
|  | pthread_join(t, &result); | 
|  | assert((intptr_t) result == (intptr_t) i); | 
|  | assert(washere == 1); | 
|  | /* thread IDs should be unique */ | 
|  | assert(!pthread_equal(t, last_t)); | 
|  | /* thread struct pointers should be the same */ | 
|  | tp = __pth_gpointer_locked(t); | 
|  | assert(tp == last_tp); | 
|  | last_t = t; | 
|  | last_tp = tp; | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } |