Exemplo n.º 1
0
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;
	}
}
Exemplo n.º 2
0
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;
	}
}
Exemplo n.º 3
0
Arquivo: main.c Projeto: olivo/BP
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;
}
Exemplo n.º 4
0
Arquivo: main.c Projeto: olivo/BP
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;
}