#include "libthreads.h"
#include "schedule.h"
#include "common.h"
+#include "threads_internal.h"
/* global "model" object */
#include "model.h"
while (!thread_system_next());
}
+int thread_switch_to_master(ModelAction *act)
+{
+ struct thread *old, *next;
+
+ DBG();
+ model->set_current_action(act);
+ old = thread_current();
+ old->state = THREAD_READY;
+ next = model->system_thread;
+ return thread_swap(old, next);
+}
+
/*
* User program API functions
*/
void thread_join(struct thread *t)
{
- while (t->state != THREAD_COMPLETED)
- thread_yield();
+ int ret = 0;
+ while (t->state != THREAD_COMPLETED && !ret)
+ /* seq_cst is just a 'don't care' parameter */
+ ret = thread_switch_to_master(new ModelAction(THREAD_JOIN, memory_order_seq_cst, NULL, VALUE_NONE));
}
int thread_yield(void)
{
- struct thread *old, *next;
-
- DBG();
- old = thread_current();
- old->state = THREAD_READY;
- next = model->system_thread;
- return thread_swap(old, next);
+ /* seq_cst is just a 'don't care' parameter */
+ return thread_switch_to_master(new ModelAction(THREAD_YIELD, memory_order_seq_cst, NULL, VALUE_NONE));
}
struct thread *thread_current(void)