From: bdemsky Date: Fri, 21 Jun 2019 18:34:49 +0000 (-0700) Subject: fix CAS operation X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=827e70acafdfd05e339e6d17fd43594c398fe200;hp=83d2c33c508986e2435d7a4bf0266c6bf234304e;p=c11tester.git fix CAS operation --- diff --git a/cmodelint.cc b/cmodelint.cc index 9e4923b9..348051a0 100644 --- a/cmodelint.cc +++ b/cmodelint.cc @@ -59,7 +59,7 @@ void model_fence_action(memory_order ord) { } /* --- helper functions --- */ -uint64_t model_rmwrcas_action_helper(void *obj, int atomic_index, const char *position) { +uint64_t model_rmwrcas_action_helper(void *obj, int atomic_index, uint64_t oldval, int size, const char *position) { return model->switch_to_master( new ModelAction(ATOMIC_RMWRCAS, position, orders[atomic_index], obj) ); @@ -252,7 +252,7 @@ uint64_t cds_atomic_fetch_xor64(void* addr, uint64_t val, int atomic_index, cons ({ \ uint ## size ## _t _desired = desired; \ uint ## size ## _t _expected = expected; \ - uint ## size ## _t _old = model_rmwrcas_action_helper(addr, atomic_index, position); \ + uint ## size ## _t _old = model_rmwrcas_action_helper(addr, atomic_index, _expected, sizeof(_expected), position); \ if (_old == _expected) { \ model_rmw_action_helper(addr, (uint64_t) _desired, atomic_index, position); return _expected; } \ else { \ diff --git a/execution.cc b/execution.cc index 7b09871e..d75499f1 100644 --- a/execution.cc +++ b/execution.cc @@ -339,6 +339,8 @@ bool ModelExecution::process_mutex(ModelAction *curr) } case ATOMIC_WAIT: case ATOMIC_UNLOCK: { + //TODO: FIX WAIT SITUATION...WAITS CAN SPURIOUSLY FAIL...TIMED WAITS SHOULD PROBABLY JUST BE THE SAME AS NORMAL WAITS...THINK ABOUT PROBABILITIES THOUGH....AS IN TIMED WAIT MUST FAIL TO GUARANTEE PROGRESS...NORMAL WAIT MAY FAIL...SO NEED NORMAL WAIT TO WORK CORRECTLY IN THE CASE IT SPURIOUSLY FAILS AND IN THE CASE IT DOESN'T... TIMED WAITS MUST EVENMTUALLY RELEASE... + /* wake up the other threads */ for (unsigned int i = 0;i < get_num_threads();i++) { Thread *t = get_thread(int_to_id(i)); diff --git a/include/cmodelint.h b/include/cmodelint.h index d6cd8f9b..8530827c 100644 --- a/include/cmodelint.h +++ b/include/cmodelint.h @@ -22,7 +22,7 @@ void model_rmwc_action(void *obj, memory_order ord); void model_fence_action(memory_order ord); uint64_t model_rmwr_action_helper(void *obj, int atomic_index, const char *position); -uint64_t model_rmwrcas_action_helper(void *obj, int atomic_index, const char *position); + uint64_t model_rmwrcas_action_helper(void *obj, int atomic_index, uint64_t oval, int size, const char *position); void model_rmw_action_helper(void *obj, uint64_t val, int atomic_index, const char *position); void model_rmwc_action_helper(void *obj, int atomic_index, const char *position); // void model_fence_action_helper(int atomic_index);