From 5fa5b680f0d623699321e898cd4436e333885a92 Mon Sep 17 00:00:00 2001 From: "Vicente J. Botet Escriba" Date: Tue, 21 Aug 2012 21:20:41 +0000 Subject: [PATCH] Thread: remove dependency from boo_thread to boost_chrono [SVN r80122] --- include/boost/thread/detail/thread.hpp | 19 ++++++++- include/boost/thread/pthread/thread_data.hpp | 38 +++++++++++++++++- src/pthread/thread.cpp | 42 +------------------- src/win32/thread.cpp | 23 ----------- 4 files changed, 56 insertions(+), 66 deletions(-) diff --git a/include/boost/thread/detail/thread.hpp b/include/boost/thread/detail/thread.hpp index c913aafa..340ff4ba 100644 --- a/include/boost/thread/detail/thread.hpp +++ b/include/boost/thread/detail/thread.hpp @@ -366,7 +366,24 @@ namespace boost bool timed_join(const system_time& abs_time); #ifdef BOOST_THREAD_USES_CHRONO - bool try_join_until(const chrono::time_point& tp); + bool try_join_until(const chrono::time_point& tp) + { + if (this_thread::get_id() == get_id()) + { + boost::throw_exception(thread_resource_error(system::errc::resource_deadlock_would_occur, "boost thread: trying joining itself")); + } + detail::thread_data_ptr local_thread_info=(get_thread_info)(); + if(local_thread_info) + { + chrono::milliseconds rel_time= chrono::ceil(tp-chrono::system_clock::now()); + if(!this_thread::interruptible_wait(local_thread_info->thread_handle,rel_time.count())) + { + return false; + } + release_handle(); + } + return true; + } #endif public: diff --git a/include/boost/thread/pthread/thread_data.hpp b/include/boost/thread/pthread/thread_data.hpp index 5f84799f..aa84c568 100644 --- a/include/boost/thread/pthread/thread_data.hpp +++ b/include/boost/thread/pthread/thread_data.hpp @@ -177,7 +177,43 @@ namespace boost namespace this_thread { #ifdef BOOST_THREAD_USES_CHRONO - void BOOST_SYMBOL_VISIBLE sleep_for(const chrono::nanoseconds& ns); + inline + void BOOST_SYMBOL_VISIBLE sleep_for(const chrono::nanoseconds& ns) + { + using namespace chrono; + boost::detail::thread_data_base* const thread_info=boost::detail::get_current_thread_data(); + + if(thread_info) + { + unique_lock lk(thread_info->sleep_mutex); + while(cv_status::no_timeout==thread_info->sleep_condition.wait_for(lk,ns)) {} + } + else + { + if (ns >= nanoseconds::zero()) + { + + # if defined(BOOST_HAS_PTHREAD_DELAY_NP) + timespec ts; + ts.tv_sec = static_cast(duration_cast(ns).count()); + ts.tv_nsec = static_cast((ns - seconds(ts.tv_sec)).count()); + BOOST_VERIFY(!pthread_delay_np(&ts)); + # elif defined(BOOST_HAS_NANOSLEEP) + timespec ts; + ts.tv_sec = static_cast(duration_cast(ns).count()); + ts.tv_nsec = static_cast((ns - seconds(ts.tv_sec)).count()); + // nanosleep takes a timespec that is an offset, not + // an absolute time. + nanosleep(&ts, 0); + # else + mutex mx; + mutex::scoped_lock lock(mx); + condition_variable cond; + cond.wait_for(lock, ns); + # endif + } + } + } #endif void BOOST_THREAD_DECL yield() BOOST_NOEXCEPT; diff --git a/src/pthread/thread.cpp b/src/pthread/thread.cpp index 56fdb6b2..e76cdf19 100644 --- a/src/pthread/thread.cpp +++ b/src/pthread/thread.cpp @@ -24,7 +24,7 @@ #include #endif -#include +#include "./timeconv.inl" namespace boost { @@ -427,46 +427,6 @@ namespace boost } } -#ifdef BOOST_THREAD_USES_CHRONO - void - sleep_for(const chrono::nanoseconds& ns) - { - using namespace chrono; - boost::detail::thread_data_base* const thread_info=boost::detail::get_current_thread_data(); - - if(thread_info) - { - unique_lock lk(thread_info->sleep_mutex); - while(cv_status::no_timeout==thread_info->sleep_condition.wait_for(lk,ns)) {} - } - else - { - if (ns >= nanoseconds::zero()) - { - - # if defined(BOOST_HAS_PTHREAD_DELAY_NP) - timespec ts; - ts.tv_sec = static_cast(duration_cast(ns).count()); - ts.tv_nsec = static_cast((ns - seconds(ts.tv_sec)).count()); - BOOST_VERIFY(!pthread_delay_np(&ts)); - # elif defined(BOOST_HAS_NANOSLEEP) - timespec ts; - ts.tv_sec = static_cast(duration_cast(ns).count()); - ts.tv_nsec = static_cast((ns - seconds(ts.tv_sec)).count()); - // nanosleep takes a timespec that is an offset, not - // an absolute time. - nanosleep(&ts, 0); - # else - mutex mx; - mutex::scoped_lock lock(mx); - condition_variable cond; - cond.wait_for(lock, ns); - # endif - } - } - } -#endif - void yield() BOOST_NOEXCEPT { # if defined(BOOST_HAS_SCHED_YIELD) diff --git a/src/win32/thread.cpp b/src/win32/thread.cpp index 9b6670a6..fccb149a 100644 --- a/src/win32/thread.cpp +++ b/src/win32/thread.cpp @@ -334,29 +334,6 @@ namespace boost return true; } -#ifdef BOOST_THREAD_USES_CHRONO - - bool thread::try_join_until(const chrono::time_point& tp) - { - if (this_thread::get_id() == get_id()) - { - boost::throw_exception(thread_resource_error(system::errc::resource_deadlock_would_occur, "boost thread: trying joining itself")); - } - detail::thread_data_ptr local_thread_info=(get_thread_info)(); - if(local_thread_info) - { - chrono::milliseconds rel_time= chrono::ceil(tp-chrono::system_clock::now()); - if(!this_thread::interruptible_wait(local_thread_info->thread_handle,rel_time.count())) - { - return false; - } - release_handle(); - } - return true; - } - -#endif - void thread::detach() BOOST_NOEXCEPT { release_handle();