? atfork2-cvsup.txt ? cvpasswd/AMD64_DARWIN Index: suplib/src/SigHandler.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-tools/cvsup/suplib/src/SigHandler.m3,v retrieving revision 1.3 diff -u -r1.3 SigHandler.m3 --- suplib/src/SigHandler.m3 18 Mar 2010 10:55:48 -0000 1.3 +++ suplib/src/SigHandler.m3 19 Mar 2010 17:06:13 -0000 @@ -45,9 +45,8 @@ UNSAFE MODULE SigHandler; IMPORT - Ctypes, SchedulerPosix, Thread, Uerror, Unix, UnixMisc, Uuio, Word; - -IMPORT Cerrno; + Ctypes, SchedulerPosix, Thread, Uerror, Unix, UnixMisc, Uuio, Word, + Cerrno, RTOS; TYPE Dispatcher = Thread.Closure OBJECT @@ -255,11 +254,43 @@ BEGIN ChangeState(dispatcher, State.ShutDown); END ShutDown; - + PROCEDURE Unblock() = BEGIN ChangeState(dispatcher, State.Running); END Unblock; +PROCEDURE PThreadAtForkPrepare() = + BEGIN + Thread.Acquire(dispatcher.mu); + END PThreadAtForkPrepare; + +PROCEDURE PThreadAtForkParent() = + BEGIN + Thread.Release(dispatcher.mu); + END PThreadAtForkParent; + +PROCEDURE PThreadAtForkChild() = + BEGIN + PThreadAtForkParent(); + dispatcher.state := State.ShutDown; + DoShutDown(dispatcher); + (* A more faithful implementation would + * reinitialize and reestablish + * the parent's handlers, + * but we know that shutting down + * is sufficient. In fact, the thread is already + * gone (faithful implementation would restart it). + *) +END PThreadAtForkChild; + BEGIN + VAR + r: Ctypes.int; + BEGIN + r := RTOS.PThreadAtFork(PThreadAtForkPrepare, + PThreadAtForkParent, + PThreadAtForkChild); + <* ASSERT r = 0 *> + END; END SigHandler.