Patchwork [1/2] qemu-ga: remove dependency on gio and gthread

login
register
mail settings
Submitter Anthony Liguori
Date July 23, 2011, 9:26 p.m.
Message ID <1311456361-14162-1-git-send-email-aliguori@us.ibm.com>
Download mbox | patch
Permalink /patch/106498/
State New
Headers show

Comments

Anthony Liguori - July 23, 2011, 9:26 p.m.
As far as I can tell, there isn't a dependency on gthread.  Also, the only use
of gio was to enable GSocket to accept a unix domain socket.

Since GSocket isn't available on OpenSuSE 11.1, let's just remove that
dependency.

Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
---
 configure |    6 +++---
 qemu-ga.c |   34 +++++++++-------------------------
 2 files changed, 12 insertions(+), 28 deletions(-)
Michael Roth - July 23, 2011, 11 p.m.
On 07/23/2011 04:26 PM, Anthony Liguori wrote:
> As far as I can tell, there isn't a dependency on gthread.  Also, the only use
> of gio was to enable GSocket to accept a unix domain socket.
>
> Since GSocket isn't available on OpenSuSE 11.1, let's just remove that
> dependency.
>
> Signed-off-by: Anthony Liguori<aliguori@us.ibm.com>
> ---
>   configure |    6 +++---
>   qemu-ga.c |   34 +++++++++-------------------------
>   2 files changed, 12 insertions(+), 28 deletions(-)
>
> diff --git a/configure b/configure
> index 6911c3b..600da9b 100755
> --- a/configure
> +++ b/configure
> @@ -1811,9 +1811,9 @@ fi
>
>   ##########################################
>   # glib support probe
> -if $pkg_config --modversion gthread-2.0 gio-2.0>  /dev/null 2>&1 ; then
> -    glib_cflags=`$pkg_config --cflags gthread-2.0 gio-2.0 2>/dev/null`
> -    glib_libs=`$pkg_config --libs gthread-2.0 gio-2.0 2>/dev/null`
> +if $pkg_config --modversion glib-2.0>  /dev/null 2>&1 ; then
> +    glib_cflags=`$pkg_config --cflags glib-2.0 2>/dev/null`
> +    glib_libs=`$pkg_config --libs glib-2.0 2>/dev/null`
>       libs_softmmu="$glib_libs $libs_softmmu"
>       libs_tools="$glib_libs $libs_tools"
>   else
> diff --git a/qemu-ga.c b/qemu-ga.c
> index 6e2f61f..5d8b7cf 100644
> --- a/qemu-ga.c
> +++ b/qemu-ga.c
> @@ -14,7 +14,6 @@
>   #include<stdio.h>
>   #include<stdbool.h>
>   #include<glib.h>
> -#include<gio/gio.h>
>   #include<getopt.h>
>   #include<termios.h>
>   #include<syslog.h>
> @@ -37,9 +36,8 @@
>   struct GAState {
>       JSONMessageParser parser;
>       GMainLoop *main_loop;
> -    GSocket *conn_sock;
> +    int conn_fd;
>       GIOChannel *conn_channel;
> -    GSocket *listen_sock;
>       GIOChannel *listen_channel;
>       const char *path;
>       const char *method;
> @@ -412,18 +410,19 @@ static gboolean listen_channel_accept(GIOChannel *channel,
>                                         GIOCondition condition, gpointer data)
>   {
>       GAState *s = data;
> -    GError *err = NULL;
>       g_assert(channel != NULL);
>       int ret;
>       bool accepted = false;
> +    struct sockaddr_un addr;
> +    socklen_t addrlen = sizeof(addr);
>
> -    s->conn_sock = g_socket_accept(s->listen_sock, NULL,&err);
> -    if (err != NULL) {
> -        g_warning("error converting fd to gsocket: %s", err->message);
> -        g_error_free(err);
> +    s->conn_fd = qemu_accept(g_io_channel_unix_get_fd(s->listen_channel),
> +                             (struct sockaddr *)&addr,&addrlen);
> +    if (s->conn_fd == -1) {
> +        g_warning("error converting fd to gsocket: %s", strerror(errno));
>           goto out;
>       }
> -    ret = conn_channel_add(s, g_socket_get_fd(s->conn_sock));
> +    ret = conn_channel_add(s, s->conn_fd);
>       if (ret) {
>           g_warning("error setting up connection");
>           goto out;
> @@ -440,19 +439,8 @@ out:
>    */
>   static int listen_channel_add(GAState *s, int listen_fd, bool new)
>   {
> -    GError *err = NULL;
> -
>       if (new) {
>           s->listen_channel = g_io_channel_unix_new(listen_fd);
> -        if (s->listen_sock) {
> -            g_object_unref(s->listen_sock);
> -        }
> -        s->listen_sock = g_socket_new_from_fd(listen_fd,&err);
> -        if (err != NULL) {
> -            g_warning("error converting fd to gsocket: %s", err->message);
> -            g_error_free(err);
> -            return -1;
> -        }
>       }
>       g_io_add_watch(s->listen_channel, G_IO_IN,
>                      listen_channel_accept, s);
> @@ -466,8 +454,7 @@ static void conn_channel_close(GAState *s)
>   {
>       if (strcmp(s->method, "unix-listen") == 0) {
>           g_io_channel_shutdown(s->conn_channel, true, NULL);
> -        g_object_unref(s->conn_sock);
> -        s->conn_sock = NULL;
> +        s->conn_fd = -1;
>           listen_channel_add(s, 0, false);
>       } else if (strcmp(s->method, "virtio-serial") == 0) {
>           /* we spin on EOF for virtio-serial, so back off a bit. also,
> @@ -624,9 +611,6 @@ int main(int argc, char **argv)
>           become_daemon(pidfile);
>       }
>
> -    g_type_init();
> -    g_thread_init(NULL);
> -
>       s = qemu_mallocz(sizeof(GAState));
>       s->conn_channel = NULL;
>       s->path = path;

Was getting hangs when using -m unix-listen. Looks like GSocket must've 
been setting O_NONBLOCK on new connections. Also the conn_sock was only 
part of GAState for cleanup purposes, so we can lose conn_fd. I sent a 
re-spin with these changes as a reply to this patch.

Patch

diff --git a/configure b/configure
index 6911c3b..600da9b 100755
--- a/configure
+++ b/configure
@@ -1811,9 +1811,9 @@  fi
 
 ##########################################
 # glib support probe
-if $pkg_config --modversion gthread-2.0 gio-2.0 > /dev/null 2>&1 ; then
-    glib_cflags=`$pkg_config --cflags gthread-2.0 gio-2.0 2>/dev/null`
-    glib_libs=`$pkg_config --libs gthread-2.0 gio-2.0 2>/dev/null`
+if $pkg_config --modversion glib-2.0 > /dev/null 2>&1 ; then
+    glib_cflags=`$pkg_config --cflags glib-2.0 2>/dev/null`
+    glib_libs=`$pkg_config --libs glib-2.0 2>/dev/null`
     libs_softmmu="$glib_libs $libs_softmmu"
     libs_tools="$glib_libs $libs_tools"
 else
diff --git a/qemu-ga.c b/qemu-ga.c
index 6e2f61f..5d8b7cf 100644
--- a/qemu-ga.c
+++ b/qemu-ga.c
@@ -14,7 +14,6 @@ 
 #include <stdio.h>
 #include <stdbool.h>
 #include <glib.h>
-#include <gio/gio.h>
 #include <getopt.h>
 #include <termios.h>
 #include <syslog.h>
@@ -37,9 +36,8 @@ 
 struct GAState {
     JSONMessageParser parser;
     GMainLoop *main_loop;
-    GSocket *conn_sock;
+    int conn_fd;
     GIOChannel *conn_channel;
-    GSocket *listen_sock;
     GIOChannel *listen_channel;
     const char *path;
     const char *method;
@@ -412,18 +410,19 @@  static gboolean listen_channel_accept(GIOChannel *channel,
                                       GIOCondition condition, gpointer data)
 {
     GAState *s = data;
-    GError *err = NULL;
     g_assert(channel != NULL);
     int ret;
     bool accepted = false;
+    struct sockaddr_un addr;
+    socklen_t addrlen = sizeof(addr);
 
-    s->conn_sock = g_socket_accept(s->listen_sock, NULL, &err);
-    if (err != NULL) {
-        g_warning("error converting fd to gsocket: %s", err->message);
-        g_error_free(err);
+    s->conn_fd = qemu_accept(g_io_channel_unix_get_fd(s->listen_channel),
+                             (struct sockaddr *)&addr, &addrlen);
+    if (s->conn_fd == -1) {
+        g_warning("error converting fd to gsocket: %s", strerror(errno));
         goto out;
     }
-    ret = conn_channel_add(s, g_socket_get_fd(s->conn_sock));
+    ret = conn_channel_add(s, s->conn_fd);
     if (ret) {
         g_warning("error setting up connection");
         goto out;
@@ -440,19 +439,8 @@  out:
  */
 static int listen_channel_add(GAState *s, int listen_fd, bool new)
 {
-    GError *err = NULL;
-
     if (new) {
         s->listen_channel = g_io_channel_unix_new(listen_fd);
-        if (s->listen_sock) {
-            g_object_unref(s->listen_sock);
-        }
-        s->listen_sock = g_socket_new_from_fd(listen_fd, &err);
-        if (err != NULL) {
-            g_warning("error converting fd to gsocket: %s", err->message);
-            g_error_free(err);
-            return -1;
-        }
     }
     g_io_add_watch(s->listen_channel, G_IO_IN,
                    listen_channel_accept, s);
@@ -466,8 +454,7 @@  static void conn_channel_close(GAState *s)
 {
     if (strcmp(s->method, "unix-listen") == 0) {
         g_io_channel_shutdown(s->conn_channel, true, NULL);
-        g_object_unref(s->conn_sock);
-        s->conn_sock = NULL;
+        s->conn_fd = -1;
         listen_channel_add(s, 0, false);
     } else if (strcmp(s->method, "virtio-serial") == 0) {
         /* we spin on EOF for virtio-serial, so back off a bit. also,
@@ -624,9 +611,6 @@  int main(int argc, char **argv)
         become_daemon(pidfile);
     }
 
-    g_type_init();
-    g_thread_init(NULL);
-
     s = qemu_mallocz(sizeof(GAState));
     s->conn_channel = NULL;
     s->path = path;