X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=pthread.cc;h=fecca66b738be3527a65bb2387f99c05f058d822;hb=bdb967ee6d3cdd02dda0e80f8b394f86e9753623;hp=50214c34b31d6d578e4d732c11865eab9b3a3a89;hpb=9cf7a4cf4ce3caa33c27b4211db3d987a6b103ec;p=c11tester.git diff --git a/pthread.cc b/pthread.cc index 50214c34..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,20 @@ 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 * 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); @@ -86,12 +74,7 @@ int pthread_mutex_init(pthread_mutex_t *p_mutex, const pthread_mutexattr_t * att } 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 @@ -113,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(); @@ -140,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 @@ -167,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(); } @@ -207,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) ) @@ -216,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; }