X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=pthread.cc;h=fecca66b738be3527a65bb2387f99c05f058d822;hb=HEAD;hp=706f1b75602ef6ae33e2876be5064dcd10ab18a3;hpb=884ebb4495edcb6fed84c0b4746b882bb0918ddc;p=c11tester.git diff --git a/pthread.cc b/pthread.cc index 706f1b75..fecca66b 100644 --- a/pthread.cc +++ b/pthread.cc @@ -16,18 +16,11 @@ 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; } @@ -36,7 +29,7 @@ int pthread_join(pthread_t t, void **value_ptr) { 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 @@ -54,25 +47,25 @@ int pthread_detach(pthread_t t) { /* 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 *) { - if (!model) { - snapshot_system_init(10000, 1024, 1024, 40000); - model = new ModelChecker(); - model->startChecker(); - } - cdsc::snapmutex *m = new cdsc::snapmutex(); +int pthread_mutex_init(pthread_mutex_t *p_mutex, const pthread_mutexattr_t * attr) { + createModelIfNotExist(); + int mutex_type = PTHREAD_MUTEX_DEFAULT; + if (attr != NULL) + pthread_mutexattr_gettype(attr, &mutex_type); + + cdsc::snapmutex *m = new cdsc::snapmutex(mutex_type); ModelExecution *execution = model->get_execution(); execution->getMutexMap()->put(p_mutex, m); @@ -81,12 +74,7 @@ int pthread_mutex_init(pthread_mutex_t *p_mutex, const pthread_mutexattr_t *) { } 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 @@ -108,15 +96,10 @@ int pthread_mutex_lock(pthread_mutex_t *p_mutex) { } 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(); @@ -135,13 +118,7 @@ int pthread_mutex_unlock(pthread_mutex_t *p_mutex) { 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 @@ -162,12 +139,7 @@ int pthread_mutex_timedlock (pthread_mutex_t *__restrict p_mutex, } 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(); } @@ -202,7 +174,6 @@ int pthread_cond_wait(pthread_cond_t *p_cond, pthread_mutex_t *p_mutex) { 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) ) @@ -211,10 +182,14 @@ int pthread_cond_timedwait(pthread_cond_t *p_cond, 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; }