X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=pthread.cc;h=fecca66b738be3527a65bb2387f99c05f058d822;hb=3f376daab54b640efb30700f83bc3ab1cfb88848;hp=20999aea4899c61f6fb20e0f6707d29e16737dde;hpb=ab6885beecafb5ae9103845c03a6e72ddacd79ec;p=c11tester.git diff --git a/pthread.cc b/pthread.cc index 20999aea..fecca66b 100644 --- a/pthread.cc +++ b/pthread.cc @@ -174,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) ) @@ -183,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_thread(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; }