/*
- * Copyright 2013 Facebook, Inc.
+ * Copyright 2014 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
struct HasLockUnlock {
enum { value = IsOneOf<T,
std::mutex, std::recursive_mutex,
- boost::mutex, boost::recursive_mutex, boost::shared_mutex,
+ boost::mutex, boost::recursive_mutex, boost::shared_mutex
#ifndef __APPLE__ // OSX doesn't have timed mutexes
- std::timed_mutex, std::recursive_timed_mutex,
+ ,std::timed_mutex, std::recursive_timed_mutex,
boost::timed_mutex, boost::recursive_timed_mutex
#endif
>::value };
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)));
}
/**