[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