summaryrefslogtreecommitdiff
path: root/boost/thread/win32/basic_recursive_mutex.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/thread/win32/basic_recursive_mutex.hpp')
-rw-r--r--boost/thread/win32/basic_recursive_mutex.hpp40
1 files changed, 26 insertions, 14 deletions
diff --git a/boost/thread/win32/basic_recursive_mutex.hpp b/boost/thread/win32/basic_recursive_mutex.hpp
index 351f9acc71..6913c5bf62 100644
--- a/boost/thread/win32/basic_recursive_mutex.hpp
+++ b/boost/thread/win32/basic_recursive_mutex.hpp
@@ -4,7 +4,7 @@
// basic_recursive_mutex.hpp
//
// (C) Copyright 2006-8 Anthony Williams
-// (C) Copyright 2011-2012 Vicente J. Botet Escriba
+// (C) Copyright 2011-2012,2017-2018 Vicente J. Botet Escriba
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
@@ -44,13 +44,13 @@ namespace boost
bool try_lock() BOOST_NOEXCEPT
{
- long const current_thread_id=boost::detail::winapi::GetCurrentThreadId();
+ long const current_thread_id=boost::winapi::GetCurrentThreadId();
return try_recursive_lock(current_thread_id) || try_basic_lock(current_thread_id);
}
void lock()
{
- long const current_thread_id=boost::detail::winapi::GetCurrentThreadId();
+ long const current_thread_id=boost::winapi::GetCurrentThreadId();
if(!try_recursive_lock(current_thread_id))
{
mutex.lock();
@@ -61,29 +61,30 @@ namespace boost
#if defined BOOST_THREAD_USES_DATETIME
bool timed_lock(::boost::system_time const& target)
{
- long const current_thread_id=boost::detail::winapi::GetCurrentThreadId();
+ long const current_thread_id=boost::winapi::GetCurrentThreadId();
return try_recursive_lock(current_thread_id) || try_timed_lock(current_thread_id,target);
}
template<typename Duration>
- bool timed_lock(Duration const& timeout)
+ bool timed_lock(Duration const& target)
{
- return timed_lock(get_system_time()+timeout);
+ long const current_thread_id=boost::detail::winapi::GetCurrentThreadId();
+ return try_recursive_lock(current_thread_id) || try_timed_lock(current_thread_id,target);
}
#endif
#ifdef BOOST_THREAD_USES_CHRONO
- template <class Rep, class Period>
- bool try_lock_for(const chrono::duration<Rep, Period>& rel_time)
- {
+ template <class Rep, class Period>
+ bool try_lock_for(const chrono::duration<Rep, Period>& rel_time)
+ {
long const current_thread_id=boost::detail::winapi::GetCurrentThreadId();
return try_recursive_lock(current_thread_id) || try_timed_lock_for(current_thread_id,rel_time);
- }
- template <class Clock, class Duration>
- bool try_lock_until(const chrono::time_point<Clock, Duration>& t)
- {
+ }
+ template <class Clock, class Duration>
+ bool try_lock_until(const chrono::time_point<Clock, Duration>& t)
+ {
long const current_thread_id=boost::detail::winapi::GetCurrentThreadId();
return try_recursive_lock(current_thread_id) || try_timed_lock_until(current_thread_id,t);
- }
+ }
#endif
void unlock()
{
@@ -127,6 +128,17 @@ namespace boost
}
return false;
}
+ template<typename Duration>
+ bool try_timed_lock(long current_thread_id,Duration const& target)
+ {
+ if(mutex.timed_lock(target))
+ {
+ BOOST_INTERLOCKED_EXCHANGE(&locking_thread_id,current_thread_id);
+ recursion_count=1;
+ return true;
+ }
+ return false;
+ }
#endif
template <typename TP>
bool try_timed_lock_until(long current_thread_id,TP const& target)