diff options
author | DongHun Kwak <dh0128.kwak@samsung.com> | 2019-12-05 15:12:59 +0900 |
---|---|---|
committer | DongHun Kwak <dh0128.kwak@samsung.com> | 2019-12-05 15:12:59 +0900 |
commit | b8cf34c691623e4ec329053cbbf68522a855882d (patch) | |
tree | 34da08632a99677f6b79ecb65e5b655a5b69a67f /boost/thread/win32/thread_data.hpp | |
parent | 3fdc3e5ee96dca5b11d1694975a65200787eab86 (diff) | |
download | boost-b8cf34c691623e4ec329053cbbf68522a855882d.tar.gz boost-b8cf34c691623e4ec329053cbbf68522a855882d.tar.bz2 boost-b8cf34c691623e4ec329053cbbf68522a855882d.zip |
Imported Upstream version 1.67.0upstream/1.67.0
Diffstat (limited to 'boost/thread/win32/thread_data.hpp')
-rw-r--r-- | boost/thread/win32/thread_data.hpp | 200 |
1 files changed, 83 insertions, 117 deletions
diff --git a/boost/thread/win32/thread_data.hpp b/boost/thread/win32/thread_data.hpp index ed74198fbe..f87889efa7 100644 --- a/boost/thread/win32/thread_data.hpp +++ b/boost/thread/win32/thread_data.hpp @@ -10,6 +10,7 @@ #include <boost/thread/thread_time.hpp> #include <boost/thread/win32/thread_primitives.hpp> #include <boost/thread/win32/thread_heap_alloc.hpp> +#include <boost/thread/detail/platform_time.hpp> #include <boost/predef/platform.h> @@ -153,7 +154,7 @@ namespace boost #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS void interrupt() { - BOOST_VERIFY(detail::winapi::SetEvent(interruption_handle)!=0); + BOOST_VERIFY(winapi::SetEvent(interruption_handle)!=0); } #endif typedef detail::win32::handle native_handle_type; @@ -174,146 +175,111 @@ namespace boost BOOST_THREAD_DECL thread_data_base* get_current_thread_data(); typedef boost::intrusive_ptr<detail::thread_data_base> thread_data_ptr; - - struct BOOST_SYMBOL_VISIBLE timeout - { - win32::ticks_type start; - uintmax_t milliseconds; - bool relative; - boost::system_time abs_time; - - static unsigned long const max_non_infinite_wait=0xfffffffe; - - timeout(uintmax_t milliseconds_): - start(win32::GetTickCount64_()()), - milliseconds(milliseconds_), - relative(true) - //, - // abs_time(boost::get_system_time()) - {} - - timeout(boost::system_time const& abs_time_): - start(win32::GetTickCount64_()()), - milliseconds(0), - relative(false), - abs_time(abs_time_) - {} - - struct BOOST_SYMBOL_VISIBLE remaining_time - { - bool more; - unsigned long milliseconds; - - remaining_time(uintmax_t remaining): - more(remaining>max_non_infinite_wait), - milliseconds(more?max_non_infinite_wait:(unsigned long)remaining) - {} - }; - - remaining_time remaining_milliseconds() const - { - if(is_sentinel()) - { - return remaining_time(win32::infinite); - } - else if(relative) - { - win32::ticks_type const now=win32::GetTickCount64_()(); - win32::ticks_type const elapsed=now-start; - return remaining_time((elapsed<milliseconds)?(milliseconds-elapsed):0); - } - else - { - system_time const now=get_system_time(); - if(abs_time<=now) - { - return remaining_time(0); - } - return remaining_time((abs_time-now).total_milliseconds()+1); - } - } - - bool is_sentinel() const - { - return milliseconds==~uintmax_t(0); - } - - - static timeout sentinel() - { - return timeout(sentinel_type()); - } - private: - struct sentinel_type - {}; - - explicit timeout(sentinel_type): - start(0),milliseconds(~uintmax_t(0)),relative(true) - {} - }; - - inline uintmax_t pin_to_zero(intmax_t value) - { - return (value<0)?0u:(uintmax_t)value; - } } namespace this_thread { void BOOST_THREAD_DECL yield() BOOST_NOEXCEPT; - bool BOOST_THREAD_DECL interruptible_wait(detail::win32::handle handle_to_wait_for,detail::timeout target_time); - inline void interruptible_wait(uintmax_t milliseconds) + bool BOOST_THREAD_DECL interruptible_wait(detail::win32::handle handle_to_wait_for, detail::internal_platform_timepoint const &timeout); + +#if defined BOOST_THREAD_USES_DATETIME + template<typename TimeDuration> + BOOST_SYMBOL_VISIBLE void sleep(TimeDuration const& rel_time) { - interruptible_wait(detail::win32::invalid_handle_value,milliseconds); + interruptible_wait(detail::win32::invalid_handle_value, detail::internal_platform_clock::now() + detail::platform_duration(rel_time)); } - inline BOOST_SYMBOL_VISIBLE void interruptible_wait(system_time const& abs_time) + + inline BOOST_SYMBOL_VISIBLE void sleep(system_time const& abs_time) { - interruptible_wait(detail::win32::invalid_handle_value,abs_time); + const detail::real_platform_timepoint ts(abs_time); + detail::platform_duration d(ts - detail::real_platform_clock::now()); + while (d > detail::platform_duration::zero()) + { + d = (std::min)(d, detail::platform_milliseconds(BOOST_THREAD_POLL_INTERVAL_MILLISECONDS)); + interruptible_wait(detail::win32::invalid_handle_value, detail::internal_platform_clock::now() + d); + d = ts - detail::real_platform_clock::now(); + } } - template<typename TimeDuration> - inline BOOST_SYMBOL_VISIBLE void sleep(TimeDuration const& rel_time) +#endif + +#ifdef BOOST_THREAD_USES_CHRONO + template <class Rep, class Period> + void sleep_for(const chrono::duration<Rep, Period>& d) { - interruptible_wait(detail::pin_to_zero(rel_time.total_milliseconds())); + interruptible_wait(detail::win32::invalid_handle_value, detail::internal_platform_clock::now() + detail::platform_duration(d)); } - inline BOOST_SYMBOL_VISIBLE void sleep(system_time const& abs_time) + + template <class Duration> + void sleep_until(const chrono::time_point<chrono::steady_clock, Duration>& t) { - interruptible_wait(abs_time); + sleep_for(t - chrono::steady_clock::now()); } -// #11322 sleep_for() nanoseconds overload will always return too early on windows -//#ifdef BOOST_THREAD_USES_CHRONO -// inline void BOOST_SYMBOL_VISIBLE sleep_for(const chrono::nanoseconds& ns) -// { -// interruptible_wait(chrono::duration_cast<chrono::milliseconds>(ns).count()); -// } -//#endif + + template <class Clock, class Duration> + void sleep_until(const chrono::time_point<Clock, Duration>& t) + { + typedef typename common_type<Duration, typename Clock::duration>::type common_duration; + common_duration d(t - Clock::now()); + while (d > common_duration::zero()) + { + d = (std::min)(d, common_duration(chrono::milliseconds(BOOST_THREAD_POLL_INTERVAL_MILLISECONDS))); + sleep_for(d); + d = t - Clock::now(); + } + } +#endif + namespace no_interruption_point { - bool BOOST_THREAD_DECL non_interruptible_wait(detail::win32::handle handle_to_wait_for,detail::timeout target_time); - inline void non_interruptible_wait(uintmax_t milliseconds) + bool BOOST_THREAD_DECL non_interruptible_wait(detail::win32::handle handle_to_wait_for, detail::internal_platform_timepoint const &timeout); + +#if defined BOOST_THREAD_USES_DATETIME + template<typename TimeDuration> + BOOST_SYMBOL_VISIBLE void sleep(TimeDuration const& rel_time) { - non_interruptible_wait(detail::win32::invalid_handle_value,milliseconds); + non_interruptible_wait(detail::win32::invalid_handle_value, detail::internal_platform_clock::now() + detail::platform_duration(rel_time)); } - inline BOOST_SYMBOL_VISIBLE void non_interruptible_wait(system_time const& abs_time) + + inline BOOST_SYMBOL_VISIBLE void sleep(system_time const& abs_time) { - non_interruptible_wait(detail::win32::invalid_handle_value,abs_time); + const detail::real_platform_timepoint ts(abs_time); + detail::platform_duration d(ts - detail::real_platform_clock::now()); + while (d > detail::platform_duration::zero()) + { + d = (std::min)(d, detail::platform_milliseconds(BOOST_THREAD_POLL_INTERVAL_MILLISECONDS)); + non_interruptible_wait(detail::win32::invalid_handle_value, detail::internal_platform_clock::now() + d); + d = ts - detail::real_platform_clock::now(); + } } - template<typename TimeDuration> - inline BOOST_SYMBOL_VISIBLE void sleep(TimeDuration const& rel_time) +#endif + +#ifdef BOOST_THREAD_USES_CHRONO + template <class Rep, class Period> + void sleep_for(const chrono::duration<Rep, Period>& d) { - non_interruptible_wait(detail::pin_to_zero(rel_time.total_milliseconds())); + non_interruptible_wait(detail::win32::invalid_handle_value, detail::internal_platform_clock::now() + detail::platform_duration(d)); } - inline BOOST_SYMBOL_VISIBLE void sleep(system_time const& abs_time) + + template <class Duration> + void sleep_until(const chrono::time_point<chrono::steady_clock, Duration>& t) { - non_interruptible_wait(abs_time); + sleep_for(t - chrono::steady_clock::now()); } -// #11322 sleep_for() nanoseconds overload will always return too early on windows -//#ifdef BOOST_THREAD_USES_CHRONO -// inline void BOOST_SYMBOL_VISIBLE sleep_for(const chrono::nanoseconds& ns) -// { -// non_interruptible_wait(chrono::duration_cast<chrono::milliseconds>(ns).count()); -// } -//#endif + + template <class Clock, class Duration> + void sleep_until(const chrono::time_point<Clock, Duration>& t) + { + typedef typename common_type<Duration, typename Clock::duration>::type common_duration; + common_duration d(t - Clock::now()); + while (d > common_duration::zero()) + { + d = (std::min)(d, common_duration(chrono::milliseconds(BOOST_THREAD_POLL_INTERVAL_MILLISECONDS))); + sleep_for(d); + d = t - Clock::now(); + } + } +#endif } } |