Commit eea5ec40 authored by Victor Costan's avatar Victor Costan Committed by Commit Bot

Blink: Make ThreadCondition only work with Mutex.

The interaction between ThreadCondition (condition variables) and
recursive (a.k.a. re-entrant) mutexes is difficult to reason about.
Details in the "Why can the holder of a Lock not reacquire it?" section
of https://www.chromium.org/developers/lock-and-condition-variable

Bug: 805814
Change-Id: Ie0b5e026a43768108011ca8f2f6fd3fe0e1f4b03
Reviewed-on: https://chromium-review.googlesource.com/885862
Commit-Queue: Victor Costan <pwnall@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Cr-Commit-Position: refs/heads/master@{#531846}
parent 02fe30d4
...@@ -130,12 +130,12 @@ class WTF_EXPORT ThreadCondition final { ...@@ -130,12 +130,12 @@ class WTF_EXPORT ThreadCondition final {
ThreadCondition(); ThreadCondition();
~ThreadCondition(); ~ThreadCondition();
void Wait(MutexBase&); void Wait(Mutex&);
// Returns true if the condition was signaled before absoluteTime, false if // Returns true if the condition was signaled before absoluteTime, false if
// the absoluteTime was reached or is in the past. // the absoluteTime was reached or is in the past.
// The absoluteTime is in seconds, starting on January 1, 1970. The time is // The absoluteTime is in seconds, starting on January 1, 1970. The time is
// assumed to use the same time zone as WTF::currentTime(). // assumed to use the same time zone as WTF::currentTime().
bool TimedWait(MutexBase&, double absolute_time); bool TimedWait(Mutex&, double absolute_time);
void Signal(); void Signal();
void Broadcast(); void Broadcast();
......
...@@ -204,7 +204,7 @@ ThreadCondition::~ThreadCondition() { ...@@ -204,7 +204,7 @@ ThreadCondition::~ThreadCondition() {
pthread_cond_destroy(&condition_); pthread_cond_destroy(&condition_);
} }
void ThreadCondition::Wait(MutexBase& mutex) { void ThreadCondition::Wait(Mutex& mutex) {
PlatformMutex& platform_mutex = mutex.Impl(); PlatformMutex& platform_mutex = mutex.Impl();
int result = pthread_cond_wait(&condition_, &platform_mutex.internal_mutex_); int result = pthread_cond_wait(&condition_, &platform_mutex.internal_mutex_);
DCHECK_EQ(result, 0); DCHECK_EQ(result, 0);
...@@ -213,7 +213,7 @@ void ThreadCondition::Wait(MutexBase& mutex) { ...@@ -213,7 +213,7 @@ void ThreadCondition::Wait(MutexBase& mutex) {
#endif #endif
} }
bool ThreadCondition::TimedWait(MutexBase& mutex, double absolute_time) { bool ThreadCondition::TimedWait(Mutex& mutex, double absolute_time) {
if (absolute_time < CurrentTime()) if (absolute_time < CurrentTime())
return false; return false;
......
...@@ -242,7 +242,7 @@ ThreadCondition::ThreadCondition() { ...@@ -242,7 +242,7 @@ ThreadCondition::ThreadCondition() {
ThreadCondition::~ThreadCondition() {} ThreadCondition::~ThreadCondition() {}
void ThreadCondition::Wait(MutexBase& mutex) { void ThreadCondition::Wait(Mutex& mutex) {
PlatformMutex& platform_mutex = mutex.Impl(); PlatformMutex& platform_mutex = mutex.Impl();
BOOL result = SleepConditionVariableCS( BOOL result = SleepConditionVariableCS(
&condition_, &platform_mutex.internal_mutex_, INFINITE); &condition_, &platform_mutex.internal_mutex_, INFINITE);
...@@ -250,7 +250,7 @@ void ThreadCondition::Wait(MutexBase& mutex) { ...@@ -250,7 +250,7 @@ void ThreadCondition::Wait(MutexBase& mutex) {
++platform_mutex.recursion_count_; ++platform_mutex.recursion_count_;
} }
bool ThreadCondition::TimedWait(MutexBase& mutex, double absolute_time) { bool ThreadCondition::TimedWait(Mutex& mutex, double absolute_time) {
DWORD interval = AbsoluteTimeToWaitTimeoutInterval(absolute_time); DWORD interval = AbsoluteTimeToWaitTimeoutInterval(absolute_time);
if (!interval) { if (!interval) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment