Author: compnerd Date: Thu Feb 16 09:47:45 2017 New Revision: 295329 URL: http://llvm.org/viewvc/llvm-project?rev=295329&view=rev Log: threading_support: make __thread_sleep_for be alertable
On Windows, we were using `Sleep` which is not alertable. This means that if the thread was used for a user APC or WinProc handling and thread::sleep was used, we could potentially dead lock. Use `SleepEx` with an alertable sleep, resuming until the time has expired if we are awoken early. Modified: libcxx/trunk/include/__threading_support Modified: libcxx/trunk/include/__threading_support URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__threading_support?rev=295329&r1=295328&r2=295329&view=diff ============================================================================== --- libcxx/trunk/include/__threading_support (original) +++ libcxx/trunk/include/__threading_support Thu Feb 16 09:47:45 2017 @@ -589,11 +589,14 @@ void __libcpp_thread_yield() void __libcpp_thread_sleep_for(const chrono::nanoseconds& __ns) { - using namespace chrono; + using namespace _VSTD::chrono; + // round-up to the nearest milisecond milliseconds __ms = duration_cast<milliseconds>(__ns + chrono::nanoseconds(999999)); - Sleep(__ms.count()); + auto start = system_clock::now(); + while (::SleepEx((__ms - (system_clock::now() - start)).count(), + TRUE) == WAIT_IO_COMPLETION); } // Thread Local Storage _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits