X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=blobdiff_plain;f=futex.cc;h=677b4afd9fe29740aacd604566d8811da833d06f;hp=64ec6b4ac9d575cac5a921a448a76f3a96bfa8d7;hb=7742256df627848c1c375f979f5369a45c92057b;hpb=31c401a5ccee4a821e4d77f5c1f1883b1aac70e3 diff --git a/futex.cc b/futex.cc index 64ec6b4a..677b4afd 100644 --- a/futex.cc +++ b/futex.cc @@ -2,7 +2,7 @@ // Copyright (C) 2015-2019 Free Software Foundation, Inc. // -// This is a reimplementation of libstdc++-v3/src/c++11/futex.cc. +// This is a reimplementation of libstdc++-v3/src/c++11/futex.cc. #include #ifdef _GLIBCXX_HAS_GTHREADS @@ -26,30 +26,30 @@ const unsigned futex_wake_op = 1; namespace std _GLIBCXX_VISIBILITY(default) { -_GLIBCXX_BEGIN_NAMESPACE_VERSION + _GLIBCXX_BEGIN_NAMESPACE_VERSION bool __atomic_futex_unsigned_base::_M_futex_wait_until(unsigned *__addr, - unsigned __val, - bool __has_timeout, chrono::seconds __s, chrono::nanoseconds __ns) + unsigned __val, + bool __has_timeout, chrono::seconds __s, chrono::nanoseconds __ns) { // do nothing if the two values are not equal if ( *__addr != __val ) { return true; } - // if a timeout is specified, return immedialy. Letting the scheduler decide how long this thread will wait. + // if a timeout is specified, return immedialy. Letting the scheduler decide how long this thread will wait. if (__has_timeout) { return true; } ModelExecution *execution = model->get_execution(); - cdsc::condition_variable *v = new cdsc::condition_variable(); - cdsc::mutex *m = new cdsc::mutex(); + cdsc::snapcondition_variable *v = new cdsc::snapcondition_variable(); + cdsc::snapmutex *m = new cdsc::snapmutex(); - execution->cond_map.put( (pthread_cond_t *) __addr, v); - execution->mutex_map.put( (pthread_mutex_t *) __addr, m); + execution->getCondMap()->put( (pthread_cond_t *) __addr, v); + execution->getMutexMap()->put( (pthread_mutex_t *) __addr, m); v->wait(*m); return true; @@ -60,11 +60,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { // INT_MAX wakes all the waiters at the address __addr ModelExecution *execution = model->get_execution(); - cdsc::condition_variable *v = execution->cond_map.get( (pthread_cond_t *) __addr); + cdsc::condition_variable *v = execution->getCondMap()->get( (pthread_cond_t *) __addr); + + if (v == NULL) + return;// do nothing + v->notify_all(); } -_GLIBCXX_END_NAMESPACE_VERSION + _GLIBCXX_END_NAMESPACE_VERSION } -#endif // defined(_GLIBCXX_HAVE_LINUX_FUTEX) && ATOMIC_INT_LOCK_FREE > 1 -#endif // _GLIBCXX_HAS_GTHREADS +#endif // defined(_GLIBCXX_HAVE_LINUX_FUTEX) && ATOMIC_INT_LOCK_FREE > 1 +#endif // _GLIBCXX_HAS_GTHREADS