1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <pthread.h> 4 #include <assert.h> 5 6 int lock; 7 int val; 8 int noassert; 9 int badlock; 10 11 pthread_mutex_t mylock = PTHREAD_MUTEX_INITIALIZER; 12 13 void *lockthread(void *arg) 14 { 15 #ifdef FORCE_FAILURE 16 if (__sync_and_and_fetch(&lock, 0)) 17 noassert = 1; 18 #elif defined(PTHREAD_MUTEX) 19 if (pthread_mutex_lock(&mylock)) 20 abort(); 21 #else 22 if (__sync_fetch_and_add(&lock, 1)) 23 noassert = 1; 24 #endif 25 if (val) 26 badlock++; 27 val = 1; 28 val = 0; 29 #ifdef FORCE_FAILURE 30 (void)__sync_and_and_fetch(&lock, 0); 31 #elif defined(PTHREAD_MUTEX) 32 if (pthread_mutex_unlock(&mylock)) 33 abort(); 34 #else 35 (void)__sync_fetch_and_sub(&lock, 1); 36 #endif 37 } 38 39 int main(int argc, char *argv[]) 40 { 41 pthread_t t1; 42 pthread_t t2; 43 44 if (pthread_create(&t1, NULL, lockthread, NULL)) 45 abort(); 46 if (pthread_create(&t2, NULL, lockthread, NULL)) 47 abort(); 48 if (pthread_join(t1, NULL)) 49 abort(); 50 if (pthread_join(t2, NULL)) 51 abort(); 52 assert(noassert || !badlock); 53 }