X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=blobdiff_plain;f=execution.cc;h=f6b59cd9bda059c194c473bf376564c0ee343b9d;hp=887e2efa03df0f31832ff6ee260a1a8b1ed9794d;hb=0229244d21ca78bf781e41684810e9fb6d5ca56c;hpb=e4b59e52989269c529e94bea1cd1b9dfe418a0ce diff --git a/execution.cc b/execution.cc index 887e2efa..f6b59cd9 100644 --- a/execution.cc +++ b/execution.cc @@ -1,6 +1,5 @@ #include #include -#include #include #include @@ -17,8 +16,6 @@ #include "threads-model.h" #include "bugmessage.h" -#include - #define INITIAL_THREAD_ID 0 /** @@ -72,9 +69,12 @@ ModelExecution::ModelExecution(ModelChecker *m, scheduler(scheduler), action_trace(), thread_map(2), /* We'll always need at least 2 threads */ + pthread_map(0), + pthread_counter(0), obj_map(), condvar_waiters_map(), obj_thrd_map(), + mutex_map(), promises(), futurevalues(), pending_rel_seqs(), @@ -687,8 +687,8 @@ bool ModelExecution::process_read(ModelAction *curr) */ bool ModelExecution::process_mutex(ModelAction *curr) { - std::mutex *mutex = curr->get_mutex(); - struct std::mutex_state *state = NULL; + cdsc::mutex *mutex = curr->get_mutex(); + struct cdsc::mutex_state *state = NULL; if (mutex) state = mutex->get_state(); @@ -961,18 +961,25 @@ bool ModelExecution::process_thread_action(ModelAction *curr) break; } case PTHREAD_CREATE: { - thrd_t *thrd = (thrd_t *)curr->get_location(); + (*(pthread_t *)curr->get_location()) = pthread_counter++; + struct pthread_params *params = (struct pthread_params *)curr->get_value(); - Thread *th = new Thread(get_next_id(), thrd, params->func, params->arg, get_thread(curr)); + Thread *th = new Thread(get_next_id(), NULL, params->func, params->arg, get_thread(curr)); curr->set_thread_operand(th); add_thread(th); th->set_creation(curr); + + if ( pthread_map.size() < pthread_counter ) + pthread_map.resize( pthread_counter ); + pthread_map[ pthread_counter-1 ] = th; + /* Promises can be satisfied by children */ for (unsigned int i = 0; i < promises.size(); i++) { Promise *promise = promises[i]; if (promise->thread_is_available(curr->get_tid())) promise->add_thread(th->get_id()); } + break; } case THREAD_JOIN: { @@ -1241,8 +1248,8 @@ void ModelExecution::thread_blocking_check_promises(Thread *blocker, Thread *wai */ bool ModelExecution::check_action_enabled(ModelAction *curr) { if (curr->is_lock()) { - std::mutex *lock = curr->get_mutex(); - struct std::mutex_state *state = lock->get_state(); + cdsc::mutex *lock = curr->get_mutex(); + struct cdsc::mutex_state *state = lock->get_state(); if (state->locked) return false; } else if (curr->is_thread_join()) { @@ -2374,6 +2381,7 @@ ModelAction * ModelExecution::get_last_seq_cst_fence(thread_id_t tid, const Mode ModelAction * ModelExecution::get_last_unlock(ModelAction *curr) const { void *location = curr->get_location(); + action_list_t *list = obj_map.get(location); /* Find: max({i in dom(S) | isUnlock(t_i) && samevar(t_i, t)}) */ action_list_t::reverse_iterator rit; @@ -2848,6 +2856,16 @@ Thread * ModelExecution::get_thread(const ModelAction *act) const return get_thread(act->get_tid()); } +/** + * @brief Get a Thread reference by its pthread ID + * @param index The pthread's ID + * @return A Thread reference + */ +Thread * ModelExecution::get_pthread(pthread_t pid) { + if (pid < pthread_counter + 1) return pthread_map[pid]; + else return NULL; +} + /** * @brief Get a Promise's "promise number" *