From 29a70da4bfa76c7403cd260f5709ee752b9eeab0 Mon Sep 17 00:00:00 2001 From: Nathan Bronson Date: Sat, 28 Dec 2013 21:35:56 -0800 Subject: [PATCH] work around broken try_lock_for in gcc 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 --- folly/Synchronized.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/folly/Synchronized.h b/folly/Synchronized.h index b5a3c5ba..96537253 100644 --- a/folly/Synchronized.h +++ b/folly/Synchronized.h @@ -108,7 +108,12 @@ typename std::enable_if< IsOneOf::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))); } /** -- 2.34.1