Summary:
timed_mutex::try_lock_for is broken in gcc 4.8 (see
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54562), so this diff adds
a workaround using try_lock_until. The internal implementation of
try_lock_for converts to try_lock_until, but it uses the steady_clock
instead of the system_clock as its time base. In some gcc versions
these are the same clock so it works okay, but not in all.
Test Plan: unit tests
Reviewed By: delong.j@fb.com
FB internal diff:
D1108584
IsOneOf<T, std::timed_mutex, std::recursive_timed_mutex>::value, bool>::type
acquireReadWrite(T& mutex,
unsigned int milliseconds) {
- return mutex.try_lock_for(std::chrono::milliseconds(milliseconds));
+ // work around try_lock_for bug in some gcc versions, see
+ // http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54562
+ return mutex.try_lock()
+ || (milliseconds > 0 &&
+ mutex.try_lock_until(std::chrono::system_clock::now() +
+ std::chrono::milliseconds(milliseconds)));
}
/**