[M3devel] Unix signals and Modula-3...
Tony Hosking
hosking at cs.purdue.edu
Wed Dec 19 00:23:49 CET 2007
I'm assuming that waitpid hanging when using system threads is not a
problem, since the system thread scheduler will schedule other
threads around the waiting one. The issue is only for the user-level
threads implementation where a thread blocking on a waitpid call
would prevent other threads being scheduled.
On Dec 18, 2007, at 7:38 AM, Mika Nystrom wrote:
> Hello everyone,
>
> I am in the process of bootstrapping the CVS head of CM3 on an old
> FreeBSD-4.11 system, and at one point, when I replaced the old cm3
> with the new cm3, the compiler got slower. Not a little bit slower,
> mind you, but about 10x slower. I remember pointing this out to
> the m3devel list... oh it must have been three or four years ago;
> one of our grad students at Caltech (Karl Papadantonakis, also
> author of the caltech-parser) was the first to notice what was going
> on.
>
> It has to do with Process.Wait. (From ProcessPosix.m3.) To repeat
> what I said a few years ago, the problem lies here:
>
> CONST Delay = 0.1D0;
> BEGIN
> IF NOT p.waitOk THEN RAISE WaitAlreadyCalled END;
> p.waitOk := FALSE;
> (* By rights, the SchedulerPosix interface should have a WaitPID
> procedure that is integrated with the thread scheduler. *)
> LOOP
> result := Uexec.waitpid(p.pid, ADR(statusT), Uexec.WNOHANG);
> IF result # 0 THEN EXIT END;
> Thread.Pause(Delay)
> END;
> <* ASSERT result > 0 *>
>
> In other words: if Process.Wait is called before the child process
> is done, then the thread pauses 0.1 seconds.
>
> In our local version of m3build, we duplicate the Wait code and set
> the Delay to 0.0. That's OK in a compiler, but it's not OK in
> general, because you would chew up the CPU on a machine that was
> doing a lot of long-term waiting.
>
> The problem is that the fix that I suggested way back when requires
> messing with Unix signals (catching SIGC[H]LD instead of using
> waitpid), which is why I never submitted a fix to the repository,
> because I am not sure what such a fix might interact with. It seems
> to me that the correct way of dealing with Unix signals is to have
> a single thread that talks to the Unix system, registers signal
> handlers, and takes care, via some object-oriented mechanism, of
> calling back any M3 threads that are interested in the signals.
> Would such a thing be possible? Where are signals used in the
> system today?
>
> Mika
More information about the M3devel
mailing list