X-Git-Url: http://plrg.eecs.uci.edu/git/?p=model-checker-benchmarks.git;a=blobdiff_plain;f=ms-queue%2Fmain.c;h=c09470de2b22f3760d4b3e2fcb2ee3c3b3e0b195;hp=30d9da9c79a01080ebfa7de156d04cfa98a99c47;hb=7fd7e04652df0491d9ebf56da6a179e9b9ee2f05;hpb=509ce2ac5c3372c0527e4b66d1088bcdd7b94cdf diff --git a/ms-queue/main.c b/ms-queue/main.c index 30d9da9..c09470d 100644 --- a/ms-queue/main.c +++ b/ms-queue/main.c @@ -1,54 +1,84 @@ -#include "main.h" #include +#include +#include -unsigned procs = 2; -unsigned iterations = 1; -private_t private; -shared_mem_t *smp; +#include "my_queue.h" +#include "model-assert.h" + +static int procs = 2; +static queue_t *queue; +static thrd_t *threads; +static unsigned int *input; +static unsigned int *output; +static int num_threads; + +int get_thread_num() +{ + thrd_t curr = thrd_current(); + int i; + for (i = 0; i < num_threads; i++) + if (curr.priv == threads[i].priv) + return i; + MODEL_ASSERT(0); + return -1; +} static void main_task(void *param) { - unsigned i, j; - unsigned val; + unsigned int val; int pid = *((int *)param); - init_memory(); - init_private(pid); - for (i = 0; i < iterations; i++) { - val = private.value; - enqueue(val); - val = dequeue(); - private.value++; + if (!pid) { + input[0] = 17; + enqueue(queue, input[0]); + output[0] = dequeue(queue); + } else { + input[1] = 37; + enqueue(queue, input[1]); + output[1] = dequeue(queue); } } int user_main(int argc, char **argv) { - int i, num_threads; - thrd_t *t; + int i; int *param; + unsigned int in_sum = 0, out_sum = 0; + int zero = 0; - parse_args(argc, argv); - iterations = (iterations + (procs >> 1)) / procs; - - smp = (shared_mem_t *)calloc(1, sizeof(shared_mem_t)); - assert(smp); + queue = calloc(1, sizeof(*queue)); + MODEL_ASSERT(queue); num_threads = procs; - t = malloc(num_threads * sizeof(thrd_t)); + threads = malloc(num_threads * sizeof(thrd_t)); param = malloc(num_threads * sizeof(*param)); + input = calloc(num_threads, sizeof(*input)); + output = calloc(num_threads, sizeof(*output)); - init_queue(); + init_queue(queue, num_threads); for (i = 0; i < num_threads; i++) { param[i] = i; - thrd_create(&t[i], main_task, ¶m[i]); + thrd_create(&threads[i], main_task, ¶m[i]); } for (i = 0; i < num_threads; i++) - thrd_join(t[i]); + thrd_join(threads[i]); + + for (i = 0; i < num_threads; i++) { + in_sum += input[i]; + out_sum += output[i]; + } + for (i = 0; i < num_threads; i++) + printf("input[%d] = %u\n", i, input[i]); + for (i = 0; i < num_threads; i++) { + if (output[i] == 0) + zero = 1; /* A zero result means queue was empty */ + printf("output[%d] = %u\n", i, output[i]); + } + MODEL_ASSERT(in_sum == out_sum || zero); free(param); - free(t); - free(smp); + free(threads); + free(queue); return 0; }