diff options
author | das <das> | 2007-06-23 00:23:30 (GMT) |
---|---|---|
committer | das <das> | 2007-06-23 00:23:30 (GMT) |
commit | 689380c8d2a1a47c3dcf1c67561d18efe1b85489 (patch) | |
tree | a065d2e9624f9e2c67f3cda37bc1dfd5866d4187 /macosx/tclMacOSXNotify.c | |
parent | 502f655491642c7cc617929b6e51b9e966d317bd (diff) | |
download | tcl-689380c8d2a1a47c3dcf1c67561d18efe1b85489.zip tcl-689380c8d2a1a47c3dcf1c67561d18efe1b85489.tar.gz tcl-689380c8d2a1a47c3dcf1c67561d18efe1b85489.tar.bz2 |
* macosx/tclMacOSXNotify.c (AtForkChild): don't call CoreFoundation
APIs after fork() on systems where that would lead to an abort().
Diffstat (limited to 'macosx/tclMacOSXNotify.c')
-rw-r--r-- | macosx/tclMacOSXNotify.c | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/macosx/tclMacOSXNotify.c b/macosx/tclMacOSXNotify.c index be3b162..04171c7 100644 --- a/macosx/tclMacOSXNotify.c +++ b/macosx/tclMacOSXNotify.c @@ -12,7 +12,7 @@ * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclMacOSXNotify.c,v 1.14 2007/04/23 20:46:14 das Exp $ + * RCS: @(#) $Id: tclMacOSXNotify.c,v 1.15 2007/06/23 00:23:30 das Exp $ */ #include "tclInt.h" @@ -319,6 +319,21 @@ static void AtForkChild(void); extern int pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void)) WEAK_IMPORT_ATTRIBUTE; #endif /* HAVE_WEAK_IMPORT */ +#ifdef __LP64__ +/* + * On 64bit Darwin 9 and later, it is not possible to call CoreFoundation after + * a fork. + */ +#if !defined(MAC_OS_X_VERSION_MIN_REQUIRED) || + MAC_OS_X_VERSION_MIN_REQUIRED < 1050 +MODULE_SCOPE long tclMacOSXDarwinRelease; +#define noCFafterFork (tclMacOSXDarwinRelease >= 9) +#else /* MAC_OS_X_VERSION_MIN_REQUIRED */ +#define noCFafterFork 1 +#endif /* MAC_OS_X_VERSION_MIN_REQUIRED */ +#else /* __LP64__ */ +#define noCFafterFork 0 +#endif /* __LP64__ */ #endif /* HAVE_PTHREAD_ATFORK */ /* @@ -1314,7 +1329,9 @@ AtForkChild(void) UNLOCK_NOTIFIER_INIT; if (tsdPtr->runLoop) { tsdPtr->runLoop = NULL; - CFRunLoopSourceInvalidate(tsdPtr->runLoopSource); + if (!noCFafterFork) { + CFRunLoopSourceInvalidate(tsdPtr->runLoopSource); + } CFRelease(tsdPtr->runLoopSource); tsdPtr->runLoopSource = NULL; } @@ -1330,7 +1347,9 @@ AtForkChild(void) * Tcl_AlertNotifier may break in the child. */ - Tcl_InitNotifier(); + if (!noCFafterFork) { + Tcl_InitNotifier(); + } } } #endif /* HAVE_PTHREAD_ATFORK */ |