[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