X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=blobdiff_plain;f=cmodelint.cc;h=ea34324b7a21a2742113268470c6b878b5f03b84;hp=fdac33aa1324d5735cd96f09ab2b712a9a53119f;hb=25b12680719a51fc81d1681a280e076920dcaabc;hpb=7594d7ae8eda38fbb5a3ac3d6f33fffbb365b7bd diff --git a/cmodelint.cc b/cmodelint.cc index fdac33aa..ea34324b 100644 --- a/cmodelint.cc +++ b/cmodelint.cc @@ -10,7 +10,7 @@ #include "threads-model.h" #include "datarace.h" -memory_order orders[8] = { +memory_order orders[7] = { memory_order_relaxed, memory_order_consume, memory_order_acquire, memory_order_release, memory_order_acq_rel, memory_order_seq_cst, }; @@ -113,7 +113,7 @@ VOLATILELOAD(64) *((volatile uint ## size ## _t *)obj) = val; \ thread_id_t tid = thread_current()->get_id(); \ for(int i=0;i < size / 8;i++) { \ - recordWrite(tid, (void *)(((char *)obj)+i)); \ + atomraceCheckWrite(tid, (void *)(((char *)obj)+i)); \ } \ } @@ -130,7 +130,7 @@ VOLATILESTORE(64) *((volatile uint ## size ## _t *)obj) = val; \ thread_id_t tid = thread_current()->get_id(); \ for(int i=0;i < size / 8;i++) { \ - recordWrite(tid, (void *)(((char *)obj)+i)); \ + atomraceCheckWrite(tid, (void *)(((char *)obj)+i)); \ } \ } @@ -143,8 +143,13 @@ CDSATOMICINT(64) #define CDSATOMICLOAD(size) \ uint ## size ## _t cds_atomic_load ## size(void * obj, int atomic_index, const char * position) { \ ensureModel(); \ - return (uint ## size ## _t)model->switch_to_master( \ + uint ## size ## _t val = (uint ## size ## _t)model->switch_to_master( \ new ModelAction(ATOMIC_READ, position, orders[atomic_index], obj)); \ + thread_id_t tid = thread_current()->get_id(); \ + for(int i=0;i < size / 8;i++) { \ + atomraceCheckRead(tid, (void *)(((char *)obj)+i)); \ + } \ + return val; \ } CDSATOMICLOAD(8) @@ -160,7 +165,7 @@ CDSATOMICLOAD(64) *((volatile uint ## size ## _t *)obj) = val; \ thread_id_t tid = thread_current()->get_id(); \ for(int i=0;i < size / 8;i++) { \ - recordWrite(tid, (void *)(((char *)obj)+i)); \ + atomraceCheckWrite(tid, (void *)(((char *)obj)+i)); \ } \ } @@ -180,9 +185,10 @@ CDSATOMICSTORE(64) *((volatile uint ## size ## _t *)addr) = _copy; \ thread_id_t tid = thread_current()->get_id(); \ for(int i=0;i < size / 8;i++) { \ + atomraceCheckRead(tid, (void *)(((char *)addr)+i)); \ recordWrite(tid, (void *)(((char *)addr)+i)); \ } \ - return _old; \ + return _old; \ }) // cds atomic exchange @@ -349,6 +355,7 @@ void cds_func_entry(const char * funcName) { ModelVector * func_map_rev = history->getFuncMapRev(); if ( func_map_rev->size() <= func_id ) func_map_rev->resize( func_id + 1 ); + func_map_rev->at(func_id) = funcName; } else { func_id = history->getFuncMap()->get(funcName); @@ -359,16 +366,18 @@ void cds_func_entry(const char * funcName) { void cds_func_exit(const char * funcName) { ensureModel(); + Thread * th = thread_current(); uint32_t func_id; ModelHistory *history = model->get_history(); func_id = history->getFuncMap()->get(funcName); - - /* func_id not found; this could happen in the case where a function calls cds_func_entry - * when the model has been defined yet, but then an atomic inside the function initializes - * the model. And then cds_func_exit is called upon the function exiting. - */ +/* + * func_id not found; this could happen in the case where a function calls cds_func_entry + * when the model has been defined yet, but then an atomic inside the function initializes + * the model. And then cds_func_exit is called upon the function exiting. + * + */ if (func_id == 0) return;