From f2d6efad8b1ee05ef5dd12175af9e59e61c7b8f8 Mon Sep 17 00:00:00 2001 From: Peizhao Ou Date: Thu, 31 Oct 2013 18:01:28 -0700 Subject: [PATCH] fixed bugs --- benchmark/ms-queue/my_queue.h | 6 +- grammer/spec.txt | 190 ------------------ grammer/spec_compiler.jj | 40 ++-- .../codeGenerator/CodeGenerator.java | 33 ++- .../codeGenerator/CodeVariables.java | 69 +++++-- .../codeGenerator/Environment.java | 1 + .../SequentialDefineSubConstruct.java | 10 +- .../specExtraction/SourceFileInfo.java | 27 +++ .../specExtraction/SpecExtractor.java | 1 + 9 files changed, 130 insertions(+), 247 deletions(-) diff --git a/benchmark/ms-queue/my_queue.h b/benchmark/ms-queue/my_queue.h index 3a344d6..4161b33 100644 --- a/benchmark/ms-queue/my_queue.h +++ b/benchmark/ms-queue/my_queue.h @@ -30,7 +30,7 @@ void init_queue(queue_t *q, int num_threads); /** @Begin @Global_define: - @DeclareVar: + @DeclareStruct: typedef struct tag_elem { Tag id; unsigned int data; @@ -40,7 +40,7 @@ void init_queue(queue_t *q, int num_threads); data = _data; } } tag_elem_t; - + @DeclareVar: spec_queue queue; Tag tag; @InitVar: @@ -64,7 +64,6 @@ void init_queue(queue_t *q, int num_threads); @Action: # __ID__ is an internal macro that refers to the id of the current # interface call - @Code: __sequential.queue.enqueue(tag_elem_t(__ID__, val)); @End */ @@ -76,7 +75,6 @@ void enqueue(queue_t *q, unsigned int val); @Commit_point_set: Dequeue_Success_Point @ID: __sequential.queue.peak().tag @Action: - @Code: unsigned int _Old_Val = __sequential.queue.dequeue().data; @Post_check: _Old_Val == __RET__ diff --git a/grammer/spec.txt b/grammer/spec.txt index 634a051..ed30de8 100644 --- a/grammer/spec.txt +++ b/grammer/spec.txt @@ -1,191 +1 @@ -#include -#include -#include "librace.h" -#include "model-assert.h" - -#include "my_queue.h" - -#define relaxed memory_order_relaxed -#define release memory_order_release -#define acquire memory_order_acquire - -#define MAX_FREELIST 4 /* Each thread can own up to MAX_FREELIST free nodes */ -#define INITIAL_FREE 2 /* Each thread starts with INITIAL_FREE free nodes */ - -#define POISON_IDX 0x666 - -static unsigned int (*free_lists)[MAX_FREELIST]; - -/* Search this thread's free list for a "new" node */ -static unsigned int new_node() -{ - int i; - int t = get_thread_num(); - for (i = 0; i < MAX_FREELIST; i++) { - unsigned int node = load_32(&free_lists[t][i]); - if (node) { - store_32(&free_lists[t][i], 0); - return node; - } - } - /* free_list is empty? */ - MODEL_ASSERT(0); - return 0; -} - -/* Place this node index back on this thread's free list */ -static void reclaim(unsigned int node) -{ - int i; - int t = get_thread_num(); - - /* Don't reclaim NULL node */ - MODEL_ASSERT(node); - - for (i = 0; i < MAX_FREELIST; i++) { - /* Should never race with our own thread here */ - unsigned int idx = load_32(&free_lists[t][i]); - - /* Found empty spot in free list */ - if (idx == 0) { - store_32(&free_lists[t][i], node); - return; - } - } - /* free list is full? */ - MODEL_ASSERT(0); -} - -void init_queue(queue_t *q, int num_threads) -{ - /** - @Begin - @Entry_point - @End - */ - - int i, j; - - /* Initialize each thread's free list with INITIAL_FREE pointers */ - /* The actual nodes are initialized with poison indexes */ - free_lists = malloc(num_threads * sizeof(*free_lists)); - for (i = 0; i < num_threads; i++) { - for (j = 0; j < INITIAL_FREE; j++) { - free_lists[i][j] = 2 + i * MAX_FREELIST + j; - atomic_init(&q->nodes[free_lists[i][j]].next, MAKE_POINTER(POISON_IDX, 0)); - } - } - - /* initialize queue */ - atomic_init(&q->head, MAKE_POINTER(1, 0)); - atomic_init(&q->tail, MAKE_POINTER(1, 0)); - atomic_init(&q->nodes[1].next, MAKE_POINTER(0, 0)); -} - -/** - @Begin - @Interface_define: Enqueue - @End -*/ void enqueue(queue_t *q, unsigned int val) -{ - int success = 0; - unsigned int node; - pointer tail; - pointer next; - pointer tmp; - - node = new_node(); - store_32(&q->nodes[node].value, val); - tmp = atomic_load_explicit(&q->nodes[node].next, relaxed); - set_ptr(&tmp, 0); // NULL - atomic_store_explicit(&q->nodes[node].next, tmp, relaxed); - - while (!success) { - tail = atomic_load_explicit(&q->tail, acquire); - next = atomic_load_explicit(&q->nodes[get_ptr(tail)].next, acquire); - if (tail == atomic_load_explicit(&q->tail, relaxed)) { - - /* Check for uninitialized 'next' */ - MODEL_ASSERT(get_ptr(next) != POISON_IDX); - - if (get_ptr(next) == 0) { // == NULL - pointer value = MAKE_POINTER(node, get_count(next) + 1); - success = atomic_compare_exchange_strong_explicit(&q->nodes[get_ptr(tail)].next, - &next, value, release, release); - } - if (!success) { - unsigned int ptr = get_ptr(atomic_load_explicit(&q->nodes[get_ptr(tail)].next, acquire)); - pointer value = MAKE_POINTER(ptr, - get_count(tail) + 1); - int commit_success = 0; - commit_success = atomic_compare_exchange_strong_explicit(&q->tail, - &tail, value, release, release); - /** - @Begin - @Commit_point_define_check: __ATOMIC_RET__ == true - @Label: Enqueue_Success_Point - @End - */ - thrd_yield(); - } - } - } - atomic_compare_exchange_strong_explicit(&q->tail, - &tail, - MAKE_POINTER(node, get_count(tail) + 1), - release, release); -} - - -/** - @Begin - @Interface_define: Dequeue - @End -*/ -unsigned int dequeue(queue_t *q) -{ - unsigned int value; - int success = 0; - pointer head; - pointer tail; - pointer next; - - while (!success) { - head = atomic_load_explicit(&q->head, acquire); - tail = atomic_load_explicit(&q->tail, relaxed); - next = atomic_load_explicit(&q->nodes[get_ptr(head)].next, acquire); - if (atomic_load_explicit(&q->head, relaxed) == head) { - if (get_ptr(head) == get_ptr(tail)) { - - /* Check for uninitialized 'next' */ - MODEL_ASSERT(get_ptr(next) != POISON_IDX); - - if (get_ptr(next) == 0) { // NULL - return 0; // NULL - } - atomic_compare_exchange_strong_explicit(&q->tail, - &tail, - MAKE_POINTER(get_ptr(next), get_count(tail) + 1), - release, release); - thrd_yield(); - } else { - value = load_32(&q->nodes[get_ptr(next)].value); - success = atomic_compare_exchange_strong_explicit(&q->head, - &head, - MAKE_POINTER(get_ptr(next), get_count(head) + 1), - release, release); - /** - @Begin - @Commit_point_define_check: __ATOMIC_RET__ == true - @Label: Dequeue_Success_Point - @End - */ - if (!success) - thrd_yield(); - } - } - } - reclaim(get_ptr(head)); - return value; -} diff --git a/grammer/spec_compiler.jj b/grammer/spec_compiler.jj index 22fada8..93a5d8b 100644 --- a/grammer/spec_compiler.jj +++ b/grammer/spec_compiler.jj @@ -16,6 +16,7 @@ # entry point. LANG = C; @Global_define: + @DeclareStruct: @DeclareVar: @InitVar: @DefineFunc: @@ -124,7 +125,7 @@ import edu.uci.eecs.specCompiler.specExtraction.VariableDeclaration; File f = new File("./grammer/spec.txt"); FileInputStream fis = new FileInputStream(f); SpecParser parser = new SpecParser(fis); - + /* ArrayList content = new ArrayList(); ArrayList constructs = new ArrayList(); ArrayList headers = new ArrayList(); @@ -136,8 +137,9 @@ import edu.uci.eecs.specCompiler.specExtraction.VariableDeclaration; for (int i = 0; i < constructs.size(); i++) { System.out.println(constructs.get(i)); } + */ - //parser.Test(); + parser.Test(); System.out.println("Parsing finished!"); } catch (FileNotFoundException e) { e.printStackTrace(); @@ -241,6 +243,8 @@ SKIP : { | +| + | | @@ -301,6 +305,8 @@ SKIP : { | +| + | | @@ -459,7 +465,7 @@ String Type() : ("const" { type = "const"; } )? - (((str = .image | str = .image) { type = type + " " + str; })? + (((str = .image | str = .image | str = .image) { type = type + " " + str; })? ( name = ParseQualifiedName() { if (!type.equals("")) @@ -508,6 +514,8 @@ void Test() : { System.out.println(func); } + + } String ParameterizedName() : @@ -629,9 +637,12 @@ ArrayList C_CPP_CODE(ArrayList headers) : ( LOOKAHEAD(2) ( - t = | t = | t = | + t = | t = | t = | t = | (t =