+++ /dev/null
-include ../benchmarks.mk
-
-BENCH := queue
-
-NORMAL_TESTS := testcase1 testcase2 testcase3
-
-WILDCARD_TESTS := $(patsubst %, %_wildcard, $(NORMAL_TESTS))
-
-TESTS := $(NORMAL_TESTS) $(WILDCARD_TESTS)
-
-all: $(TESTS)
-
-$(BENCH).o : $(BENCH).c $(BENCH).h
- $(CC) -o $@ $< $(CFLAGS) -c $(LDFLAGS)
-
-$(BENCH)_wildcard.o : $(BENCH)_wildcard.c $(BENCH).h
- $(CC) -o $@ $< $(CFLAGS) -c $(LDFLAGS)
-
-$(WILDCARD_TESTS): %_wildcard : %.c $(BENCH)_wildcard.o
- $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
-
-$(NORMAL_TESTS): % : %.c $(BENCH).o
- $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
-
-clean:
- rm -f *.o *.d $(TESTS)
#include <stdlib.h>
#include <stdio.h>
-Deque * create_size(int size) {
- Deque * q = (Deque *) calloc(1, sizeof(Deque));
- Array * a = (Array *) calloc(1, sizeof(Array)+2*sizeof(atomic_int));
- atomic_store_explicit(&q->array, a, memory_order_relaxed);
- atomic_store_explicit(&q->top, 0, memory_order_relaxed);
- atomic_store_explicit(&q->bottom, 0, memory_order_relaxed);
- atomic_store_explicit(&a->size, size, memory_order_relaxed);
- return q;
-}
-
Deque * create() {
Deque * q = (Deque *) calloc(1, sizeof(Deque));
Array * a = (Array *) calloc(1, sizeof(Array)+2*sizeof(atomic_int));
size_t b = atomic_load_explicit(&q->bottom, memory_order_relaxed) - 1;
Array *a = (Array *) atomic_load_explicit(&q->array, memory_order_relaxed);
atomic_store_explicit(&q->bottom, b, memory_order_relaxed);
- atomic_thread_fence(memory_order_seq_cst); // sc
- size_t t = atomic_load_explicit(&q->top, memory_order_release);
+ atomic_thread_fence(memory_order_seq_cst);
+ size_t t = atomic_load_explicit(&q->top, memory_order_relaxed);
int x;
if (t <= b) {
/* Non-empty queue. */
x = atomic_load_explicit(&a->buffer[b % atomic_load_explicit(&a->size,memory_order_relaxed)], memory_order_relaxed);
if (t == b) {
/* Single last element in queue. */
- if (!atomic_compare_exchange_strong_explicit(&q->top, &t, t + 1,
- memory_order_acquire, memory_order_relaxed)) // sc
+ if (!atomic_compare_exchange_strong_explicit(&q->top, &t, t + 1, memory_order_seq_cst, memory_order_relaxed))
/* Failed race. */
x = EMPTY;
atomic_store_explicit(&q->bottom, b + 1, memory_order_relaxed);
for(i=top; i < bottom; i++) {
atomic_store_explicit(&new_a->buffer[i % new_size], atomic_load_explicit(&a->buffer[i % size], memory_order_relaxed), memory_order_relaxed);
}
- atomic_store_explicit(&q->array, new_a, memory_order_release); // release
+ atomic_store_explicit(&q->array, new_a, memory_order_release);
printf("resize\n");
}
void push(Deque *q, int x) {
size_t b = atomic_load_explicit(&q->bottom, memory_order_relaxed);
- size_t t = atomic_load_explicit(&q->top, memory_order_acquire); // acquire
+ size_t t = atomic_load_explicit(&q->top, memory_order_acquire);
Array *a = (Array *) atomic_load_explicit(&q->array, memory_order_relaxed);
if (b - t > atomic_load_explicit(&a->size, memory_order_relaxed) - 1) /* Full queue. */ {
resize(q);
a = (Array *) atomic_load_explicit(&q->array, memory_order_relaxed);
}
atomic_store_explicit(&a->buffer[b % atomic_load_explicit(&a->size, memory_order_relaxed)], x, memory_order_relaxed);
- atomic_thread_fence(memory_order_release); // release
+ atomic_thread_fence(memory_order_release);
atomic_store_explicit(&q->bottom, b + 1, memory_order_relaxed);
}
int steal(Deque *q) {
- size_t t = atomic_load_explicit(&q->top, memory_order_relaxed); // acquire
- atomic_thread_fence(memory_order_seq_cst); // sc
- size_t b = atomic_load_explicit(&q->bottom, memory_order_acquire); // acquire
+ size_t t = atomic_load_explicit(&q->top, memory_order_acquire);
+ atomic_thread_fence(memory_order_seq_cst);
+ size_t b = atomic_load_explicit(&q->bottom, memory_order_acquire);
int x = EMPTY;
if (t < b) {
/* Non-empty queue. */
- Array *a = (Array *) atomic_load_explicit(&q->array, memory_order_acquire); // acquire
+ Array *a = (Array *) atomic_load_explicit(&q->array, memory_order_acquire);
x = atomic_load_explicit(&a->buffer[t % atomic_load_explicit(&a->size, memory_order_relaxed)], memory_order_relaxed);
- if (!atomic_compare_exchange_strong_explicit(&q->top, &t, t + 1,
- memory_order_seq_cst, memory_order_relaxed)) // sc
+ if (!atomic_compare_exchange_strong_explicit(&q->top, &t, t + 1, memory_order_seq_cst, memory_order_relaxed))
/* Failed race. */
return ABORT;
}
wildcard 9 -> memory_order_acquire
wildcard 10 -> memory_order_relaxed
wildcard 11 -> memory_order_relaxed
-wildcard 12 -> memory_order_seq_cst
-wildcard 14 -> memory_order_relaxed
-wildcard 15 -> memory_order_relaxed
+wildcard 12 -> memory_order_acquire
+wildcard 14 -> memory_order_release
+wildcard 15 -> memory_order_release
wildcard 16 -> memory_order_relaxed
wildcard 17 -> memory_order_relaxed
wildcard 18 -> memory_order_relaxed
wildcard 18 -> memory_order_relaxed
wildcard 19 -> memory_order_relaxed
wildcard 20 -> memory_order_relaxed
+wildcard 21 -> memory_order_relaxed
+wildcard 22 -> memory_order_relaxed
wildcard 23 -> memory_order_relaxed
wildcard 24 -> memory_order_relaxed
wildcard 25 -> memory_order_relaxed
wildcard 36 -> memory_order_relaxed
wildcard 37 -> memory_order_relaxed
wildcard 38 -> memory_order_relaxed
-wildcard 39 -> memory_order_release
+wildcard 39 -> memory_order_seq_cst
Result 1:
wildcard 1 -> memory_order_relaxed
wildcard 6 -> memory_order_relaxed
wildcard 7 -> memory_order_relaxed
wildcard 8 -> memory_order_seq_cst
+wildcard 9 -> memory_order_acquire
+wildcard 10 -> memory_order_relaxed
+wildcard 11 -> memory_order_relaxed
+wildcard 12 -> memory_order_relaxed
+wildcard 14 -> memory_order_relaxed
+wildcard 15 -> memory_order_relaxed
+wildcard 16 -> memory_order_relaxed
+wildcard 17 -> memory_order_relaxed
+wildcard 18 -> memory_order_relaxed
+wildcard 19 -> memory_order_relaxed
+wildcard 20 -> memory_order_relaxed
+wildcard 21 -> memory_order_relaxed
+wildcard 22 -> memory_order_relaxed
+wildcard 23 -> memory_order_relaxed
+wildcard 24 -> memory_order_relaxed
+wildcard 25 -> memory_order_relaxed
+wildcard 26 -> memory_order_relaxed
+wildcard 27 -> memory_order_relaxed
+wildcard 28 -> memory_order_relaxed
+wildcard 29 -> memory_order_relaxed
+wildcard 30 -> memory_order_relaxed
+wildcard 31 -> memory_order_release
+wildcard 32 -> memory_order_relaxed
+wildcard 33 -> memory_order_relaxed
+wildcard 34 -> memory_order_seq_cst
+wildcard 35 -> memory_order_acquire
+wildcard 36 -> memory_order_relaxed
+wildcard 37 -> memory_order_relaxed
+wildcard 38 -> memory_order_relaxed
+wildcard 39 -> memory_order_seq_cst
+
+Result 2:
+wildcard 1 -> memory_order_relaxed
+wildcard 2 -> memory_order_relaxed
+wildcard 3 -> memory_order_relaxed
+wildcard 4 -> memory_order_relaxed
+wildcard 5 -> memory_order_relaxed
+wildcard 6 -> memory_order_relaxed
+wildcard 7 -> memory_order_relaxed
+wildcard 8 -> memory_order_seq_cst
wildcard 9 -> memory_order_relaxed
wildcard 10 -> memory_order_relaxed
wildcard 11 -> memory_order_relaxed
wildcard 18 -> memory_order_relaxed
wildcard 19 -> memory_order_relaxed
wildcard 20 -> memory_order_relaxed
+wildcard 21 -> memory_order_relaxed
+wildcard 22 -> memory_order_relaxed
wildcard 23 -> memory_order_relaxed
wildcard 24 -> memory_order_relaxed
wildcard 25 -> memory_order_relaxed
wildcard 36 -> memory_order_relaxed
wildcard 37 -> memory_order_relaxed
wildcard 38 -> memory_order_relaxed
-wildcard 39 -> memory_order_relaxed
+wildcard 39 -> memory_order_seq_cst
wildcard 36 -> memory_order_acquire
wildcard 37 -> memory_order_relaxed
wildcard 38 -> memory_order_acquire
-wildcard 39 -> memory_order_relaxed
+wildcard 39 -> memory_order_seq_cst
Result 1:
wildcard 1 -> memory_order_relaxed
wildcard 36 -> memory_order_acquire
wildcard 37 -> memory_order_relaxed
wildcard 38 -> memory_order_relaxed
-wildcard 39 -> memory_order_release
+wildcard 39 -> memory_order_seq_cst
Result 2:
wildcard 1 -> memory_order_relaxed
wildcard 6 -> memory_order_relaxed
wildcard 7 -> memory_order_relaxed
wildcard 8 -> memory_order_seq_cst
+wildcard 9 -> memory_order_acquire
+wildcard 10 -> memory_order_relaxed
+wildcard 11 -> memory_order_relaxed
+wildcard 12 -> memory_order_relaxed
+wildcard 14 -> memory_order_relaxed
+wildcard 15 -> memory_order_relaxed
+wildcard 16 -> memory_order_relaxed
+wildcard 17 -> memory_order_relaxed
+wildcard 18 -> memory_order_relaxed
+wildcard 19 -> memory_order_relaxed
+wildcard 20 -> memory_order_relaxed
+wildcard 21 -> memory_order_relaxed
+wildcard 22 -> memory_order_relaxed
+wildcard 23 -> memory_order_release
+wildcard 24 -> memory_order_relaxed
+wildcard 25 -> memory_order_relaxed
+wildcard 26 -> memory_order_relaxed
+wildcard 27 -> memory_order_relaxed
+wildcard 28 -> memory_order_relaxed
+wildcard 29 -> memory_order_relaxed
+wildcard 30 -> memory_order_release
+wildcard 31 -> memory_order_release
+wildcard 32 -> memory_order_relaxed
+wildcard 33 -> memory_order_relaxed
+wildcard 34 -> memory_order_seq_cst
+wildcard 35 -> memory_order_acquire
+wildcard 36 -> memory_order_acquire
+wildcard 37 -> memory_order_relaxed
+wildcard 38 -> memory_order_acquire
+wildcard 39 -> memory_order_seq_cst
+
+Result 3:
+wildcard 1 -> memory_order_relaxed
+wildcard 2 -> memory_order_relaxed
+wildcard 3 -> memory_order_relaxed
+wildcard 4 -> memory_order_relaxed
+wildcard 5 -> memory_order_relaxed
+wildcard 6 -> memory_order_relaxed
+wildcard 7 -> memory_order_relaxed
+wildcard 8 -> memory_order_seq_cst
+wildcard 9 -> memory_order_acquire
+wildcard 10 -> memory_order_relaxed
+wildcard 11 -> memory_order_relaxed
+wildcard 12 -> memory_order_relaxed
+wildcard 14 -> memory_order_relaxed
+wildcard 15 -> memory_order_relaxed
+wildcard 16 -> memory_order_relaxed
+wildcard 17 -> memory_order_relaxed
+wildcard 18 -> memory_order_relaxed
+wildcard 19 -> memory_order_relaxed
+wildcard 20 -> memory_order_relaxed
+wildcard 21 -> memory_order_relaxed
+wildcard 22 -> memory_order_relaxed
+wildcard 23 -> memory_order_release
+wildcard 24 -> memory_order_relaxed
+wildcard 25 -> memory_order_acquire
+wildcard 26 -> memory_order_relaxed
+wildcard 27 -> memory_order_relaxed
+wildcard 28 -> memory_order_relaxed
+wildcard 29 -> memory_order_relaxed
+wildcard 30 -> memory_order_relaxed
+wildcard 31 -> memory_order_release
+wildcard 32 -> memory_order_relaxed
+wildcard 33 -> memory_order_relaxed
+wildcard 34 -> memory_order_seq_cst
+wildcard 35 -> memory_order_acquire
+wildcard 36 -> memory_order_acquire
+wildcard 37 -> memory_order_relaxed
+wildcard 38 -> memory_order_relaxed
+wildcard 39 -> memory_order_seq_cst
+
+Result 4:
+wildcard 1 -> memory_order_relaxed
+wildcard 2 -> memory_order_relaxed
+wildcard 3 -> memory_order_relaxed
+wildcard 4 -> memory_order_relaxed
+wildcard 5 -> memory_order_relaxed
+wildcard 6 -> memory_order_relaxed
+wildcard 7 -> memory_order_relaxed
+wildcard 8 -> memory_order_seq_cst
wildcard 9 -> memory_order_relaxed
wildcard 10 -> memory_order_relaxed
wildcard 11 -> memory_order_relaxed
wildcard 36 -> memory_order_acquire
wildcard 37 -> memory_order_relaxed
wildcard 38 -> memory_order_acquire
-wildcard 39 -> memory_order_release
+wildcard 39 -> memory_order_seq_cst
-Result 3:
+Result 5:
wildcard 1 -> memory_order_relaxed
wildcard 2 -> memory_order_relaxed
wildcard 3 -> memory_order_relaxed
wildcard 36 -> memory_order_acquire
wildcard 37 -> memory_order_relaxed
wildcard 38 -> memory_order_relaxed
-wildcard 39 -> memory_order_release
+wildcard 39 -> memory_order_seq_cst
atomic_int x[2];
/**
- Synchronization between plain push and steal
+ Synchronization between plain push and steal (making w31 release and w35
+ acquire)
*/
static void task(void * param) {
int b;
int c;
+/** Making CAS in steal() (w39) SC */
+
static void task(void * param) {
- a=steal(q);
- printf("steal a=%d\n", a);
+ b=steal(q);
+ //c=steal(q);
}
int user_main(int argc, char **argv)
{
thrd_t t1, t2;
q=create();
+
push(q, 1);
+ push(q, 2);
+ push(q, 3);
thrd_create(&t1, task, 0);
- //thrd_create(&t2, task, 0);
- //push(q, 2);
- //push(q, 4);
- b=take(q);
- printf("take b=%d\n", b);
+ thrd_create(&t2, task, 0);
+ a=take(q);
//c=take(q);
thrd_join(t1);
- //thrd_join(t2);
+ thrd_join(t2);
/*
bool correct=true;
int b;
int c;
+/** Making either w7 release or w9 acquire, the previously nos-SCness in the SC
+ * analysis */
+
static void task(void * param) {
b=steal(q);
}
thrd_t t1, t2;
q=create();
+ thrd_create(&t1, task, 0);
push(q, 1);
push(q, 2);
- thrd_create(&t1, task, 0);
push(q, 3);
//thrd_create(&t2, task, 0);
//a=take(q);
int b;
int c;
-static void task(void * param) {
+/** Making w14 release */
+
+static void task1(void * param) {
+ b=steal(q);
+ //c=steal(q);
+}
+
+static void task2(void * param) {
b=steal(q);
//c=steal(q);
}
q=create();
push(q, 1);
- thrd_create(&t1, task, 0);
- //thrd_create(&t2, task, 0);
- push(q, 2);
- push(q, 3);
+ thrd_create(&t1, task1, 0);
+ thrd_create(&t2, task2, 0);
a=take(q);
+ push(q, 2);
c=take(q);
+ //push(q, 2);
+ //push(q, 3);
thrd_join(t1);
- //thrd_join(t2);
+ thrd_join(t2);
/*
bool correct=true;
int c;
static void task(void * param) {
- b=steal(q);
- //c=steal(q);
+ a=steal(q);
+ printf("steal a=%d\n", a);
}
int user_main(int argc, char **argv)
{
thrd_t t1, t2;
q=create();
-
push(q, 1);
- push(q, 2);
- push(q, 3);
thrd_create(&t1, task, 0);
- thrd_create(&t2, task, 0);
- a=take(q);
+ //thrd_create(&t2, task, 0);
+ //push(q, 2);
+ //push(q, 4);
+ b=take(q);
+ printf("take b=%d\n", b);
//c=take(q);
thrd_join(t1);
- thrd_join(t2);
+ //thrd_join(t2);
/*
bool correct=true;
q=create();
push(q, 1);
- push(q, 2);
+ //push(q, 2);
//push(q, 3);
thrd_create(&t1, task, 0);
thrd_create(&t2, task, 0);
- thrd_create(&t3, task, 0);
+ //thrd_create(&t3, task, 0);
a=take(q);
//c=take(q);
thrd_join(t1);
thrd_join(t2);
- thrd_join(t3);
+ //thrd_join(t3);
/*
bool correct=true;
int b;
int c;
-static void task1(void * param) {
- b=steal(q);
- //c=steal(q);
-}
-
-static void task2(void * param) {
+static void task(void * param) {
b=steal(q);
//c=steal(q);
}
q=create();
push(q, 1);
- thrd_create(&t1, task1, 0);
- thrd_create(&t2, task2, 0);
- a=take(q);
push(q, 2);
+ push(q, 3);
+ thrd_create(&t1, task, 0);
+ //thrd_create(&t2, task, 0);
+ a=take(q);
c=take(q);
- //push(q, 2);
- //push(q, 3);
thrd_join(t1);
- thrd_join(t2);
+ //thrd_join(t2);
/*
bool correct=true;