}
void condition_variable::notify_one() {
- model->switch_to_master(new ModelAction(ATOMIC_NOTIFY_ONE, std::memory_order_seq_cst, this));
+ model->switch_thread(new ModelAction(ATOMIC_NOTIFY_ONE, std::memory_order_seq_cst, this));
}
void condition_variable::notify_all() {
- model->switch_to_master(new ModelAction(ATOMIC_NOTIFY_ALL, std::memory_order_seq_cst, this));
+ model->switch_thread(new ModelAction(ATOMIC_NOTIFY_ALL, std::memory_order_seq_cst, this));
}
void condition_variable::wait(mutex& lock) {
- model->switch_to_master(new ModelAction(ATOMIC_WAIT, std::memory_order_seq_cst, this, (uint64_t) &lock));
+ model->switch_thread(new ModelAction(ATOMIC_WAIT, std::memory_order_seq_cst, this, (uint64_t) &lock));
//relock as a second action
lock.lock();
}
void ModelChecker::finishRunExecution(ucontext_t *old)
{
scheduler->set_current_thread(NULL);
+ break_execution = true;
}
void ModelChecker::consumeAction()
void ModelChecker::handleChosenThread(ucontext_t *old)
{
- if (execution->has_asserted())
+ if (execution->has_asserted()) {
finishRunExecution(old);
+ return;
+ }
if (!chosen_thread)
chosen_thread = get_next_thread();
- if (!chosen_thread || chosen_thread->is_model_thread())
+ if (!chosen_thread || chosen_thread->is_model_thread()) {
finishRunExecution(old);
+ return;
+ }
/* if (chosen_thread->just_woken_up()) {
chosen_thread->set_wakeup_state(false);
chosen_thread->set_pending(NULL);
finishRunExecution(old);
else
startRunExecution(old);
- } else*/
+ } */
{
/* Consume the next action for a Thread */
checkfree = params.checkthreshold;
for(int exec = 0;exec < params.maxexecutions;exec++) {
chosen_thread = init_thread;
+ break_execution = false;
do {
+ if (break_execution)
+ break;
+
thread_chosen = false;
curr_thread_num = 1;
startRunExecution(&system_context);
Thread * chosen_thread;
bool thread_chosen;
+ bool break_execution;
modelclock_t checkfree;
void mutex::lock()
{
- model->switch_to_master(new ModelAction(ATOMIC_LOCK, std::memory_order_seq_cst, this));
+ model->switch_thread(new ModelAction(ATOMIC_LOCK, std::memory_order_seq_cst, this));
}
bool mutex::try_lock()
{
- return model->switch_to_master(new ModelAction(ATOMIC_TRYLOCK, std::memory_order_seq_cst, this));
+ return model->switch_thread(new ModelAction(ATOMIC_TRYLOCK, std::memory_order_seq_cst, this));
}
void mutex::unlock()
{
- model->switch_to_master(new ModelAction(ATOMIC_UNLOCK, std::memory_order_seq_cst, this));
+ model->switch_thread(new ModelAction(ATOMIC_UNLOCK, std::memory_order_seq_cst, this));
}
}