extern void abort(void); void assume_abort_if_not(int cond) { if(!cond) {abort();} } extern void abort(void); #include void reach_error() { assert(0); } extern void __VERIFIER_atomic_begin(void); extern void __VERIFIER_atomic_end(void); //http://www.ibm.com/developerworks/java/library/j-jtp04186/index.html //A counter using locks #include #define assume(e) assume_abort_if_not(e) #undef assert #define assert(e) { if(!(e)) { ERROR: {reach_error();abort();}(void)0; } } volatile unsigned value, m = 0; void __VERIFIER_atomic_acquire() { assume(m==0); m = 1; } void __VERIFIER_atomic_release() { assume(m==1); m = 0; } void * thr1(void* arg) { unsigned v = 0; __VERIFIER_atomic_acquire(); if(value == 0u-1) { __VERIFIER_atomic_release(); return 0; }else{ v = value; value = v + 1; __VERIFIER_atomic_release(); __VERIFIER_atomic_begin(); assert(value > v); __VERIFIER_atomic_end(); return 0; } } int main(){ pthread_t t; while(1) { pthread_create(&t, 0, thr1, 0); } }