> > This can arise if you do one of the operations threadWaitRead or > > threadWaitWrite on a file descriptor that is closed. > Sigbjorn recently > > modified the select() code so that it wouldn't fail in such > an ugly way; > > now it just wakes up all the threads that were doing select() in the > > hope that the one with a bad file descriptor in its hands > will discover > > it some other way (the real problem is that select() doesn't tell us > > which file desriptors were bad/closed when it fails). > > > > Anyway, you should avoid this scenario if at all possible, since the > > current fall-back method of waking up all the threads could be quite > > expensive. > > I use `threadWaitRead` in one place and `threadWaitWrite` nowhere. I > added a check before the use of `threadWaitRead` that I've > not closed the > file descriptor. The check never detects a closed file > descriptor, yet I still get the select() failure.
Hmm, then I don't know what is going wrong. Perhaps you could reduce it to a small example and post it? > I'm assuming that the RTS's select() is done on the sets of file > descriptors involved in current `threadWaitRead` and `threadWaitWrite` > calls. Is that true? Are there other uses of select() in the RTS? No, that's the only select() call. > > > Unfortunately, select() (and hence the GHC RTS) doesn't > > > identify the bad > > > descriptor(s). Here's where I suspect my program may be > > > going awry. The > > > main process creates a pipe. The process then forks. The > > > parent closes > > > the pipe's read descriptor immediately. The child soon goes > > > to read from > > > the pipe, using threadWaitRead followed by fdRead. The > child process > > > suffers the select failure shown above. > > > > So.. I take it the child shouldn't really be reading from a > closed file > > descriptor? > > The file descriptor is the read end of a pipe used to send > data from the > parent to the child. The parent closes it because it will > never use it, > but only after the parent forks. So the child's copy of the file > descriptor should still be open, n'est-ce pas? Yes, seems reasonable to me. Are there any other file descriptors that you are closing? Are you doing any lazy I/O? > > > By the way, why shouldn't such a "fatal error" in the RTS raise an > > > exception that I can catch in my program? I could then > > > determine at least > > > which thread in which process suffered the error. > > > > A 'fatal error' in the RTS usually means some kind of internal error > > which it isn't possible to recover from. Hence the term "fatal" :-) > > I've changed the wording in my copy to make it more clear that these > > errors are internal and normally indicate a bug. > > Is recovering from this error really not possible, as opposed to not > likely to be useful? Recovery is possible; as I mentioned the latest code in the HEAD does recover. Reporting an error is somewhat impractical, however, because select() doesn't tell us which of the file descriptors was bad. Cheers, Simon _______________________________________________ Glasgow-haskell-bugs mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs