? m3-tools/cvsup/cvpasswd/AMD64_DARWIN Index: m3-tools/cvsup/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 --- m3-tools/cvsup/suplib/src/SigHandler.m3 18 Mar 2010 10:55:48 -0000 1.3 +++ m3-tools/cvsup/suplib/src/SigHandler.m3 20 Mar 2010 20:43:43 -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, RTProcess; TYPE Dispatcher = Thread.Closure OBJECT @@ -255,11 +254,41 @@ BEGIN ChangeState(dispatcher, State.ShutDown); END ShutDown; - + PROCEDURE Unblock() = BEGIN ChangeState(dispatcher, State.Running); END Unblock; +PROCEDURE AtForkPrepare() = + BEGIN + Thread.Acquire(dispatcher.mu); + END AtForkPrepare; + +PROCEDURE AtForkParent() = + BEGIN + Thread.Release(dispatcher.mu); + END AtForkParent; + +PROCEDURE AtForkChild() = + BEGIN + AtForkParent(); + 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 AtForkChild; + BEGIN + VAR r: INTEGER; + BEGIN + r := RTProcess.RegisterForkHandlers( + AtForkPrepare, AtForkParent, AtForkChild); + <* ASSERT r = 0 *> + END; END SigHandler.