inline unsigned inc() { unsigned inc_v = 0; __VERIFIER_atomic_acquire(); if(value == 0u-1) { __VERIFIER_atomic_release(); return 0; }else{ inc_v = value; inc_flag = 1, value = inc_v + 1; /*set flag, then update*/ __VERIFIER_atomic_release(); atomic_assert(dec_flag || value > inc_v); return inc_v + 1; } }
inline unsigned dec() { unsigned dec_v; __VERIFIER_atomic_acquire(); if(value == 0) { __VERIFIER_atomic_release(); return 0u-1; /*decrement failed, return max*/ }else{ dec_v = value; dec_flag = 1, value = dec_v - 1; /*set flag, then update*/ __VERIFIER_atomic_release(); atomic_assert(inc_flag || value < dec_v); return dec_v - 1; } }
inline unsigned dec() { unsigned dec__v, dec__vn, dec__casret; do { dec__v = value; if(dec__v == 0) { bassume(dec__v == 0); return 0u-1; /*decrement failed, return max*/ }else{ bassume(!(dec__v == 0)); } dec__vn = dec__v - 1; CAS(value,dec__v,dec__vn,dec__casret,dec_flag); } while (dec__casret==0); bassume(!(dec__casret==0)); atomic_assert(inc_flag || value < dec__v); return dec__vn; }
inline unsigned inc() { unsigned inc__v, inc__vn, inc__casret; do { inc__v = value; if(inc__v == 0u-1) { bassume(inc__v == 0u-1); return 0; /*increment failed, return min*/ }else{ bassume(!(inc__v == 0u-1)); } inc__vn = inc__v + 1; CAS(value,inc__v,inc__vn,inc__casret,inc_flag); } while (inc__casret==0); bassume(!(inc__casret==0)); atomic_assert(dec_flag || value > inc__v); return inc__vn; }