[Spice-devel] [PATCH v4 0/5] Event loop improves

Christophe Fergeau cfergeau at redhat.com
Wed Jan 20 05:55:03 PST 2016


On Tue, Jan 19, 2016 at 11:54:47AM +0000, Frediano Ziglio wrote:
> These set of patches try to improve current event loop code.
> 
> Patches improve test event loop, make a template from
> them and use for main loop.
> These patches also improve glib main loop patch from Marc and
> supercede fixes for timers reducing original patch size and making
> easier to test code.
> 
> Changes from v3:
> - reintroduced template file. This is necessary after libserver library.
>   The reason is that the module file was using some function exported
>   by red-worker.c (and so libserver) while the same module is used by
>   libtest, included by all tests so using libtest and libserver was
>   not possible;

Not exactly sure what issue you are describing here. The patch below
seems to be working for me (both make check and the VMs I've tested
with). The tests/Makefile.am changes are probably a bit rough. I have a
split series I can send if this makes sense.

diff --git a/server/Makefile.am b/server/Makefile.am
index 5d65526..411a0d9 100644
--- a/server/Makefile.am
+++ b/server/Makefile.am
@@ -70,6 +70,7 @@ libserver_la_SOURCES =                                \
    char-device.c                               \
    char-device.h                               \
    demarshallers.h                             \
+       event-loop.c                            \
    glz-encoder.c                               \
    glz-encoder.h                               \
    glz-encoder-dict.c          \
@@ -157,7 +158,6 @@ EXTRA_DIST =                                        \
    cache-item.tmpl.c                   \
    glz-encode-match.tmpl.c                     \
    glz-encode.tmpl.c                   \
-       event-loop.tmpl.c                       \
    spice-server.syms                   \
    $(NULL)
 
diff --git a/server/event-loop.tmpl.c b/server/event-loop.c
similarity index 91%
rename from server/event-loop.tmpl.c
rename to server/event-loop.c
index 9d253d9..7581437 100644
--- a/server/event-loop.tmpl.c
+++ b/server/event-loop.c
@@ -23,11 +23,6 @@
  * This file export a variable:
  *
  * SpiceCoreInterfaceInternal event_loop_core;
- *
- * You should also define some functions like:
- *
- * GMainContext *event_loop_context_from_iface(const SpiceCoreInterfaceInternal *opaque);
- * void event_loop_channel_event(int event, SpiceChannelEventInfo *info);
  */
 
 #include "red-common.h"
@@ -44,7 +39,7 @@ static SpiceTimer* timer_add(const SpiceCoreInterfaceInternal *iface,
 {
     SpiceTimer *timer = spice_malloc0(sizeof(SpiceTimer));
 
-    timer->context = event_loop_context_from_iface(iface);
+    timer->context = iface->main_context;
     timer->func = func;
     timer->opaque = opaque;
 
@@ -157,7 +152,7 @@ static SpiceWatch *watch_add(const SpiceCoreInterfaceInternal *iface,
     spice_return_val_if_fail(func != NULL, NULL);
 
     watch = spice_malloc0(sizeof(SpiceWatch));
-    watch->context = event_loop_context_from_iface(iface);
+    watch->context = iface->main_context;
     watch->channel = g_io_channel_unix_new(fd);
     watch->func = func;
     watch->opaque = opaque;
@@ -176,7 +171,7 @@ static void watch_remove(SpiceWatch *watch)
     free(watch);
 }
 
-static SpiceCoreInterfaceInternal event_loop_core = {
+SpiceCoreInterfaceInternal event_loop_core = {
     .timer_add = timer_add,
     .timer_start = timer_start,
     .timer_cancel = timer_cancel,
@@ -185,6 +180,4 @@ static SpiceCoreInterfaceInternal event_loop_core = {
     .watch_add = watch_add,
     .watch_update_mask = watch_update_mask,
     .watch_remove = watch_remove,
-
-    .channel_event = event_loop_channel_event
 };
diff --git a/server/red-common.h b/server/red-common.h
index 253dc45..90a7d20 100644
--- a/server/red-common.h
+++ b/server/red-common.h
@@ -52,6 +52,10 @@ struct SpiceCoreInterfaceInternal {
     void (*watch_remove)(SpiceWatch *watch);
 
     void (*channel_event)(int event, SpiceChannelEventInfo *info);
+
+    GMainContext *main_context;
 };
 
+extern SpiceCoreInterfaceInternal event_loop_core;
+
 #endif
diff --git a/server/red-worker.c b/server/red-worker.c
index 24bb435..3d48968 100644
--- a/server/red-worker.c
+++ b/server/red-worker.c
@@ -516,12 +516,6 @@ static inline GMainContext *event_loop_context_from_iface(const SpiceCoreInterfa
     return worker->main_context;
 }
 
-static void event_loop_channel_event(int event, SpiceChannelEventInfo *info)
-{
-}
-
-#include "event-loop.tmpl.c"
-
 CommonChannelClient *common_channel_new_client(CommonChannel *common,
                                                int size,
                                                RedClient *client,
@@ -1541,8 +1535,9 @@ RedWorker* red_worker_new(QXLInstance *qxl, RedDispatcher *red_dispatcher)
     qxl->st->qif->get_init_info(qxl, &init_info);
 
     worker = spice_new0(RedWorker, 1);
-    worker->core = event_loop_core;
     worker->main_context = g_main_context_new();
+    event_loop_core.main_context = worker->main_context;
+    worker->core = event_loop_core;
 
     record_filename = getenv("SPICE_WORKER_RECORD_FILENAME");
     if (record_filename) {
diff --git a/server/tests/Makefile.am b/server/tests/Makefile.am
index 6f02c99..000b097 100644
--- a/server/tests/Makefile.am
+++ b/server/tests/Makefile.am
@@ -27,10 +27,15 @@ libtest_a_SOURCES =                         \
    test_display_base.h                 \
    $(NULL)
 
+libtest_a_LIBADD =                             \
+       $(top_builddir)/server/libserver.la     \
+       $(top_builddir)/spice-common/common/libspice-common.la  \
+       $(NULL)
+
 LDADD =                                                                \
    libtest.a                                           \
+       $(top_builddir)/server/libserver.la     \
    $(top_builddir)/spice-common/common/libspice-common.la      \
-       $(top_builddir)/server/libspice-server.la               \
    $(GLIB2_LIBS)                                               \
    $(SPICE_NONPKGCONFIG_LIBS)                          \
    $(NULL)
@@ -70,8 +75,6 @@ noinst_LIBRARIES += \
 
 spice_server_replay_SOURCES = replay.c
 
-stream_test_LDADD = ../libserver.la $(LDADD)
-
 stat_test_SOURCES = stat-main.c
 stat_test_LDADD = \
    libstat_test1.a \
diff --git a/server/tests/basic_event_loop.c b/server/tests/basic_event_loop.c
index 997d251..3f1bc71 100644
--- a/server/tests/basic_event_loop.c
+++ b/server/tests/basic_event_loop.c
@@ -43,19 +43,12 @@ GMainContext *basic_event_loop_get_context(void)
     return main_context;
 }
 
-static inline GMainContext *event_loop_context_from_iface(const SpiceCoreInterfaceInternal *iface)
-{
-    return main_context;
-}
-
 static void event_loop_channel_event(int event, SpiceChannelEventInfo *info)
 {
     DPRINTF(0, "channel event con, type, id, event: %d, %d, %d, %d",
             info->connection_id, info->type, info->id, event);
 }
 
-#include "../event-loop.tmpl.c"
-
 void basic_event_loop_mainloop(void)
 {
     GMainLoop *loop = g_main_loop_new(main_context, FALSE);
@@ -76,12 +69,12 @@ static void ignore_sigpipe(void)
 
 static SpiceTimer* base_timer_add(SpiceTimerFunc func, void *opaque)
 {
-    return event_loop_core.timer_add(NULL, func, opaque);
+    return event_loop_core.timer_add(&event_loop_core, func, opaque);
 }
 
 static SpiceWatch *base_watch_add(int fd, int event_mask, SpiceWatchFunc func, void *opaque)
 {
-    return event_loop_core.watch_add(NULL, fd, event_mask, func, opaque);
+    return event_loop_core.watch_add(&event_loop_core, fd, event_mask, func, opaque);
 }
 
 static SpiceCoreInterface core = {
@@ -91,7 +84,6 @@ static SpiceCoreInterface core = {
     },
     .timer_add = base_timer_add,
     .watch_add = base_watch_add,
-    .channel_event = event_loop_channel_event,
 };
 
 SpiceCoreInterface *basic_event_loop_init(void)
@@ -104,6 +96,9 @@ SpiceCoreInterface *basic_event_loop_init(void)
     core.timer_remove = event_loop_core.timer_remove;
     core.watch_update_mask = event_loop_core.watch_update_mask;
     core.watch_remove = event_loop_core.watch_remove;
+    event_loop_core.channel_event = core.channel_event = event_loop_channel_event;
+    event_loop_core.main_context = main_context;
+
     return &core;
 }
 

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/spice-devel/attachments/20160120/f83976be/attachment.sig>


More information about the Spice-devel mailing list