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