Read about our upcoming Code of Conduct on this issue

Commit 0d825404 authored by Augie Fackler's avatar Augie Fackler
Browse files

procutil: try and avoid angering CoreFoundation on macOS

We've seen failures like this:

    objc[57662]: +[__NSCFConstantString initialize] may have been in progress in another thread when fork() was called.
    objc[57662]: +[__NSCFConstantString initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug.

I think this is due to forking off some background processes during
`hg update` or similar. I don't have any conclusive proof this is the
fork() call that's to blame, but it's the most likely one since the
regular `hg update` codepath uses the other fork() invocation (via
workers) and we don't get this report from non-Google macOS users.

Ugh.

Differential Revision: https://phab.mercurial-scm.org/D7615
parent f2de8dc9c52f
......@@ -423,7 +423,10 @@ def system(cmd, environ=None, cwd=None, out=None):
return rc
def gui():
_is_gui = None
def _gui():
'''Are we running in a GUI?'''
if pycompat.isdarwin:
if b'SSH_CONNECTION' in encoding.environ:
......@@ -439,6 +442,13 @@ def gui():
return pycompat.iswindows or encoding.environ.get(b"DISPLAY")
def gui():
global _is_gui
if _is_gui is None:
_is_gui = _gui()
return _is_gui
def hgcmd():
"""Return the command used to execute current hg
......@@ -583,6 +593,11 @@ else:
`Subprocess.wait` function for the spawned process. This is mostly
useful for developers that need to make sure the spawned process
finished before a certain point. (eg: writing test)'''
if pycompat.isdarwin:
# avoid crash in CoreFoundation in case another thread
# calls gui() while we're calling fork().
gui()
# double-fork to completely detach from the parent process
# based on http://code.activestate.com/recipes/278731
if record_wait is None:
......
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