X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2Fdetail%2FAtFork.cpp;h=48c42fd31afc3852e7818c1040136a7a8926d487;hb=24d6b776bc7f5608d7e553f361eb79f2dcf6d7f7;hp=e33b57922f39f6441ae08e0ce7ed2a24c07d8563;hpb=f089f1fde3ef52161c6630e8b0e78004af6161ae;p=folly.git diff --git a/folly/detail/AtFork.cpp b/folly/detail/AtFork.cpp index e33b5792..48c42fd3 100644 --- a/folly/detail/AtFork.cpp +++ b/folly/detail/AtFork.cpp @@ -27,6 +27,7 @@ namespace detail { namespace { struct AtForkTask { + void* object; folly::Function prepare; folly::Function parent; folly::Function child; @@ -89,12 +90,24 @@ void AtFork::init() { } void AtFork::registerHandler( + void* object, folly::Function prepare, folly::Function parent, folly::Function child) { std::lock_guard lg(AtForkList::instance().tasksLock); AtForkList::instance().tasks.push_back( - {std::move(prepare), std::move(parent), std::move(child)}); + {object, std::move(prepare), std::move(parent), std::move(child)}); +} + +void AtFork::unregisterHandler(void* object) { + auto& list = AtForkList::instance(); + std::lock_guard lg(list.tasksLock); + for (auto it = list.tasks.begin(); it != list.tasks.end(); ++it) { + if (it->object == object) { + list.tasks.erase(it); + return; + } + } } } // namespace detail