From: Nathan Bronson Date: Sun, 29 Dec 2013 05:35:56 +0000 (-0800) Subject: work around broken try_lock_for in gcc X-Git-Tag: v0.22.0~743 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=29a70da4bfa76c7403cd260f5709ee752b9eeab0;p=folly.git 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 --- 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))); } /**