inline void findMax(int offset){ int i; int e; int my_max = 0x80000000; int c; int cret; for(i = offset; i < offset+WORKPERTHREAD; i++) { e = storage[i]; if(e > my_max) { my_max = e; } assert_nl(e <= my_max); } while(1){ c = max; if(my_max > c){ __VERIFIER_atomic_CAS(&max,c,my_max,&cret); if(cret){ break; } }else{ break; } } assert(my_max <= max); }
inline void push(int d) { int oldTop, newTop,ret; __VERIFIER_atomic_index_malloc(&newTop); if(newTop == 0) exit(-1); INDIR(newTop,0) = d; while (1) { oldTop = top; INDIR(newTop,1) = oldTop; __VERIFIER_atomic_CAS(&top,oldTop,newTop,&ret); if(ret) return; } }
inline int push(int d) { int oldTop = -1, newTop = -1, casret = -1; newTop = index_malloc(); if(newTop == 0){ return 0; }else{ INDIR(newTop,0) = d; while (1) { oldTop = top; INDIR(newTop,1) = oldTop; __VERIFIER_atomic_CAS(&top,oldTop,newTop,&casret); if(casret==1){ return 1; } } } }
unsigned dec() { unsigned dec__v, dec__vn, dec__casret; { dec__v = value; if(dec__v == 0) { return 0u-1; /*decrement failed, return max*/ } dec__vn = dec__v - 1; __VERIFIER_atomic_CAS(&value,dec__v,dec__vn,&dec__casret,&dec_flag); } __CPROVER_assume(! (dec__casret==0)); X__VERIFIER_atomic_assert2(dec__v); return dec__vn; }
inline int PseudoRandomUsingAtomic_nextInt(int n) { int read, nexts, casret, nextInt_return; while(1) { read = seed; nexts = calculateNext(read); assert(nexts != read); __VERIFIER_atomic_CAS(&seed,read,nexts,&casret); if(casret == 1){ nextInt_return = nexts % n; //assume(nexts < n); //nextInt_return = nexts; break; } } return nextInt_return; }
unsigned inc() { unsigned inc__v, inc__vn, inc__casret; { inc__v = value; if(inc__v == 0u-1) { return 0; /*increment failed, return min*/ } inc__vn = inc__v + 1; __VERIFIER_atomic_CAS(&value,inc__v,inc__vn,&inc__casret,&inc_flag); } __CPROVER_assume(! (inc__casret==0)); X__VERIFIER_atomic_assert1(inc__v); return inc__vn; }
inline unsigned dec() { unsigned dec__v, dec__vn, dec__casret; do { dec__v = value; if(dec__v == 0) { return 0u-1; /*decrement failed, return max*/ } dec__vn = dec__v - 1; __VERIFIER_atomic_CAS(&value,dec__v,dec__vn,&dec__casret,&dec_flag); } while (dec__casret==0); __VERIFIER_atomic_assert2(dec__v); return dec__vn; }
inline unsigned inc() { unsigned inc__v, inc__vn, inc__casret; do { inc__v = value; if(inc__v == 0u-1) { return 0; /*increment failed, return min*/ } inc__vn = inc__v + 1; __VERIFIER_atomic_CAS(&value,inc__v,inc__vn,&inc__casret,&inc_flag); } while (inc__casret==0); __VERIFIER_atomic_assert1(inc__v); return inc__vn; }
void* thr1(void* arg) { unsigned v,vn,casret; /* reachable */ do { /* reachable */ v = value; if(v == 0u-1) { return 0; } vn = v + 1; __VERIFIER_atomic_CAS(&value,v,vn,&casret); } while (casret==0); /* assert not proved */ assert(value > v); return 0; /* reachable */ }
inline void findMax(int offset){ int i; int e; int c; int cret; for(i = offset; i < offset+WORKPERTHREAD; i++) { e = storage[i]; while(1){ c = max; if(e > c){ __VERIFIER_atomic_CAS(&max,c,e,&cret); if(cret){ break; } }else{ break; } } assert(e <= max); } }