On Sat, 17 Nov 2012 20:04:39 +0100 Thomas Martitz thomas.martitz@student.htw-berlin.de wrote:
Am 16.11.2012 21:31, schrieb Dimitar Zhekov:
Anonymous win~1 pipe fd-s are handled by giowin like regular fd-s (G_IO_WIN32_FILE_DESC), which causes problems, [...]
FWIW, I recently fought with windows fd-s too, but I don't know if it helps in Geany's case. glib's poll() is broken for non-socket fd-s (i.e. broken stdout/stdin).
IIRC they block, and simply setting them to non-blocking loads one of the processor cores at 100%, without delivering meaningful results.
There is a much better poll implementation for win32 available, at pulseaudio (contributed by me, based on gnulib's with some fixes). With that you could, in theory, monitor stdout of another process in a sensible fashion.
For POLLIN it's the same as mine. Great minds think alike. :)
For POLLOUT, your version is better, except than any fd for which PeekNamedPipe() returns an error different than ERROR_BROKEN_PIPE is automatically considered OUT. The problem would be how to integrate pa_poll() with glib main loop - g_source_add_poll() is not a regular source, it's supported internally by the context and accesses it's internal poll fields. Pulse has it's own glib-mainloop, but that's a bit on the heavy side... For OUT, I simply call write() at 50ms (configurable), and since Geany on win~1 randomly switches from using 0% CPU time to 6-7%, especially if FF/TB is running, calling write() 20 times per second makes no difference.