projects
/
model-checker.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
test: add a "pending release sequences" test
[model-checker.git]
/
threads.cc
diff --git
a/threads.cc
b/threads.cc
index 9b7954d9386b6f5390ed42a32b43a53f5f5f1ca7..39f049541d69184cc012bcd042f2400208863a3a 100644
(file)
--- a/
threads.cc
+++ b/
threads.cc
@@
-44,6
+44,9
@@
void thread_startup()
/* Call the actual thread function */
curr_thread->start_routine(curr_thread->arg);
/* Call the actual thread function */
curr_thread->start_routine(curr_thread->arg);
+
+ /* Finish thread properly */
+ model->switch_to_master(new ModelAction(THREAD_FINISH, std::memory_order_seq_cst, curr_thread));
}
/**
}
/**
@@
-101,7
+104,7
@@
int Thread::swap(ucontext_t *ctxt, Thread *t)
/** Terminate a thread and free its stack. */
void Thread::complete()
{
/** Terminate a thread and free its stack. */
void Thread::complete()
{
- if (
state != THREAD_COMPLETED
) {
+ if (
!is_complete()
) {
DEBUG("completed thread %d\n", get_id());
state = THREAD_COMPLETED;
if (stack)
DEBUG("completed thread %d\n", get_id());
state = THREAD_COMPLETED;
if (stack)
@@
-116,10
+119,12
@@
void Thread::complete()
* @param a The parameter to pass to this function.
*/
Thread::Thread(thrd_t *t, void (*func)(void *), void *a) :
* @param a The parameter to pass to this function.
*/
Thread::Thread(thrd_t *t, void (*func)(void *), void *a) :
+ pending(NULL),
start_routine(func),
arg(a),
user_thread(t),
state(THREAD_CREATED),
start_routine(func),
arg(a),
user_thread(t),
state(THREAD_CREATED),
+ wait_list(),
last_action_val(VALUE_NONE)
{
int ret;
last_action_val(VALUE_NONE)
{
int ret;