From: Brian Demsky Date: Tue, 31 Dec 2019 01:48:58 +0000 (-0800) Subject: Bug fixes X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=commitdiff_plain;h=7f915e454133a61fb045e04ae3933945f7bbce68;hp=197a9a14e1fb32246a70e0830eaa14353fa09052 Bug fixes --- diff --git a/execution.cc b/execution.cc index 918d2547..fb16def8 100644 --- a/execution.cc +++ b/execution.cc @@ -1732,7 +1732,6 @@ void ModelExecution::fixupLastAct(ModelAction *act) { void ModelExecution::collectActions() { //Compute minimal clock vector for all live threads ClockVector *cvmin = computeMinimalCV(); - cvmin->print(); SnapVector * queue = new SnapVector(); modelclock_t maxtofree = priv->used_sequence_numbers - params->traceminsize; @@ -1790,15 +1789,29 @@ void ModelExecution::collectActions() { islastact = !th->is_complete(); } - if (act->is_read() && act->get_reads_from()->is_free()) { - if (act->is_rmw()) { - act->set_type(ATOMIC_WRITE); - } - removeAction(act); - if (islastact) { - fixupLastAct(act); + if (act->is_read()) { + if (act->get_reads_from()->is_free()) { + if (act->is_rmw()) { + //weaken to write + act->set_type(ATOMIC_WRITE); + } else { + removeAction(act); + if (islastact) { + fixupLastAct(act); + } + delete act; + continue; + } } - delete act; + } + const ModelAction *rel_fence =act->get_last_fence_release(); + if (rel_fence != NULL) { + modelclock_t relfenceseq = rel_fence->get_seq_number(); + thread_id_t relfence_tid = rel_fence->get_tid(); + modelclock_t tid_clock = cvmin->getClock(relfence_tid); + //Remove references to irrelevant release fences + if (relfenceseq <= tid_clock) + act->set_last_fence_release(NULL); } } for (;it != NULL;) { @@ -1813,23 +1826,16 @@ void ModelExecution::collectActions() { } if (act->is_read()) { - if (act->is_rmw()) { - act->set_type(ATOMIC_WRITE); - } else if (act->get_reads_from()->is_free()) { - removeAction(act); - if (islastact) { - fixupLastAct(act); - } - delete act; - } else { - const ModelAction *rel_fence =act->get_last_fence_release(); - if (rel_fence != NULL) { - modelclock_t relfenceseq = rel_fence->get_seq_number(); - thread_id_t relfence_tid = rel_fence->get_tid(); - modelclock_t tid_clock = cvmin->getClock(relfence_tid); - //Remove references to irrelevant release fences - if (relfenceseq <= tid_clock) - act->set_last_fence_release(NULL); + if (act->get_reads_from()->is_free()) { + if (act->is_rmw()) { + act->set_type(ATOMIC_WRITE); + } else { + removeAction(act); + if (islastact) { + fixupLastAct(act); + } + delete act; + continue; } } } else if (act->is_free()) { @@ -1838,6 +1844,7 @@ void ModelExecution::collectActions() { fixupLastAct(act); } delete act; + continue; } else if (act->is_write()) { //Do nothing with write that hasn't been marked to be freed } else if (islastact) { @@ -1861,6 +1868,7 @@ void ModelExecution::collectActions() { if (actseq <= tid_clock) { removeAction(act); delete act; + continue; } } else { //need to deal with lock, annotation, wait, notify, thread create, start, join, yield, finish, nops @@ -1871,16 +1879,29 @@ void ModelExecution::collectActions() { if (lastlock != act) { removeAction(act); delete act; + continue; } } else if (act->is_create()) { if (act->get_thread_operand()->is_complete()) { removeAction(act); delete act; + continue; } } else { removeAction(act); delete act; + continue; + } + const ModelAction *rel_fence =act->get_last_fence_release(); + if (rel_fence != NULL) { + modelclock_t relfenceseq = rel_fence->get_seq_number(); + thread_id_t relfence_tid = rel_fence->get_tid(); + modelclock_t tid_clock = cvmin->getClock(relfence_tid); + //Remove references to irrelevant release fences + if (relfenceseq <= tid_clock) + act->set_last_fence_release(NULL); } + } } diff --git a/hashtable.h b/hashtable.h index 4758999a..81772a8f 100644 --- a/hashtable.h +++ b/hashtable.h @@ -182,24 +182,38 @@ public: resize(capacity << 1); struct hashlistnode<_Key, _Val> *search; + struct hashlistnode<_Key, _Val> *first = NULL; - unsigned int index = hash_function(key); + unsigned int index = hash_function(key) & capacitymask; + unsigned int oindex = index; do { - index &= capacitymask; search = &table[index]; if (!search->key) { //key is null, probably done - break; + if (!search->val) + break; + if (first == NULL) + first = search; } if (equals(search->key, key)) { search->val = val; return; } - index++; + index = (index + 1) & capacitymask; + if (index == oindex) { + if (first == NULL) + exit(-1); + break; + } } while (true); - search->key = key; - search->val = val; + if (first != NULL) { + first->key = key; + first->val = val; + } else { + search->key = key; + search->val = val; + } size++; } @@ -220,7 +234,7 @@ public: } unsigned int oindex = hash_function(key) & capacitymask; - unsigned int index=oindex; + unsigned int index = oindex; do { search = &table[index]; if (!search->key) {