Fix EventBaseLoopController destruction races
authorAndrii Grynenko <andrii@fb.com>
Thu, 17 Dec 2015 21:03:15 +0000 (13:03 -0800)
committerfacebook-github-bot-0 <folly-bot@fb.com>
Thu, 17 Dec 2015 21:20:22 +0000 (13:20 -0800)
commit60345760e93bb6dda27626afc4b2c17f6a1ce93f
treeffcc63f76fb1a6f79a8498f051516bd86cd713c3
parent66dd2aa10938ca2ae6cec60c1295b2f46501e3f5
Fix EventBaseLoopController destruction races

Summary:
Existing scheduleThreadSafe implementation had 2 potential races on destruction:
1. (very unlikely) insertHead is complete, but fiber loop is already running on another thread, so it finishes processing all of the fibers, destroys FiberManager or EventBase or both. By the time we get to scheduleThreadSafe EventBaseLoopController is already destoyed
2. (more likely) scheduleThreadSafe is complete, but FiberManager loop which is already running, picks complete fiber, finishes the processing. After that FiberManager may be destoyed. So when EventBase actually executes the callback FiberManager is already dead.

This solution fixes both races. Holding the alive shared_ptr when completing sheduleThreadSafe assures EventBase can't be destoyed until its completed (or it won't try to schedule anything after EventBase was destroyed). Locking alive weak_ptr in the EventBase loop callback ensures FiberManager and thus EventBaseLoopController were not destroyed yet (they can be destoyed only by the same thread which is running EventBase loop).

Reviewed By: spalamarchuk

Differential Revision: D2763206

fb-gh-sync-id: 1972d6c0c11aa931747ebdaed4029a209130f69c
folly/experimental/fibers/EventBaseLoopController-inl.h
folly/experimental/fibers/EventBaseLoopController.h
folly/experimental/fibers/FiberManager-inl.h
folly/experimental/fibers/FiberManager.cpp
folly/experimental/fibers/LoopController.h
folly/experimental/fibers/SimpleLoopController.h