/* Trivial test case of __exchange_and_add() from gcc stdlibc's atomicity.h */ #ifdef __i386__ /* red hat */ //#include /* debian */ #include #endif #ifdef powerpc #include #endif #include #include #include #include #define NTHREADS 8 #define NLOOPS 100000 #define NREPEATS 100 int g_tail; unsigned char g_buf[NTHREADS * NLOOPS]; #define UNINITIALIZED_VAL ((sizeof(g_buf[0])<<8)-1) void fail(int line) { printf("FAIL in line %d\n", line); exit(1); } #define FAIL() fail(__LINE__) /* Add NLOOPS to g_tail */ void *add_num(void* arg) { int i; char me = (int) arg; for (i=0; i UNINITIALIZED_VAL) FAIL(); for (repeat=0; repeat < NREPEATS; repeat++) { pthread_t thread[NTHREADS]; int i; int curthread; memset(g_buf, UNINITIALIZED_VAL, sizeof(g_buf)); g_tail = 0; for (i=0; i=0; i--) { if (g_buf[i] == UNINITIALIZED_VAL) FAIL(); if (g_buf[i] != curthread) { curthread = g_buf[i]; switches++; } } } printf("%d context switches in %d seconds\n", switches, time(0)-t0); printf("PASS\n"); return 0; }