X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=ms-queue%2Fmain.c;h=210c57a1e208518c6dca9558d0c9d9357e88ca19;hb=037b00400699b8bd88b250d6d5b053a85edb2a61;hp=30d9da9c79a01080ebfa7de156d04cfa98a99c47;hpb=509ce2ac5c3372c0527e4b66d1088bcdd7b94cdf;p=model-checker-benchmarks.git diff --git a/ms-queue/main.c b/ms-queue/main.c index 30d9da9..210c57a 100644 --- a/ms-queue/main.c +++ b/ms-queue/main.c @@ -1,54 +1,87 @@ -#include "main.h" #include +#include +#include +#include -unsigned procs = 2; -unsigned iterations = 1; -private_t private; -shared_mem_t *smp; +#include "my_queue.h" + +static int procs = 2; +static int iterations = 1; +static queue_t *queue; +static thrd_t *threads; +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; + assert(0); + return -1; +} + +static void parse_args(int argc, char **argv) +{ + extern char *optarg; + int c; + + while ((c = getopt(argc, argv, "i:p:")) != EOF) { + switch (c) { + case 'i': + iterations = atoi(optarg); + break; + case 'p': + procs = atoi(optarg); + break; + default: + assert(0); + } + } +} static void main_task(void *param) { - unsigned i, j; - unsigned val; + unsigned int i, j; + 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++; + val = 1 + pid * iterations + i; + printf("worker %d, enqueueing: %u\n", pid, val); + enqueue(queue, val); + + val = dequeue(queue); + printf("worker %d, dequeued: %u\n", pid, val); } } int user_main(int argc, char **argv) { - int i, num_threads; - thrd_t *t; + int i; int *param; 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)); + 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)); - 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]); free(param); - free(t); - free(smp); + free(threads); + free(queue); return 0; }