add a new class 'ModelHistory'
[c11tester.git] / cmodelint.cc
index 3dbb437b9914e42b0f045dda81b31af223aa2620..5be511c86f0574b5a707a9ddabaa9e90156348eb 100644 (file)
@@ -1,6 +1,10 @@
 #include <stdio.h>
+#include <string>
+
 #include "model.h"
+#include "execution.h"
 #include "action.h"
+#include "history.h"
 #include "cmodelint.h"
 #include "threads-model.h"
 
@@ -61,7 +65,7 @@ void model_fence_action(memory_order ord) {
 /* ---  helper functions --- */
 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)
+               new ModelAction(ATOMIC_RMWRCAS, position, orders[atomic_index], obj, oldval, size)
                );
 }
 
@@ -360,11 +364,32 @@ void cds_atomic_thread_fence(int atomic_index, const char * position) {
  */
 
 void cds_func_entry(const char * funcName) {
+       if (!model) return;
+
         Thread * th = thread_current();
-        printf("thread %d Enter function %s\n", th->get_id(), funcName);
+       uint32_t func_id;
+
+       ModelHistory *history = model->get_history();
+       if ( !history->getFuncMap()->contains(funcName) ) {
+               func_id = history->get_func_counter();
+               history->incr_func_counter();
+
+               history->getFuncMap()->put(funcName, func_id);
+       } else {
+               func_id = history->getFuncMap()->get(funcName);
+       }
+
+       history->enter_function(func_id, th->get_id());
 }
 
 void cds_func_exit(const char * funcName) {
+       if (!model) return;
+
         Thread * th = thread_current();
-        printf("thread %d Exit from function %s\n", th->get_id(), funcName);
+       uint32_t func_id;
+
+       ModelHistory *history = model->get_history();
+       func_id = history->getFuncMap()->get(funcName);
+
+       history->exit_function(func_id, th->get_id());
 }