From: Peizhao Ou Date: Thu, 15 Jan 2015 01:59:45 +0000 (-0800) Subject: add one testcase of ms-queue X-Git-Url: http://plrg.eecs.uci.edu/git/?p=cdsspec-compiler.git;a=commitdiff_plain;h=f1302c29ac6ffd01367ca618e6c05b2051da7716 add one testcase of ms-queue --- diff --git a/benchmark/ms-queue/testcase.c b/benchmark/ms-queue/testcase.c new file mode 100644 index 0000000..c896d7e --- /dev/null +++ b/benchmark/ms-queue/testcase.c @@ -0,0 +1,99 @@ +#include +#include +#include + +#include "my_queue.h" +#include "model-assert.h" + +static int procs = 3; +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; +} + +/** Be careful, we must make these variables to be global so that they will be + * 'available' when the execution is generated */ +bool succ1, succ2; +unsigned int output1, output2; + +static void main_task(void *param) +{ + int pid = *((int *)param); + if (pid % 3 == 0) { + output1 = 1; + bool succ1 = dequeue(queue, &output1); + if (succ1) + printf("Thrd 2: Dequeue %d.\n", output1); + else + printf("Thrd 2: Dequeue NULL.\n"); + } else if (pid % 3 == 1) { + output2 = 2; + bool succ2 = dequeue(queue, &output2); + if (succ2) + printf("Thrd 3: Dequeue %d.\n", output2); + else + printf("Thrd 3: Dequeue NULL.\n"); + } else if (pid %3 == 2) { + int input = 47; + enqueue(queue, input); + printf("Thrd 4 Enqueue %d.\n", input); + } +} + +int user_main(int argc, char **argv) +{ + /** + @Begin + @Entry_point + @End + */ + int i; + int *param; + unsigned int in_sum = 0, out_sum = 0; + + queue = calloc(1, sizeof(*queue)); + //MODEL_ASSERT(queue); + + num_threads = procs; + 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(queue, num_threads); + for (i = 0; i < num_threads; i++) { + param[i] = i; + thrd_create(&threads[i], main_task, ¶m[i]); + } + for (i = 0; i < num_threads; 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++) + printf("output[%d] = %u\n", i, output[i]); + //MODEL_ASSERT(in_sum == out_sum); + */ + + free(param); + free(threads); + free(queue); + + return 0; +}