[libvirt] [PATCH glib] Fix event loop implementation on win32

Daniel P. Berrange berrange at redhat.com
Mon Jan 27 10:50:55 UTC 2014


On Mon, Jan 27, 2014 at 11:48:16AM +0100, Christophe Fergeau wrote:
> On Fri, Jan 24, 2014 at 05:04:31PM +0000, Daniel P. Berrange wrote:
> > Libvirt uses gnulib for making winsock look like POSIX
> > sockets. This means that in the libvirt event handle
> > callbacks the application will be given a file descriptor
> > rather than a winsock HANDLE object. The g_io_channel_unix_new
> > method will detect that it is an FD and delegate to the
> > g_io_channel_win32_new_fd method. Unfortunately the glib Win32
> > event loop impl is not very good at dealing with FD objects,
> > simulating poll() by doing a read() on the FD :-(
> > 
> > The API docs for g_io_channel_win32_new_fd say
> > 
> >  "All reads from the file descriptor should be done by
> >   this internal GLib thread. Your code should call only
> >   g_io_channel_read()."
> > 
> > This isn't going to fly for libvirt, since it has zero
> > knowledge of glib at all, so is just doing normal read().
> > 
> > Fortunately we can work around this problem by turning
> > the FD we get from libvirt back into a HANDLE using the
> > _get_osfhandle() method.
> > 
> > Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
> > ---
> >  libvirt-glib/libvirt-glib-event.c | 6 +++++-
> >  1 file changed, 5 insertions(+), 1 deletion(-)
> > 
> > diff --git a/libvirt-glib/libvirt-glib-event.c b/libvirt-glib/libvirt-glib-event.c
> > index 87019b5..826db2d 100644
> > --- a/libvirt-glib/libvirt-glib-event.c
> > +++ b/libvirt-glib/libvirt-glib-event.c
> > @@ -31,6 +31,10 @@
> >  
> >  #include "libvirt-glib/libvirt-glib.h"
> >  
> > +#ifdef G_OS_WIN32
> > +#include <io.h>
> > +#endif
> > +
> >  /**
> >   * SECTION:libvirt-glib-event
> >   * @short_description: Integrate libvirt with the GMain event framework
> > @@ -164,7 +168,7 @@ gvir_event_handle_add(int fd,
> >      data->events = events;
> >      data->cb = cb;
> >      data->opaque = opaque;
> > -    data->channel = g_io_channel_unix_new(fd);
> > +    data->channel = g_io_channel_unix_new(_get_osfhandle(fd));
> 
> Doesn't this need to be #ifdef G_OS_WIN32 ?

Doh. Don't know what I was thinking here.

Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list