[Spice-devel] [spice-server 2/4] event-loop: Remove template

Christophe Fergeau cfergeau at redhat.com
Thu Jan 21 05:14:57 PST 2016


Since SpiceCoreInterfaceInternal is a private data structure, we can
extend it as we see fit without breaking ABI. In particular, adding a
GMainContext member to it allows us to remove the need for
the event loop template which is currently included in the
basic_event_loop.c test file.
---
 server/Makefile.am                         |  2 +-
 server/{event-loop.tmpl.c => event-loop.c} | 20 +++++---------------
 server/red-common.h                        |  4 ++++
 server/tests/Makefile.am                   |  6 ++----
 server/tests/basic_event_loop.c            | 11 +++--------
 5 files changed, 15 insertions(+), 28 deletions(-)
 rename server/{event-loop.tmpl.c => event-loop.c} (87%)

diff --git a/server/Makefile.am b/server/Makefile.am
index bef999d..92b716f 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		\
@@ -159,7 +160,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 87%
rename from server/event-loop.tmpl.c
rename to server/event-loop.c
index 9d253d9..4738ed9 100644
--- a/server/event-loop.tmpl.c
+++ b/server/event-loop.c
@@ -16,18 +16,10 @@
    License along with this library; if not, see <http://www.gnu.org/licenses/>.
 */
 
-/* This is a template file to implement event loop using GLib one.
- *
- * Is implemented as a template file to avoid some linker problem.
- *
- * This file export a variable:
+/*
+ *This file export a global 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 +36,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 +149,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 +168,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 +177,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/tests/Makefile.am b/server/tests/Makefile.am
index 6f02c99..fea2181 100644
--- a/server/tests/Makefile.am
+++ b/server/tests/Makefile.am
@@ -30,9 +30,9 @@ libtest_a_SOURCES =				\
 LDADD =								\
 	libtest.a						\
 	$(top_builddir)/spice-common/common/libspice-common.la	\
-	$(top_builddir)/server/libspice-server.la		\
+	$(top_builddir)/server/libserver.la			\
 	$(GLIB2_LIBS)						\
-	$(SPICE_NONPKGCONFIG_LIBS)		                \
+	$(SPICE_NONPKGCONFIG_LIBS)				\
 	$(NULL)
 
 noinst_PROGRAMS =				\
@@ -70,8 +70,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 81e70b7..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);
@@ -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;
 }
 
-- 
2.5.0



More information about the Spice-devel mailing list