int pthread_create(pthread_t *t, const pthread_attr_t * attr,
pthread_start_t start_routine, void * arg) {
- if (!model) {
- snapshot_system_init(10000, 1024, 1024, 40000);
- model = new ModelChecker();
- model->startChecker();
- }
-
+ createModelIfNotExist();
struct pthread_params params = { start_routine, arg };
- ModelAction *act = new ModelAction(PTHREAD_CREATE, std::memory_order_seq_cst, t, (uint64_t)¶ms);
-
/* seq_cst is just a 'don't care' parameter */
- model->switch_to_master(act);
+ model->switch_thread(new ModelAction(PTHREAD_CREATE, std::memory_order_seq_cst, t, (uint64_t)¶ms));
return 0;
}
ModelExecution *execution = model->get_execution();
Thread *th = execution->get_pthread(t);
- model->switch_to_master(new ModelAction(PTHREAD_JOIN, std::memory_order_seq_cst, th, id_to_int(th->get_id())));
+ model->switch_thread(new ModelAction(PTHREAD_JOIN, std::memory_order_seq_cst, th, id_to_int(th->get_id())));
if ( value_ptr ) {
// store return value
/* Take care of both pthread_yield and c++ thread yield */
int sched_yield() {
- model->switch_to_master(new ModelAction(THREAD_YIELD, std::memory_order_seq_cst, thread_current(), VALUE_NONE));
+ model->switch_thread(new ModelAction(THREAD_YIELD, std::memory_order_seq_cst, thread_current(), VALUE_NONE));
return 0;
}
void pthread_exit(void *value_ptr) {
Thread * th = thread_current();
th->set_pthread_return(value_ptr);
- model->switch_to_master(new ModelAction(THREADONLY_FINISH, std::memory_order_seq_cst, th));
+ model->switch_thread(new ModelAction(THREADONLY_FINISH, std::memory_order_seq_cst, th));
//Need to exit so we don't return to the program
real_pthread_exit(NULL);
}
int pthread_mutex_init(pthread_mutex_t *p_mutex, const pthread_mutexattr_t * attr) {
- if (!model) {
- snapshot_system_init(10000, 1024, 1024, 40000);
- model = new ModelChecker();
- model->startChecker();
- }
-
+ createModelIfNotExist();
int mutex_type = PTHREAD_MUTEX_DEFAULT;
if (attr != NULL)
pthread_mutexattr_gettype(attr, &mutex_type);
}
int pthread_mutex_lock(pthread_mutex_t *p_mutex) {
- if (!model) {
- snapshot_system_init(10000, 1024, 1024, 40000);
- model = new ModelChecker();
- model->startChecker();
- }
-
+ createModelIfNotExist();
ModelExecution *execution = model->get_execution();
/* to protect the case where PTHREAD_MUTEX_INITIALIZER is used
}
int pthread_mutex_trylock(pthread_mutex_t *p_mutex) {
- if (!model) {
- snapshot_system_init(10000, 1024, 1024, 40000);
- model = new ModelChecker();
- model->startChecker();
- }
-
+ createModelIfNotExist();
ModelExecution *execution = model->get_execution();
cdsc::snapmutex *m = execution->getMutexMap()->get(p_mutex);
- return m->try_lock();
+ return m->try_lock() ? 0 : EBUSY;
}
int pthread_mutex_unlock(pthread_mutex_t *p_mutex) {
ModelExecution *execution = model->get_execution();
int pthread_mutex_timedlock (pthread_mutex_t *__restrict p_mutex,
const struct timespec *__restrict abstime) {
// timedlock just gives the option of giving up the lock, so return and let the scheduler decide which thread goes next
-
- if (!model) {
- snapshot_system_init(10000, 1024, 1024, 40000);
- model = new ModelChecker();
- model->startChecker();
- }
-
+ createModelIfNotExist();
ModelExecution *execution = model->get_execution();
/* to protect the case where PTHREAD_MUTEX_INITIALIZER is used
}
pthread_t pthread_self() {
- if (!model) {
- snapshot_system_init(10000, 1024, 1024, 40000);
- model = new ModelChecker();
- model->startChecker();
- }
-
+ createModelIfNotExist();
Thread* th = model->get_current_thread();
return (pthread_t)th->get_id();
}
int pthread_cond_timedwait(pthread_cond_t *p_cond,
pthread_mutex_t *p_mutex, const struct timespec *abstime) {
ModelExecution *execution = model->get_execution();
-
if ( !execution->getCondMap()->contains(p_cond) )
pthread_cond_init(p_cond, NULL);
if ( !execution->getMutexMap()->contains(p_mutex) )
cdsc::snapcondition_variable *v = execution->getCondMap()->get(p_cond);
cdsc::snapmutex *m = execution->getMutexMap()->get(p_mutex);
- model->switch_to_master(new ModelAction(ATOMIC_TIMEDWAIT, std::memory_order_seq_cst, v, (uint64_t) m));
+ uint64_t time = abstime->tv_sec * 1000000000 + abstime->tv_nsec;
+ ModelAction * timed_wait = new ModelAction(ATOMIC_TIMEDWAIT, std::memory_order_seq_cst, v, (uint64_t) m);
+ timed_wait->set_time(time);
+ if (model->switch_thread(timed_wait) == ETIMEDOUT) {
+ //model_print("thread %u wait timedout\n", thread_current_id());
+ return ETIMEDOUT;
+ }
m->lock();
-
- // model_print("Timed_wait is called\n");
return 0;
}