Commit 7acf192d authored by Dave Watson's avatar Dave Watson Committed by Facebook Github Bot

add AtFork::unregisterHandler

Summary: Adds an AdFork::unregisterHandler command, such that we can register and unregister fork handlers.

Reviewed By: yfeldblum

Differential Revision: D6439796

fbshipit-source-id: b710152f8cf98371c330b484cd5fe42de44e74ac
parent 9a8218df
...@@ -27,6 +27,7 @@ namespace detail { ...@@ -27,6 +27,7 @@ namespace detail {
namespace { namespace {
struct AtForkTask { struct AtForkTask {
void* object;
folly::Function<void()> prepare; folly::Function<void()> prepare;
folly::Function<void()> parent; folly::Function<void()> parent;
folly::Function<void()> child; folly::Function<void()> child;
...@@ -89,12 +90,24 @@ void AtFork::init() { ...@@ -89,12 +90,24 @@ void AtFork::init() {
} }
void AtFork::registerHandler( void AtFork::registerHandler(
void* object,
folly::Function<void()> prepare, folly::Function<void()> prepare,
folly::Function<void()> parent, folly::Function<void()> parent,
folly::Function<void()> child) { folly::Function<void()> child) {
std::lock_guard<std::mutex> lg(AtForkList::instance().tasksLock); std::lock_guard<std::mutex> lg(AtForkList::instance().tasksLock);
AtForkList::instance().tasks.push_back( 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<std::mutex> 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 } // namespace detail
......
...@@ -24,10 +24,11 @@ namespace detail { ...@@ -24,10 +24,11 @@ namespace detail {
struct AtFork { struct AtFork {
static void init(); static void init();
static void registerHandler( static void registerHandler(
void* object,
folly::Function<void()> prepare, folly::Function<void()> prepare,
folly::Function<void()> parent, folly::Function<void()> parent,
folly::Function<void()> child); folly::Function<void()> child);
static void unregisterHandler(); static void unregisterHandler(void* object);
}; };
} // namespace detail } // namespace detail
......
...@@ -317,6 +317,7 @@ struct StaticMeta : StaticMetaBase { ...@@ -317,6 +317,7 @@ struct StaticMeta : StaticMetaBase {
&StaticMeta::getThreadEntrySlow, &StaticMeta::getThreadEntrySlow,
std::is_same<AccessMode, AccessModeStrict>::value) { std::is_same<AccessMode, AccessModeStrict>::value) {
detail::AtFork::registerHandler( detail::AtFork::registerHandler(
this,
/*prepare*/ &StaticMeta::preFork, /*prepare*/ &StaticMeta::preFork,
/*parent*/ &StaticMeta::onForkParent, /*parent*/ &StaticMeta::onForkParent,
/*child*/ &StaticMeta::onForkChild); /*child*/ &StaticMeta::onForkChild);
......
/*
* Copyright 2017-present Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <folly/detail/AtFork.h>
#include <folly/portability/GTest.h>
#include <glog/logging.h>
TEST(ThreadLocal, AtFork) {
int foo;
bool forked = false;
folly::detail::AtFork::registerHandler(
&foo, [&] { forked = true; }, [] {}, [] {});
auto pid = fork();
if (pid) {
int status;
auto pid2 = wait(&status);
EXPECT_EQ(status, 0);
EXPECT_EQ(pid, pid2);
} else {
exit(0);
}
EXPECT_TRUE(forked);
forked = false;
folly::detail::AtFork::unregisterHandler(&foo);
pid = fork();
if (pid) {
int status;
auto pid2 = wait(&status);
EXPECT_EQ(status, 0);
EXPECT_EQ(pid, pid2);
} else {
exit(0);
}
EXPECT_FALSE(forked);
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment