#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; }