diff --git a/headers/os/app/Message.h b/headers/os/app/Message.h index d9cd5101eb..a58a21ca26 100644 --- a/headers/os/app/Message.h +++ b/headers/os/app/Message.h @@ -339,6 +339,7 @@ class BMessage { port_id port, int32 token, bigtime_t timeout); static void _StaticInit(); + static void _StaticReInitForkedChild(); static void _StaticCleanup(); static void _StaticCacheCleanup(); static int32 _StaticGetCachedReplyPort(); diff --git a/headers/private/app/MessagePrivate.h b/headers/private/app/MessagePrivate.h index f30c1d8d7e..bbc79217bb 100644 --- a/headers/private/app/MessagePrivate.h +++ b/headers/private/app/MessagePrivate.h @@ -207,6 +207,12 @@ class BMessage::Private { BMessage::_StaticInit(); } + static void + StaticReInitForkedChild() + { + BMessage::_StaticReInitForkedChild(); + } + static void StaticCleanup() { diff --git a/src/kits/app/InitTerminateLibBe.cpp b/src/kits/app/InitTerminateLibBe.cpp index 351c33cc04..8f8314cecd 100644 --- a/src/kits/app/InitTerminateLibBe.cpp +++ b/src/kits/app/InitTerminateLibBe.cpp @@ -10,6 +10,7 @@ #include +#include #include #include @@ -22,6 +23,17 @@ #define OUT printf +static void +initialize_forked_child() +{ + DBG(OUT("initialize_forked_child()\n")); + + BMessage::Private::StaticReInitForkedChild(); + + DBG(OUT("initialize_forked_child() done\n")); +} + + extern "C" void initialize_before() { @@ -30,6 +42,8 @@ initialize_before() BMessage::Private::StaticInit(); BRoster::Private::InitBeRoster(); + atfork(initialize_forked_child); + DBG(OUT("initialize_before() done\n")); } diff --git a/src/kits/app/Message.cpp b/src/kits/app/Message.cpp index 19c26ffeda..3e1bd40e87 100644 --- a/src/kits/app/Message.cpp +++ b/src/kits/app/Message.cpp @@ -1971,6 +1971,22 @@ BMessage::_StaticInit() } +void +BMessage::_StaticReInitForkedChild() +{ + DEBUG_FUNCTION_ENTER2; + + // overwrite the inherited ports with a set of our own + sReplyPorts[0] = create_port(1, "tmp_rport0"); + sReplyPorts[1] = create_port(1, "tmp_rport1"); + sReplyPorts[2] = create_port(1, "tmp_rport2"); + + sReplyPortInUse[0] = 0; + sReplyPortInUse[1] = 0; + sReplyPortInUse[2] = 0; +} + + void BMessage::_StaticCleanup() {