#include #include #include #include #include static void NoPause(void *ud) { (void)ud; } typedef int dint; typedef const char* LOCK; void (*pauseCB)(void *) = NoPause; static void LockSiData( LOCK **shared, LOCK *ptr ) { while ( *shared != ptr ) { if ( !(*shared) ) *shared = ptr; pauseCB( ptr ); } } static dint FreeSiData( LOCK **shared, LOCK *ud ) { if ( *shared == ud ) { *shared = NULL; return 0; } return EPERM; } static LOCK *l = 0; static volatile int var = 0; static void *thread(void *arg) { int i; while (1) { LockSiData(&l, arg); i = var++; if (i != 0) { printf("var = %d, expected 0\n", i); exit(1); } i = var--; if (i != 1) { printf("var = %d, expected 1\n", i); exit(1); } FreeSiData(&l, arg); } return 0; } int main(void) { pthread_t pt; uintptr_t i; for (i = 1; i <= 2; i++) { if ((errno = pthread_create(&pt, 0, thread, (void *)i)) != 0) { printf("pthread_create failed: %m\n"); return 1; } } pthread_exit(0); return 0; }