[lld] r181484 - [lld][Core] Fix latch synchronization bug.
Rui Ueyama
ruiu at google.com
Wed May 8 16:29:24 PDT 2013
Author: ruiu
Date: Wed May 8 18:29:24 2013
New Revision: 181484
URL: http://llvm.org/viewvc/llvm-project?rev=181484&view=rev
Log:
[lld][Core] Fix latch synchronization bug.
We need to acquire a lock before signal a condition.
Otherwise threads waiting on a condition variable can
miss a signal.
Consider two threads: Thread A executing dec() and thread
B executing sync(). The initial value of _count is 1. If
these two threads are interleaved in the following order,
thread B misses the signal sent by thread A, because at the
time thread A sends a signal, B is not waiting for it.
Thread A | Thread B
| std::unique_lock<std::mutex> lock(_condMut);
| while (!(_count == 0)) {
if (--_count == 0) |
_cond_notify_all() |
| _cond.wait();
| }
Note that "wait(lock, pred)" is equivalent to "while(!pred())
wait(lock)", so I expanded it in the above example.
Reviewers: Bigcheese
CC: llvm-commits
Differential Revision: http://llvm-reviews.chandlerc.com/D764
Modified:
lld/trunk/include/lld/Core/Parallel.h
Modified: lld/trunk/include/lld/Core/Parallel.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Core/Parallel.h?rev=181484&r1=181483&r2=181484&view=diff
==============================================================================
--- lld/trunk/include/lld/Core/Parallel.h (original)
+++ lld/trunk/include/lld/Core/Parallel.h Wed May 8 18:29:24 2013
@@ -44,16 +44,21 @@ namespace lld {
///
/// Calling dec() on a Latch with a count of 0 has undefined behaivor.
class Latch {
- std::atomic<uint32_t> _count;
+ uint32_t _count;
mutable std::mutex _condMut;
mutable std::condition_variable _cond;
public:
explicit Latch(uint32_t count = 0) : _count(count) {}
~Latch() { sync(); }
- void inc() { ++_count; }
+
+ void inc() {
+ std::unique_lock<std::mutex> lock(_condMut);
+ ++_count;
+ }
void dec() {
+ std::unique_lock<std::mutex> lock(_condMut);
if (--_count == 0)
_cond.notify_all();
}
More information about the llvm-commits
mailing list