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).
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
'sOnPended
function expected a lock, two different locks were being passed from different threads to the function, nullifying exclusivity. Also, thewait
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).