From: Brian Norris Date: Wed, 6 Mar 2013 01:37:28 +0000 (-0800) Subject: ms-queue: remove more externs and unintended shared data X-Git-Tag: oopsla2013-final~34 X-Git-Url: http://plrg.eecs.uci.edu/git/?p=model-checker-benchmarks.git;a=commitdiff_plain;h=6bfec4a14ed32227ccd38e85e111221d89c10d58 ms-queue: remove more externs and unintended shared data --- diff --git a/ms-queue/main.c b/ms-queue/main.c index fefb386..8813e37 100644 --- a/ms-queue/main.c +++ b/ms-queue/main.c @@ -7,8 +7,20 @@ static int procs = 2; static int iterations = 1; -private_t private; 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) { @@ -35,7 +47,6 @@ static void main_task(void *param) unsigned val; int pid = *((int *)param); - init_private(pid); for (i = 0; i < iterations; i++) { val = 1 + pid * iterations + i; enqueue(queue, val); @@ -46,8 +57,7 @@ static void main_task(void *param) int user_main(int argc, char **argv) { - int i, num_threads; - thrd_t *t; + int i; int *param; parse_args(argc, argv); @@ -57,19 +67,19 @@ int user_main(int argc, char **argv) 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(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(threads); free(queue); return 0; diff --git a/ms-queue/my_queue.c b/ms-queue/my_queue.c index eb5d54a..9ffb343 100644 --- a/ms-queue/my_queue.c +++ b/ms-queue/my_queue.c @@ -1,31 +1,31 @@ #include +#include #include "my_queue.h" -extern private_t private; - -void init_private(int pid) -{ - private.node = 2 + pid; -} +static unsigned int *node_nums; static unsigned int new_node() { - return private.node; + return node_nums[get_thread_num()]; } static void reclaim(unsigned int node) { - private.node = node; + node_nums[get_thread_num()] = node; } -void init_queue(queue_t *q) +void init_queue(queue_t *q, int num_threads) { unsigned int i; pointer head; pointer tail; pointer next; + node_nums = malloc(num_threads * sizeof(*node_nums)); + for (i = 0; i < num_threads; i++) + node_nums[i] = 2 + i; + /* initialize queue */ head = MAKE_POINTER(1, 0); tail = MAKE_POINTER(1, 0); diff --git a/ms-queue/my_queue.h b/ms-queue/my_queue.h index 4ce05b4..5877a68 100644 --- a/ms-queue/my_queue.h +++ b/ms-queue/my_queue.h @@ -19,17 +19,13 @@ typedef struct node { pointer_t next; } node_t; -typedef struct private { - unsigned int node; -} private_t; - -typedef struct shared_mem { +typedef struct { pointer_t head; pointer_t tail; node_t nodes[MAX_NODES + 1]; } queue_t; -void init_private(int pid); -void init_queue(queue_t *q); +void init_queue(queue_t *q, int num_threads); void enqueue(queue_t *q, unsigned int val); unsigned int dequeue(queue_t *q); +int get_thread_num();