projects
/
model-checker.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
model: assign "pending" return values in release_seq_heads()
[model-checker.git]
/
threads.cc
diff --git
a/threads.cc
b/threads.cc
index 9b7954d9386b6f5390ed42a32b43a53f5f5f1ca7..ca4b28b1bc850c9ea5bcab709e2d27a9e74e2581 100644
(file)
--- a/
threads.cc
+++ b/
threads.cc
@@
-12,13
+12,13
@@
/** Allocate a stack for a new thread. */
static void * stack_allocate(size_t size)
{
/** Allocate a stack for a new thread. */
static void * stack_allocate(size_t size)
{
- return malloc(size);
+ return
snapshot_
malloc(size);
}
/** Free a stack for a terminated thread. */
static void stack_free(void *stack)
{
}
/** Free a stack for a terminated thread. */
static void stack_free(void *stack)
{
- free(stack);
+
snapshot_
free(stack);
}
/** Return the currently executing thread. */
}
/** Return the currently executing thread. */
@@
-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,8
+104,8
@@
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
) {
- DEBUG("completed thread %d\n",
get_id(
));
+ if (
!is_complete()
) {
+ DEBUG("completed thread %d\n",
id_to_int(get_id()
));
state = THREAD_COMPLETED;
if (stack)
stack_free(stack);
state = THREAD_COMPLETED;
if (stack)
stack_free(stack);
@@
-116,10
+119,13
@@
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) :
+ creation(NULL),
+ 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;