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

Christophe Fergeau cfergeau at redhat.com
Tue Jan 28 13:15:19 UTC 2014


ACK

On Mon, Jan 27, 2014 at 10:53:09AM +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 | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/libvirt-glib/libvirt-glib-event.c b/libvirt-glib/libvirt-glib-event.c
> index 87019b5..1e1ffec 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,11 @@ gvir_event_handle_add(int fd,
>      data->events = events;
>      data->cb = cb;
>      data->opaque = opaque;
> +#ifdef G_OS_WIN32
> +    data->channel = g_io_channel_win32_new_socket(_get_osfhandle(fd));
> +#else
>      data->channel = g_io_channel_unix_new(fd);
> +#endif
>      data->ff = ff;
>  
>      g_debug("Add handle %p %d %d %d %p\n", data, data->watch, data->fd, events, data->opaque);
> -- 
> 1.8.4.2
> 
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20140128/94d15b5a/attachment-0001.sig>


More information about the libvir-list mailing list