> On Oct. 17, 2014, 6:46 p.m., Niklas Nielsen wrote:
> > Hey Joris,
> > 
> > Can you file a JIRA ticket on the issue?
> > 
> > Also, do you know why multiple threads where calling the destructor?
> 
> Joris Van Remoortere wrote:
>     It is not the case that multiple threads are calling the destructor. It 
> is the case that a thread joining (await) on the latch could then destroy the 
> latch after it has joined. This condition can happen before the 
> terminate(pid) in trigger() is fully completed. In this case terminate(pid) 
> is called twice which can cause a segfault. The extra atomic check helps 
> prevent the 2nd terminate.

I am curious why calling terminte() twice will lead to a segfault?


- Jie


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/26783/#review57188
-----------------------------------------------------------


On Oct. 22, 2014, 6:55 p.m., Joris Van Remoortere wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/26783/
> -----------------------------------------------------------
> 
> (Updated Oct. 22, 2014, 6:55 p.m.)
> 
> 
> Review request for mesos, Benjamin Hindman and Niklas Nielsen.
> 
> 
> Bugs: MESOS-1968
>     https://issues.apache.org/jira/browse/MESOS-1968
> 
> 
> Repository: mesos-git
> 
> 
> Description
> -------
> 
> There is a race condition in Latch. The same pid can be terminated by 2 
> seperate threads simultaneously.
> 
> 
> Diffs
> -----
> 
>   3rdparty/libprocess/src/latch.cpp 89185ec 
> 
> Diff: https://reviews.apache.org/r/26783/diff/
> 
> 
> Testing
> -------
> 
> make check
> 
> The following test could segfault before: (after this patch it does not)
> 
> ```
> auto do_launch = []() {
>   std::mutex mut;
>   std::condition_variable cond;
>   bool ready = true;
>   Latch *latch = new Latch();
>   const size_t num_iter = 10000;
>   std::thread t1([&]() {
>     for (size_t i = 0; i < num_iter; ++i) {
>       {
>         std::unique_lock<std::mutex> lock(mut);
>         while (!ready) {
>           cond.wait(lock);
>         }
>         ready = false;
>       }
>       latch->trigger();
>     }
>   });
>   std::thread t2([&]() {
>     for (size_t i = 0; i < num_iter; ++i) {
>       latch->await();
>       delete latch;
>       latch = new Latch();
>       std::lock_guard<std::mutex> lock(mut);
>       ready = true;
>       cond.notify_one();
>     }
>   });
>   t1.join();
>   t2.join();
> };
> const size_t nthread = 16;
> std::vector<std::thread> tvec;
> for (size_t i = 0; i < nthread; ++i) {
>   tvec.emplace_back(do_launch);
> }
> for (auto& t : tvec) {
>   t.join();
> }
> ```
> 
> 
> Thanks,
> 
> Joris Van Remoortere
> 
>

Reply via email to