I'm debugging a non-trivial multithreaded unit test in the current version of lang/ghc. It runs into some kind of unexpected condition not handled well by GHC. I suspect we do something non-standard to cause this behavior. These two ktrace items illustrate the issue:
12550/209588 T21651 CALL kevent(217,0x211906e98,1,0,0,0x211906e78) 12550/209588 T21651 STRU struct kevent { ident=13, filter=EVFILT_WRITE, flags=0x11<EV_ADD|EV_ONESHOT>, fflags=0x2<NOTE_EOF>, data=0, udata=0x0 } 12550/209588 T21651 RET kevent -1 errno 32 Broken pipe 12550/209588 T21651 CALL kevent(217,0x211906ee8,1,0,0,0x211906ec8) 12550/209588 T21651 STRU struct kevent { ident=13, filter=EVFILT_WRITE, flags=0x2<EV_DELETE>, fflags=0x2<NOTE_EOF>, data=0, udata=0x0 } 12550/209588 T21651 RET kevent -1 errno 2 No such file or directory errno 2 is the reason GHC goes berserk, but it seems like the earlier return of errno 32 (EPIPE) is the first time things go wrong. I don't see EPIPE documented as a valid error in kevent(2). It's also nowhere to be found in sys/kern/kern_event.c. This errno value pops up from some other place that I can't quickly locate. So, is EPIPE a valid errno which we should document or a kernel bug? The complete ktrace in case somebody can glean more out of that pile: https://github.com/blackgnezdo/blackgnezdo.github.io/blob/junk/ktrace.out.gz?raw=true I'm running a May 1 snapshot on amd64. Thanks Greg