Rob Arthan wrote:
David, However, while I agree that my "fix" is a hack because it's working around what looks like a bug in the old glibc, I am a little concerned that your signal handling design is not POSIX-conformant. The POSIX specification of sigaction includes the following statement:
"The result of the use of sigaction() and a sigwait() function concurrently within a process on the same signal is unspecified."
I take this to mean that if you change the disposition of a signal using sigaction() while you are waiting for it with sigwait() then the result is unspecified. So the Cygwin behaviour would be conformant. The documentation on signal() doesn't say anything about sigwait(), but it does say:
"Use of this function is unspecified in a multi-threaded process."
I think the POSIX-compliant way of implementing the ML signal function would be to service ML requests to change the disposition of a signal by waking up the signal detection thread and having it call sigaction.
Thanks for pointing this out. I've also had another look at the documentation for sigwait and discovered that the Cygwin behaviour might be acceptable, not because of the interaction with sigaction but because the behaviour of sigwait when a signal is not blocked is undefined.
As a result of all this I've revisited the whole mechanism for signal handling. The difficulty is that the pthread mutex and condition variable functions are not safe when used in a signal handler but it turns out that POSIX sem_post is safe. I've reworked the code to use a signal handler rather than sigwait and this appears to work on all the platforms I've tried, with the inevitable tweaks for the peculiarities of semaphores on Mac OS X and Cygwin.
The new version is in CVS so you can try it out if you wish. I still have to get to the bottom of the other bug.
Regards, David Copied to the mailing list for information.
I am working with named pipes to output large amounts of text to an external process. Looking at the sources of basis/TextIO.sml etc. I've got the impression that pipes are always line-buffered. Is there an easy way to get block-buffering?
Makarius
Makarius wrote:
I am working with named pipes to output large amounts of text to an external process. Looking at the sources of basis/TextIO.sml etc. I've got the impression that pipes are always line-buffered. Is there an easy way to get block-buffering?
Currently TextIO.openOut sets line buffering for terminals, pipes and devices. Looking at the Basis Library document it seems that the stream should be block buffered unless it's a terminal so I'll change this.
In the meantime you can of course use TextIO.StreamIO.setBufferMode(TextIO.getOutstream f, IO.BLOCK_BUF);
David