summaryrefslogtreecommitdiff
path: root/boost/thread/win32/thread_data.hpp
diff options
context:
space:
mode:
authorDongHun Kwak <dh0128.kwak@samsung.com>2019-12-05 15:12:59 +0900
committerDongHun Kwak <dh0128.kwak@samsung.com>2019-12-05 15:12:59 +0900
commitb8cf34c691623e4ec329053cbbf68522a855882d (patch)
tree34da08632a99677f6b79ecb65e5b655a5b69a67f /boost/thread/win32/thread_data.hpp
parent3fdc3e5ee96dca5b11d1694975a65200787eab86 (diff)
downloadboost-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.hpp200
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
}
}