[llvm] r265618 - Fix a race condition in support library ThreadPool.

Kostya Serebryany via llvm-commits llvm-commits at lists.llvm.org
Fri Apr 15 17:29:12 PDT 2016


ouch!
Will it make sense to add a tsan bot to the sanitizer bot where we
currently run asan, ubsan, and msan, but not tsan?
If yes, which tests to run? (if not all of "check-llvm")?

--kcc

On Wed, Apr 6, 2016 at 4:46 PM, Justin Lebar via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: jlebar
> Date: Wed Apr  6 18:46:40 2016
> New Revision: 265618
>
> URL: http://llvm.org/viewvc/llvm-project?rev=265618&view=rev
> Log:
> Fix a race condition in support library ThreadPool.
>
> By running TSAN on the ThreadPool unit tests it was discovered that the
> threads in the pool can pop tasks off the queue at the same time the
> "wait" routine is trying to check if the task queue is empty. This patch
> fixes this problem by checking for active threads in the waiter before
> checking whether the queue is empty.
>
> Patch by Jason Henline.
>
> Differential Revision: http://reviews.llvm.org/D18811
>
> Reviewers: joker.eph, jlebar
>
> Modified:
>     llvm/trunk/lib/Support/ThreadPool.cpp
>
> Modified: llvm/trunk/lib/Support/ThreadPool.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/ThreadPool.cpp?rev=265618&r1=265617&r2=265618&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Support/ThreadPool.cpp (original)
> +++ llvm/trunk/lib/Support/ThreadPool.cpp Wed Apr  6 18:46:40 2016
> @@ -75,8 +75,11 @@ ThreadPool::ThreadPool(unsigned ThreadCo
>  void ThreadPool::wait() {
>    // Wait for all threads to complete and the queue to be empty
>    std::unique_lock<std::mutex> LockGuard(CompletionLock);
> +  // The order of the checks for ActiveThreads and Tasks.empty() matters
> because
> +  // any active threads might be modifying the Tasks queue, and this
> would be a
> +  // race.
>    CompletionCondition.wait(LockGuard,
> -                           [&] { return Tasks.empty() && !ActiveThreads;
> });
> +                           [&] { return !ActiveThreads && Tasks.empty();
> });
>  }
>
>  std::shared_future<ThreadPool::VoidTy> ThreadPool::asyncImpl(TaskTy Task)
> {
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160415/43ff8a8f/attachment.html>


More information about the llvm-commits mailing list