In article <xfmail.990413162255....@polstra.com> you wrote: > Daniel Eischen wrote: >> John Polstra wrote: >> >>> My hunch is that it's not a fairness issue. It's just the fact that >>> when you block in disk I/O, the whole process (all threads) blocks. >> >> That statement made me think that Modula-3 had it's own threading >> support because our native threads using non-blocking file I/O.
> For disk I/O? Are you sure? If so then it must use the aio/lio calls > or something similar. Disk I/O calls _always_ block, even if you've > set O_NONBLOCK on the file descriptor. The SchedulerPosix interface in m3core exports the procedures IOWait() and IOAlertWait(), which can be used to wait for a single file descriptor without stopping other threads. These procedures are used in FilePosix.IntermittentRead to implement non-blocking reading. The default implementation does not count RegularFiles as intermittent readers and writers though: REVEAL Pipe.T = IntermittentFile BRANDED OBJECT END; Terminal.T = IntermittentFile BRANDED OBJECT END; RegularFile.T = RegularFile.Public BRANDED OBJECT OVERRIDES read := RegularFileRead; write := RegularFileWrite; seek := RegularFileSeek; flush := RegularFileFlush; lock := RegularFileLock; unlock := RegularFileUnlock END; So read calls on files always block until the Unix read call returns; no other threads can run. If the O_NONBLOCK flag on fds would work for disk I/O in FreeBSD, then the code from the intermittent read procedures in FilePosix could easily be used to let the scheduler run other threads while one thread is waiting for data from a file. As John Polstra pointed out, this seems not to be possible... Aio could probably be used, but there seems to be a shortage of man pages about aio calls in FreeBSD and I haven't got my Posix book at hand, so I'm not sure how difficult this would be. -- /\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ || Olaf Wagner | wag...@luthien.in-berlin.de (private) | || Cranachstrasse 7 | wag...@elego.de (business) | || D-12157 Berlin | phone: +49 30 85 60 26 70 | || Germany / Deutschland | fax: +49 30 85 60 26 71 | \///////////////////////////////////////////////////////////////// To Unsubscribe: send mail to majord...@freebsd.org with "unsubscribe freebsd-current" in the body of the message