[tbb-commits] [tor-browser] 07/81: Bug 1670885 - Fix post-fork() handlers for PHC/LogAlloc to work on macOS using unfair locks r=glandium
gitolite role
git at cupani.torproject.org
Tue Oct 18 16:12:01 UTC 2022
This is an automated email from the git hooks/post-receive script.
pierov pushed a commit to branch tor-browser-102.4.0esr-12.0-1
in repository tor-browser.
commit 4674aeccc882becb73eade838d74aecdb3b8061c
Author: Gabriele Svelto <gsvelto at mozilla.com>
AuthorDate: Tue Jun 7 07:37:20 2022 +0000
Bug 1670885 - Fix post-fork() handlers for PHC/LogAlloc to work on macOS using unfair locks r=glandium
macOS unfair locks enforce that a lock can only be released by the thread which locked it.
On macOS 11+ this caused the fork()'d child process to raise a SIGILL signal. Confusingly enough this behavior seems to be different on macOS 10.15 and possibly interacted in odd ways with our exception handler if it was installed before fork()-ing.
Differential Revision: https://phabricator.services.mozilla.com/D148287
---
memory/replace/logalloc/LogAlloc.cpp | 13 ++++++++-----
memory/replace/phc/PHC.cpp | 5 +++--
2 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/memory/replace/logalloc/LogAlloc.cpp b/memory/replace/logalloc/LogAlloc.cpp
index a599d6158fc2..856e49cca672 100644
--- a/memory/replace/logalloc/LogAlloc.cpp
+++ b/memory/replace/logalloc/LogAlloc.cpp
@@ -28,8 +28,8 @@ static Mutex sMutex MOZ_UNANNOTATED;
#ifndef _WIN32
static void prefork() { sMutex.Lock(); }
-
-static void postfork() { sMutex.Unlock(); }
+static void postfork_parent() { sMutex.Unlock(); }
+static void postfork_child() { sMutex.Init(); }
#endif
static size_t GetPid() { return size_t(getpid()); }
@@ -206,8 +206,11 @@ void replace_init(malloc_table_t* aTable, ReplaceMallocBridge** aBridge) {
* in the child process, will never release it, leading to a dead-lock
* whenever the child process gets the lock. We thus need to ensure no
* other thread is holding the lock before forking, by acquiring it
- * ourselves, and releasing it after forking, both in the parent and child
- * processes.
+ * ourselves, and releasing it after forking in the parent process and
+ * resetting it to its initial state in the child process. The latter is
+ * important because some implementations (notably macOS) prevent a lock from
+ * being unlocked by a different thread than the one which locked it in the
+ * first place.
* Windows doesn't have this problem since there is no fork().
* The real allocator, however, might be doing the same thing (jemalloc
* does). But pthread_atfork `prepare` handlers (first argument) are
@@ -230,6 +233,6 @@ void replace_init(malloc_table_t* aTable, ReplaceMallocBridge** aBridge) {
* So trick the real allocator into initializing itself without more side
* effects by calling malloc with a size it can't possibly allocate. */
sFuncs.malloc(-1);
- pthread_atfork(prefork, postfork, postfork);
+ pthread_atfork(prefork, postfork_parent, postfork_child);
#endif
}
diff --git a/memory/replace/phc/PHC.cpp b/memory/replace/phc/PHC.cpp
index 59e5893bb1ab..2ed103770c03 100644
--- a/memory/replace/phc/PHC.cpp
+++ b/memory/replace/phc/PHC.cpp
@@ -878,7 +878,8 @@ class GMut {
}
static void prefork() { sMutex.Lock(); }
- static void postfork() { sMutex.Unlock(); }
+ static void postfork_parent() { sMutex.Unlock(); }
+ static void postfork_child() { sMutex.Init(); }
void IncPageAllocHits(GMutLock) { mPageAllocHits++; }
void IncPageAllocMisses(GMutLock) { mPageAllocMisses++; }
@@ -1587,7 +1588,7 @@ void replace_init(malloc_table_t* aMallocTable, ReplaceMallocBridge** aBridge) {
// Note: This must run after attempting an allocation so as to give the
// system malloc a chance to insert its own atfork handler.
sMallocTable.malloc(-1);
- pthread_atfork(GMut::prefork, GMut::postfork, GMut::postfork);
+ pthread_atfork(GMut::prefork, GMut::postfork_parent, GMut::postfork_child);
#endif
// gConst and gMut are never freed. They live for the life of the process.
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the tbb-commits
mailing list