leapmotion / autowiring

A C++ Inversion of Control Framework
http://autowiring.io/
Apache License 2.0
148 stars 17 forks source link

Fix CoreJob race condition #1027

Closed gittyupagain closed 6 years ago

gittyupagain commented 6 years ago

It was possible for current event handler to be deleted twice, and also for it to inadvertently be started multiple times, causing a few user functions to be run in different threads.

One of the main issues was that, although CoreJob's OnPended function expected a lock, two different locks were being passed from different threads to the function, nullifying exclusivity. Also, the wait functions could be called from different threads, potentially causing a double free.

A test (CoreJobTest.PendFromMultipleThreads) has been added, but it doesn't fail every time without this fix. To see the failure case, the test should be repeated multiple times (using --gtest_repeat, specifying the number of runs, and --gtest_throw_on_failure, to stop on failure).