[libdispatch-dev] libdispatch for Win32
DrPizza
DrPizza at quiscalusmexicanus.org
Sat Apr 23 06:23:05 PDT 2011
Replying to myself...
> Rework dispatch_sources:
> * The Windows overlapped I/O model is better than the traditional UNIX
> one, but doesn’t readily support:
> DISPATCH_SOURCE_TYPE_READ
> DISPATCH_SOURCE_TYPE_WRITE
> * But what I do have instead is initial support
> DISPATCH_SOURCE_TYPE_OIO (for "overlapped I/O")
> example: https://gist.github.com/938097
It was remiss of me to fail to point out that for sockets, specifically,
Windows does of course allow use of select(), which could be used to provide
READ/WRITE support. I could reinstate this (though it will need to go on a
different thread; one to dequeue from the IOCP, one to call select), but
select() is a poor API--O(n) performance, amongst other things--so this has
not been a priority for me.
Overlapped I/O has been my priority as it provides a uniform approach across
both files and sockets, and unlike calling select() on FDs in UNIX, it is
actually useful for local disks. select() called against disk FDs will always
return immediately, because a file is basically always deemed to be readable
and writeable (unless at EOF or similar), even if those reads and writes will,
in fact, block. Overlapped I/O allows true non-blocking operations.
Going the other way, one could envisage a DISPATCH_SOURCE_TYPE_AIO, for
FreeBSD's AIO. This would work in a manner broadly similar to my
DISPATCH_SOURCE_TYPE_OIO; in fact, I think the user interfaces for the two
could be made similar, with dispatch_source_get_data returning the OVERLAPPED
on Windows and aiocb on FreeBSD. The big difference is that I believe that
each and every aiocb used to perform an AIO operation needs to be registered
with the kqueue, so there would need to be an API to perform this registration
on a call-by-call basis, in contrast to the Windows approach where I can
simply register the _HANDLE_ against the IOCP.
Alas, AIO isn't available on Mac OS X. I don't immediately see any effective
way to do non-blocking file I/O on that platform, but perhaps I am overlooking
something.
Peter
More information about the libdispatch-dev
mailing list