Finally, a new and improved IO Channel and condition watch implementation
authorTor Lillqvist <tml@iki.fi>
Sat, 29 Jul 2000 20:59:07 +0000 (20:59 +0000)
committerTor Lillqvist <tml@src.gnome.org>
Sat, 29 Jul 2000 20:59:07 +0000 (20:59 +0000)
commitb965bb5db1732cee8e0ed92d6484921a1431d6a9
treee7f697681ba7c93210a23d8139117ce83365e675
parentd33887428e66f8619f6d809fbbed2fdd8d02bcac
Finally, a new and improved IO Channel and condition watch implementation

2000-07-30  Tor Lillqvist  <tml@iki.fi>

Finally, a new and improved IO Channel and condition watch
implementation for Win32. Based on code provided by Craig Setera.

When watching file descriptors, for which there is no select()
like functionality on Win32 that would work on all Win32 platforms
for all types of file descriptors (including anonymous pipes), we
start a new thread that blocks while trying to read from the file
descriptor. When the read returns, a Win32 Event is signalled that
the polling routine eventually notices. Meanwhile, the data being
read is stored in a circular buffer, from where the IO channel's
read() method picks it up.

If the buffer fills up the reading thread has to wait for space
becoming available. For this another Win32 Event is used. The IO
Channel's read() method signals this when it has read some data
out of the buffer.

The separate reader thread(s), and the circular buffer(s) with
associated events mean lots of possibilities for fun parallellism
errors. But it seems to work OK, i.e. GIMP runs.

* gmain.c: Small changes to the Win32 polling function.
(g_main_win32_get_poll_func): New function. Perhaps it would be a
good idea to provide this on all platforms.

* giowin32.c: The bulk of the new implementation.
(g_io_channel_win32_wait_for_condition): New function. To be used
where on Unix one does a select() on the channel's fd, like
libgimp's gimp_extension_process(). Could be provided on all
platforms.

* glib.h: Update documentation for IO Channels on Win32. Remove
the declarations for the as of now obsolete old functions related
to IO Channels for pipes with "wakeup" messages.

* glib.def: Some new functions.

* tests/gio-test.c: New file, to test GIOChannel and main loop.

* tests/Makefile.am
* tests/makefile.mingw.in: Add it.
19 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-12
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
giowin32.c
glib.def
glib.h
glib/giowin32.c
glib/glib.def
glib/glib.h
glib/gmain.c
gmain.c
tests/Makefile.am
tests/gio-test.c [new file with mode: 0644]
tests/makefile.mingw.in