Use va_list instead of an ugly trampoline hack --- gtk/channel-cursor.c | 67 ++++----------------- gtk/channel-display.c | 84 +++++--------------------- gtk/channel-inputs.c | 22 +------ gtk/channel-main.c | 153 ++++++++--------------------------------------- gtk/channel-playback.c | 64 +++----------------- gtk/channel-port.c | 39 ++---------- gtk/channel-record.c | 40 ++----------- gtk/gio-coroutine.c | 70 ++++++++++------------ gtk/gio-coroutine.h | 7 ++- gtk/spice-channel-priv.h | 11 ---- gtk/spice-channel.c | 61 ++++++------------- gtk/spice-session.c | 25 ++------ 12 files changed, 133 insertions(+), 510 deletions(-) diff --git a/gtk/channel-cursor.c b/gtk/channel-cursor.c index d7242a6..740b6a6 100644 --- a/gtk/channel-cursor.c +++ b/gtk/channel-cursor.c @@ -200,52 +200,6 @@ static void spice_cursor_channel_class_init(SpiceCursorChannelClass *klass) channel_set_handlers(SPICE_CHANNEL_CLASS(klass)); } -/* signal trampoline---------------------------------------------------------- */ - -struct SPICE_CURSOR_HIDE { -}; - -struct SPICE_CURSOR_RESET { -}; - -struct SPICE_CURSOR_SET { - uint16_t width; - uint16_t height; - uint16_t hot_spot_x; - uint16_t hot_spot_y; - gpointer rgba; -}; - -struct SPICE_CURSOR_MOVE { - gint x; - gint y; -}; - -/* main context */ -static void do_emit_main_context(GObject *object, int signum, gpointer params) -{ - switch (signum) { - case SPICE_CURSOR_HIDE: - case SPICE_CURSOR_RESET: { - g_signal_emit(object, signals[signum], 0); - break; - } - case SPICE_CURSOR_SET: { - struct SPICE_CURSOR_SET *p = params; - g_signal_emit(object, signals[signum], 0, - p->width, p->height, p->hot_spot_x, p->hot_spot_y, p->rgba); - break; - } - case SPICE_CURSOR_MOVE: { - struct SPICE_CURSOR_MOVE *p = params; - g_signal_emit(object, signals[signum], 0, p->x, p->y); - break; - } - default: - g_warn_if_reached(); - } -} - /* ------------------------------------------------------------------ */ #ifdef DEBUG_CURSOR @@ -446,10 +400,10 @@ cache_add: static void emit_cursor_set(SpiceChannel *channel, display_cursor *cursor) { g_return_if_fail(cursor != NULL); - emit_main_context(channel, SPICE_CURSOR_SET, - cursor->hdr.width, cursor->hdr.height, - cursor->hdr.hot_spot_x, cursor->hdr.hot_spot_y, - cursor->default_cursor ? NULL : cursor->data); + g_coroutine_signal_emit(channel, signals[SPICE_CURSOR_SET], 0, + cursor->hdr.width, cursor->hdr.height, + cursor->hdr.hot_spot_x, cursor->hdr.hot_spot_y, + cursor->default_cursor ? NULL : cursor->data, NULL); } /* coroutine context */ @@ -467,7 +421,7 @@ static void cursor_handle_init(SpiceChannel *channel, SpiceMsgIn *in) if (cursor) emit_cursor_set(channel, cursor); if (!init->visible || !cursor) - emit_main_context(channel, SPICE_CURSOR_HIDE); + g_coroutine_signal_emit(channel, signals[SPICE_CURSOR_HIDE], 0, NULL); if (cursor) display_cursor_unref(cursor); } @@ -480,7 +434,7 @@ static void cursor_handle_reset(SpiceChannel *channel, SpiceMsgIn *in) CHANNEL_DEBUG(channel, "%s, init_done: %d", __FUNCTION__, c->init_done); cache_clear(c->cursors); - emit_main_context(channel, SPICE_CURSOR_RESET); + g_coroutine_signal_emit(channel, signals[SPICE_CURSOR_RESET], 0, NULL); c->init_done = FALSE; } @@ -497,7 +451,7 @@ static void cursor_handle_set(SpiceChannel *channel, SpiceMsgIn *in) if (cursor) emit_cursor_set(channel, cursor); else - emit_main_context(channel, SPICE_CURSOR_HIDE); + g_coroutine_signal_emit(channel, signals[SPICE_CURSOR_HIDE], 0, NULL); if (cursor) @@ -512,8 +466,9 @@ static void cursor_handle_move(SpiceChannel *channel, SpiceMsgIn *in) g_return_if_fail(c->init_done == TRUE); - emit_main_context(channel, SPICE_CURSOR_MOVE, - move->position.x, move->position.y); + g_coroutine_signal_emit(channel, signals[SPICE_CURSOR_MOVE], 0, + move->position.x, move->position.y, + NULL); } /* coroutine context */ @@ -525,7 +480,7 @@ static void cursor_handle_hide(SpiceChannel *channel, SpiceMsgIn *in) g_return_if_fail(c->init_done == TRUE); #endif - emit_main_context(channel, SPICE_CURSOR_HIDE); + g_coroutine_signal_emit(channel, signals[SPICE_CURSOR_HIDE], 0, NULL); } /* coroutine context */ diff --git a/gtk/channel-display.c b/gtk/channel-display.c index ff9f85c..b623002 100644 --- a/gtk/channel-display.c +++ b/gtk/channel-display.c @@ -429,60 +429,6 @@ gboolean spice_display_get_primary(SpiceChannel *channel, guint32 surface_id, return TRUE; } -/* signal trampoline---------------------------------------------------------- */ - -struct SPICE_DISPLAY_PRIMARY_CREATE { - gint format; - gint width; - gint height; - gint stride; - gint shmid; - gpointer imgdata; -}; - -struct SPICE_DISPLAY_PRIMARY_DESTROY { -}; - -struct SPICE_DISPLAY_INVALIDATE { - gint x; - gint y; - gint w; - gint h; -}; - -struct SPICE_DISPLAY_MARK { - gint mark; -}; - -/* main context */ -static void do_emit_main_context(GObject *object, int signum, gpointer params) -{ - switch (signum) { - case SPICE_DISPLAY_PRIMARY_DESTROY: { - g_signal_emit(object, signals[signum], 0); - break; - } - case SPICE_DISPLAY_MARK: { - struct SPICE_DISPLAY_MARK *p = params; - g_signal_emit(object, signals[signum], 0, p->mark); - break; - } - case SPICE_DISPLAY_PRIMARY_CREATE: { - struct SPICE_DISPLAY_PRIMARY_CREATE *p = params; - g_signal_emit(object, signals[signum], 0, - p->format, p->width, p->height, p->stride, p->shmid, p->imgdata); - break; - } - case SPICE_DISPLAY_INVALIDATE: { - struct SPICE_DISPLAY_INVALIDATE *p = params; - g_signal_emit(object, signals[signum], 0, p->x, p->y, p->w, p->h); - break; - } - default: - g_warn_if_reached(); - } -} - /* ------------------------------------------------------------------ */ static void image_put(SpiceImageCache *cache, uint64_t id, pixman_image_t *image) @@ -701,7 +647,7 @@ static int create_canvas(SpiceChannel *channel, display_surface *surface) return 0; } - emit_main_context(channel, SPICE_DISPLAY_PRIMARY_DESTROY); + g_coroutine_signal_emit(channel, signals[SPICE_DISPLAY_PRIMARY_DESTROY], 0, NULL); g_hash_table_remove(c->surfaces, GINT_TO_POINTER(c->primary->surface_id)); } @@ -757,9 +703,10 @@ static int create_canvas(SpiceChannel *channel, display_surface *surface) if (surface->primary) { g_warn_if_fail(c->primary == NULL); c->primary = surface; - emit_main_context(channel, SPICE_DISPLAY_PRIMARY_CREATE, + g_coroutine_signal_emit(channel, signals[SPICE_DISPLAY_PRIMARY_CREATE], 0, surface->format, surface->width, surface->height, - surface->stride, surface->shmid, surface->data); + surface->stride, surface->shmid, surface->data, + NULL); if (!spice_channel_test_capability(channel, SPICE_DISPLAY_CAP_MONITORS_CONFIG)) { g_array_set_size(c->monitors, 1); @@ -767,7 +714,7 @@ static int create_canvas(SpiceChannel *channel, display_surface *surface) config->x = config->y = 0; config->width = surface->width; config->height = surface->height; - g_object_notify_main_context(G_OBJECT(channel), "monitors"); + g_coroutine_object_notify(G_OBJECT(channel), "monitors"); } } @@ -816,7 +763,7 @@ static void clear_surfaces(SpiceChannel *channel, gboolean keep_primary) if (!keep_primary) { c->primary = NULL; - emit_main_context(channel, SPICE_DISPLAY_PRIMARY_DESTROY); + g_coroutine_signal_emit(channel, signals[SPICE_DISPLAY_PRIMARY_DESTROY], 0, NULL); } g_hash_table_iter_init(&iter, c->surfaces); @@ -834,10 +781,11 @@ static void clear_surfaces(SpiceChannel *channel, gboolean keep_primary) /* coroutine context */ static void emit_invalidate(SpiceChannel *channel, SpiceRect *bbox) { - emit_main_context(channel, SPICE_DISPLAY_INVALIDATE, - bbox->left, bbox->top, - bbox->right - bbox->left, - bbox->bottom - bbox->top); + g_coroutine_signal_emit(channel, signals[SPICE_DISPLAY_INVALIDATE], 0, + bbox->left, bbox->top, + bbox->right - bbox->left, + bbox->bottom - bbox->top, + NULL); } /* ------------------------------------------------------------------ */ @@ -868,7 +816,7 @@ static void spice_display_channel_up(SpiceChannel *channel) /* if we are not using monitors config, notify of existence of this monitor */ if (channel->priv->channel_id != 0) - g_object_notify_main_context(G_OBJECT(channel), "monitors"); + g_coroutine_object_notify(G_OBJECT(channel), "monitors"); } #define DRAW(type) { \ @@ -915,7 +863,7 @@ static void display_handle_mark(SpiceChannel *channel, SpiceMsgIn *in) #endif c->mark = TRUE; - emit_main_context(channel, SPICE_DISPLAY_MARK, TRUE); + g_coroutine_signal_emit(channel, signals[SPICE_DISPLAY_MARK], 0, TRUE, NULL); } /* coroutine context */ @@ -932,7 +880,7 @@ static void display_handle_reset(SpiceChannel *channel, SpiceMsgIn *in) cache_clear(c->palettes); c->mark = FALSE; - emit_main_context(channel, SPICE_DISPLAY_MARK, FALSE); + g_coroutine_signal_emit(channel, signals[SPICE_DISPLAY_MARK], 0, FALSE, NULL); } /* coroutine context */ @@ -1753,7 +1701,7 @@ static void display_handle_surface_destroy(SpiceChannel *channel, SpiceMsgIn *in c->mark_false_event_id = g_timeout_add_seconds(1, display_mark_false, channel); } c->primary = NULL; - emit_main_context(channel, SPICE_DISPLAY_PRIMARY_DESTROY); + g_coroutine_signal_emit(channel, signals[SPICE_DISPLAY_PRIMARY_DESTROY], 0, NULL); } g_hash_table_remove(c->surfaces, GINT_TO_POINTER(surface->surface_id)); @@ -1800,7 +1748,7 @@ static void display_handle_monitors_config(SpiceChannel *channel, SpiceMsgIn *in mc->height = head->height; } - g_object_notify_main_context(G_OBJECT(channel), "monitors"); + g_coroutine_object_notify(G_OBJECT(channel), "monitors"); } static void channel_set_handlers(SpiceChannelClass *klass) diff --git a/gtk/channel-inputs.c b/gtk/channel-inputs.c index 8a726e0..d27640b 100644 --- a/gtk/channel-inputs.c +++ b/gtk/channel-inputs.c @@ -147,24 +147,6 @@ static void spice_inputs_channel_class_init(SpiceInputsChannelClass *klass) channel_set_handlers(SPICE_CHANNEL_CLASS(klass)); } -/* signal trampoline---------------------------------------------------------- */ - -struct SPICE_INPUTS_MODIFIERS { -}; - -/* main context */ -static void do_emit_main_context(GObject *object, int signum, gpointer params) -{ - switch (signum) { - case SPICE_INPUTS_MODIFIERS: { - g_signal_emit(object, signals[signum], 0); - break; - } - default: - g_warn_if_reached(); - } -} - /* ------------------------------------------------------------------ */ static SpiceMsgOut* mouse_motion(SpiceInputsChannel *channel) @@ -251,7 +233,7 @@ static void inputs_handle_init(SpiceChannel *channel, SpiceMsgIn *in) SpiceMsgInputsInit *init = spice_msg_in_parsed(in); c->modifiers = init->keyboard_modifiers; - emit_main_context(channel, SPICE_INPUTS_MODIFIERS); + g_coroutine_signal_emit(channel, signals[SPICE_INPUTS_MODIFIERS], 0, NULL); } /* coroutine context */ @@ -261,7 +243,7 @@ static void inputs_handle_modifiers(SpiceChannel *channel, SpiceMsgIn *in) SpiceMsgInputsKeyModifiers *modifiers = spice_msg_in_parsed(in); c->modifiers = modifiers->modifiers; - emit_main_context(channel, SPICE_INPUTS_MODIFIERS); + g_coroutine_signal_emit(channel, signals[SPICE_INPUTS_MODIFIERS], 0, NULL); } /* coroutine context */ diff --git a/gtk/channel-main.c b/gtk/channel-main.c index 58f5d31..f7b4f48 100644 --- a/gtk/channel-main.c +++ b/gtk/channel-main.c @@ -808,115 +808,6 @@ static void spice_main_channel_class_init(SpiceMainChannelClass *klass) channel_set_handlers(SPICE_CHANNEL_CLASS(klass)); } -/* signal trampoline---------------------------------------------------------- */ - -struct SPICE_MAIN_CLIPBOARD_RELEASE { -}; - -struct SPICE_MAIN_AGENT_UPDATE { -}; - -struct SPICE_MAIN_MOUSE_UPDATE { -}; - -struct SPICE_MAIN_CLIPBOARD { - guint type; - gpointer data; - gsize size; -}; - -struct SPICE_MAIN_CLIPBOARD_GRAB { - gpointer types; - gsize ntypes; - gboolean *ret; -}; - -struct SPICE_MAIN_CLIPBOARD_REQUEST { - guint type; - gboolean *ret; -}; - -struct SPICE_MAIN_CLIPBOARD_SELECTION { - guint8 selection; - guint type; - gpointer data; - gsize size; -}; - -struct SPICE_MAIN_CLIPBOARD_SELECTION_GRAB { - guint8 selection; - gpointer types; - gsize ntypes; - gboolean *ret; -}; - -struct SPICE_MAIN_CLIPBOARD_SELECTION_REQUEST { - guint8 selection; - guint type; - gboolean *ret; -}; - -struct SPICE_MAIN_CLIPBOARD_SELECTION_RELEASE { - guint8 selection; -}; - -/* main context */ -static void do_emit_main_context(GObject *object, int signum, gpointer params) -{ - switch (signum) { - case SPICE_MAIN_CLIPBOARD_RELEASE: - case SPICE_MAIN_AGENT_UPDATE: - case SPICE_MAIN_MOUSE_UPDATE: { - g_signal_emit(object, signals[signum], 0); - break; - } - case SPICE_MAIN_CLIPBOARD: { - struct SPICE_MAIN_CLIPBOARD *p = params; - g_signal_emit(object, signals[signum], 0, - p->type, p->data, p->size); - break; - } - case SPICE_MAIN_CLIPBOARD_GRAB: { - struct SPICE_MAIN_CLIPBOARD_GRAB *p = params; - g_signal_emit(object, signals[signum], 0, - p->types, p->ntypes, p->ret); - break; - } - case SPICE_MAIN_CLIPBOARD_REQUEST: { - struct SPICE_MAIN_CLIPBOARD_REQUEST *p = params; - g_signal_emit(object, signals[signum], 0, - p->type, p->ret); - break; - } - case SPICE_MAIN_CLIPBOARD_SELECTION: { - struct SPICE_MAIN_CLIPBOARD_SELECTION *p = params; - g_signal_emit(object, signals[signum], 0, - p->selection, p->type, p->data, p->size); - break; - } - case SPICE_MAIN_CLIPBOARD_SELECTION_GRAB: { - struct SPICE_MAIN_CLIPBOARD_SELECTION_GRAB *p = params; - g_signal_emit(object, signals[signum], 0, - p->selection, p->types, p->ntypes, p->ret); - break; - } - case SPICE_MAIN_CLIPBOARD_SELECTION_REQUEST: { - struct SPICE_MAIN_CLIPBOARD_SELECTION_REQUEST *p = params; - g_signal_emit(object, signals[signum], 0, - p->selection, p->type, p->ret); - break; - } - case SPICE_MAIN_CLIPBOARD_SELECTION_RELEASE: { - struct SPICE_MAIN_CLIPBOARD_SELECTION_RELEASE *p = params; - g_signal_emit(object, signals[signum], 0, - p->selection); - break; - } - default: - g_warn_if_reached(); - } -} - /* ------------------------------------------------------------------ */ @@ -1437,12 +1328,12 @@ static void set_agent_connected(SpiceMainChannel *channel, gboolean connected) SPICE_DEBUG("agent connected: %s", spice_yes_no(connected)); if (connected != c->agent_connected) { c->agent_connected = connected; - g_object_notify_main_context(G_OBJECT(channel), "agent-connected"); + g_coroutine_object_notify(G_OBJECT(channel), "agent-connected"); } if (!connected) spice_main_channel_reset_agent(SPICE_MAIN_CHANNEL(channel)); - emit_main_context(channel, SPICE_MAIN_AGENT_UPDATE); + g_coroutine_signal_emit(channel, signals[SPICE_MAIN_AGENT_UPDATE], 0, NULL); } /* coroutine context */ @@ -1480,8 +1371,8 @@ static void set_mouse_mode(SpiceMainChannel *channel, uint32_t supported, uint32 if (c->mouse_mode != current) { c->mouse_mode = current; - emit_main_context(channel, SPICE_MAIN_MOUSE_UPDATE); - g_object_notify_main_context(G_OBJECT(channel), "mouse-mode"); + g_coroutine_signal_emit(channel, signals[SPICE_MAIN_MOUSE_UPDATE], 0, NULL); + g_coroutine_object_notify(G_OBJECT(channel), "mouse-mode"); } /* switch to client mode if possible */ @@ -1590,7 +1481,7 @@ static void main_handle_channels_list(SpiceChannel *channel, SpiceMsgIn *in) /* guarantee that uuid is notified before setting up the channels, even if * the server is older and doesn't actually send the uuid */ - g_object_notify_main_context(G_OBJECT(session), "uuid"); + g_coroutine_object_notify(G_OBJECT(session), "uuid"); for (i = 0; i < msg->num_of_channels; i++) { channel_new_t *c; @@ -1898,7 +1789,7 @@ static void main_agent_handle_msg(SpiceChannel *channel, VD_AGENT_SET_CAPABILITY(c->agent_caps, i); } c->agent_caps_received = true; - emit_main_context(self, SPICE_MAIN_AGENT_UPDATE); + g_coroutine_signal_emit(self, signals[SPICE_MAIN_AGENT_UPDATE], 0, NULL); if (caps->request) agent_announce_caps(self); @@ -1918,42 +1809,46 @@ static void main_agent_handle_msg(SpiceChannel *channel, case VD_AGENT_CLIPBOARD: { VDAgentClipboard *cb = payload; - emit_main_context(self, SPICE_MAIN_CLIPBOARD_SELECTION, selection, - cb->type, cb->data, msg->size - sizeof(VDAgentClipboard)); + g_coroutine_signal_emit(self, signals[SPICE_MAIN_CLIPBOARD_SELECTION], 0, selection, + cb->type, cb->data, msg->size - sizeof(VDAgentClipboard), + NULL); if (selection == VD_AGENT_CLIPBOARD_SELECTION_CLIPBOARD) - emit_main_context(self, SPICE_MAIN_CLIPBOARD, - cb->type, cb->data, msg->size - sizeof(VDAgentClipboard)); + g_coroutine_signal_emit(self, signals[SPICE_MAIN_CLIPBOARD], 0, + cb->type, cb->data, msg->size - sizeof(VDAgentClipboard), + NULL); break; } case VD_AGENT_CLIPBOARD_GRAB: { gboolean ret; - emit_main_context(self, SPICE_MAIN_CLIPBOARD_SELECTION_GRAB, selection, - (guint8*)payload, msg->size / sizeof(uint32_t), &ret); + g_coroutine_signal_emit(self, signals[SPICE_MAIN_CLIPBOARD_SELECTION_GRAB], 0, selection, + (guint8*)payload, msg->size / sizeof(uint32_t), &ret, + NULL); if (selection == VD_AGENT_CLIPBOARD_SELECTION_CLIPBOARD) - emit_main_context(self, SPICE_MAIN_CLIPBOARD_GRAB, - payload, msg->size / sizeof(uint32_t), &ret); + g_coroutine_signal_emit(self, signals[SPICE_MAIN_CLIPBOARD_GRAB], 0, + payload, msg->size / sizeof(uint32_t), &ret, + NULL); break; } case VD_AGENT_CLIPBOARD_REQUEST: { gboolean ret; VDAgentClipboardRequest *req = payload; - emit_main_context(self, SPICE_MAIN_CLIPBOARD_SELECTION_REQUEST, selection, - req->type, &ret); + g_coroutine_signal_emit(self, signals[SPICE_MAIN_CLIPBOARD_SELECTION_REQUEST], 0, selection, + req->type, &ret, NULL); if (selection == VD_AGENT_CLIPBOARD_SELECTION_CLIPBOARD) - emit_main_context(self, SPICE_MAIN_CLIPBOARD_REQUEST, - req->type, &ret); + g_coroutine_signal_emit(self, signals[SPICE_MAIN_CLIPBOARD_REQUEST], 0, + req->type, &ret, NULL); break; } case VD_AGENT_CLIPBOARD_RELEASE: { - emit_main_context(self, SPICE_MAIN_CLIPBOARD_SELECTION_RELEASE, selection); + g_coroutine_signal_emit(self, signals[SPICE_MAIN_CLIPBOARD_SELECTION_RELEASE], 0, selection, NULL); if (selection == VD_AGENT_CLIPBOARD_SELECTION_CLIPBOARD) - emit_main_context(self, SPICE_MAIN_CLIPBOARD_RELEASE); + g_coroutine_signal_emit(self, signals[SPICE_MAIN_CLIPBOARD_RELEASE], 0, NULL); break; } case VD_AGENT_REPLY: diff --git a/gtk/channel-playback.c b/gtk/channel-playback.c index 7789aa8..dc3c375 100644 --- a/gtk/channel-playback.c +++ b/gtk/channel-playback.c @@ -298,52 +298,6 @@ static void spice_playback_channel_class_init(SpicePlaybackChannelClass *klass) channel_set_handlers(SPICE_CHANNEL_CLASS(klass)); } -/* signal trampoline---------------------------------------------------------- */ - -struct SPICE_PLAYBACK_START { - gint format; - gint channels; - gint frequency; - gint latency; -}; - -struct SPICE_PLAYBACK_DATA { - uint8_t *data; - gsize data_size; -}; - -struct SPICE_PLAYBACK_STOP { -}; - -struct SPICE_PLAYBACK_GET_DELAY { -}; - -/* main context */ -static void do_emit_main_context(GObject *object, int signum, gpointer params) -{ - switch (signum) { - case SPICE_PLAYBACK_GET_DELAY: - case SPICE_PLAYBACK_STOP: { - g_signal_emit(object, signals[signum], 0); - break; - } - case SPICE_PLAYBACK_START: { - struct SPICE_PLAYBACK_START *p = params; - g_signal_emit(object, signals[signum], 0, - p->format, p->channels, p->frequency); - break; - } - case SPICE_PLAYBACK_DATA: { - struct SPICE_PLAYBACK_DATA *p = params; - g_signal_emit(object, signals[signum], 0, - p->data, p->data_size); - break; - } - default: - g_warn_if_reached(); - } -} - /* ------------------------------------------------------------------ */ /* coroutine context */ @@ -377,10 +331,10 @@ static void playback_handle_data(SpiceChannel *channel, SpiceMsgIn *in) } } - emit_main_context(channel, SPICE_PLAYBACK_DATA, data, n); + g_coroutine_signal_emit(channel, signals[SPICE_PLAYBACK_DATA], 0, data, n, NULL); if ((c->frame_count++ % 100) == 0) { - emit_main_context(channel, SPICE_PLAYBACK_GET_DELAY); + g_coroutine_signal_emit(channel, signals[SPICE_PLAYBACK_GET_DELAY], 0, NULL); } } @@ -426,8 +380,8 @@ static void playback_handle_start(SpiceChannel *channel, SpiceMsgIn *in) return; } } - emit_main_context(channel, SPICE_PLAYBACK_START, - start->format, start->channels, start->frequency); + g_coroutine_signal_emit(channel, signals[SPICE_PLAYBACK_START], 0, + start->format, start->channels, start->frequency, NULL); } /* coroutine context */ @@ -435,7 +389,7 @@ static void playback_handle_stop(SpiceChannel *channel, SpiceMsgIn *in) { SpicePlaybackChannelPrivate *c = SPICE_PLAYBACK_CHANNEL(channel)->priv; - emit_main_context(channel, SPICE_PLAYBACK_STOP); + g_coroutine_signal_emit(channel, signals[SPICE_PLAYBACK_STOP], 0, NULL); c->is_active = FALSE; } @@ -454,7 +408,7 @@ static void playback_handle_set_volume(SpiceChannel *channel, SpiceMsgIn *in) c->nchannels = vol->nchannels; c->volume = g_new(guint16, c->nchannels); memcpy(c->volume, vol->volume, sizeof(guint16) * c->nchannels); - g_object_notify_main_context(G_OBJECT(channel), "volume"); + g_coroutine_object_notify(G_OBJECT(channel), "volume"); } /* coroutine context */ @@ -464,7 +418,7 @@ static void playback_handle_set_mute(SpiceChannel *channel, SpiceMsgIn *in) SpiceMsgAudioMute *m = spice_msg_in_parsed(in); c->mute = m->mute; - g_object_notify_main_context(G_OBJECT(channel), "mute"); + g_coroutine_object_notify(G_OBJECT(channel), "mute"); } /* coroutine context */ @@ -475,7 +429,7 @@ static void playback_handle_set_latency(SpiceChannel *channel, SpiceMsgIn *in) c->min_latency = msg->latency_ms; SPICE_DEBUG("%s: notify latency update %u", __FUNCTION__, c->min_latency); - g_object_notify_main_context(G_OBJECT(channel), "min-latency"); + g_coroutine_object_notify(G_OBJECT(channel), "min-latency"); } static void channel_set_handlers(SpiceChannelClass *klass) @@ -530,5 +484,5 @@ void spice_playback_channel_sync_latency(SpicePlaybackChannel *channel) g_return_if_fail(SPICE_IS_PLAYBACK_CHANNEL(channel)); g_return_if_fail(channel->priv->is_active); SPICE_DEBUG("%s: notify latency update %u", __FUNCTION__, channel->priv->min_latency); - g_object_notify_main_context(G_OBJECT(SPICE_CHANNEL(channel)), "min-latency"); + g_coroutine_object_notify(G_OBJECT(SPICE_CHANNEL(channel)), "min-latency"); } diff --git a/gtk/channel-port.c b/gtk/channel-port.c index ad85afd..742178d 100644 --- a/gtk/channel-port.c +++ b/gtk/channel-port.c @@ -197,35 +197,6 @@ static void spice_port_channel_class_init(SpicePortChannelClass *klass) channel_set_handlers(SPICE_CHANNEL_CLASS(klass)); } -/* signal trampoline---------------------------------------------------------- */ - -struct SPICE_PORT_DATA { - uint8_t *data; - gsize data_size; -}; - -struct SPICE_PORT_EVENT { - int event; -}; - -/* main context */ -static void do_emit_main_context(GObject *object, int signum, gpointer params) -{ - switch (signum) { - case SPICE_PORT_DATA: { - struct SPICE_PORT_DATA *p = params; - g_signal_emit(object, signals[signum], 0, p->data, p->data_size); - break; - } - case SPICE_PORT_EVENT: { - struct SPICE_PORT_EVENT *p = params; - g_signal_emit(object, signals[signum], 0, p->event); - break; - } - default: - g_warn_if_reached(); - } -} /* coroutine context */ static void port_set_opened(SpicePortChannel *self, gboolean opened) @@ -236,7 +207,7 @@ static void port_set_opened(SpicePortChannel *self, gboolean opened) return; c->opened = opened; - g_object_notify_main_context(G_OBJECT(self), "port-opened"); + g_coroutine_object_notify(G_OBJECT(self), "port-opened"); } /* coroutine context */ @@ -254,9 +225,9 @@ static void port_handle_init(SpiceChannel *channel, SpiceMsgIn *in) port_set_opened(self, init->opened); if (init->opened) - emit_main_context(channel, SPICE_PORT_EVENT, SPICE_PORT_EVENT_OPENED); + g_coroutine_signal_emit(channel, signals[SPICE_PORT_EVENT], 0, SPICE_PORT_EVENT_OPENED, NULL); - g_object_notify_main_context(G_OBJECT(channel), "port-name"); + g_coroutine_object_notify(G_OBJECT(channel), "port-name"); } /* coroutine context */ @@ -275,7 +246,7 @@ static void port_handle_event(SpiceChannel *channel, SpiceMsgIn *in) break; } - emit_main_context(channel, SPICE_PORT_EVENT, event->event); + g_coroutine_signal_emit(channel, signals[SPICE_PORT_EVENT], 0, event->event, NULL); } /* coroutine context */ @@ -288,7 +259,7 @@ static void port_handle_msg(SpiceChannel *channel, SpiceMsgIn *in) buf = spice_msg_in_raw(in, &size); CHANNEL_DEBUG(channel, "port %p got %d %p", channel, size, buf); port_set_opened(self, true); - emit_main_context(channel, SPICE_PORT_DATA, buf, size); + g_coroutine_signal_emit(channel, signals[SPICE_PORT_DATA], 0, buf, size, NULL); } /** diff --git a/gtk/channel-record.c b/gtk/channel-record.c index d4f47ba..bca3736 100644 --- a/gtk/channel-record.c +++ b/gtk/channel-record.c @@ -251,36 +251,6 @@ static void spice_record_channel_class_init(SpiceRecordChannelClass *klass) channel_set_handlers(SPICE_CHANNEL_CLASS(klass)); } -/* signal trampoline---------------------------------------------------------- */ - -struct SPICE_RECORD_START { - gint format; - gint channels; - gint frequency; -}; - -struct SPICE_RECORD_STOP { -}; - -/* main context */ -static void do_emit_main_context(GObject *object, int signum, gpointer params) -{ - switch (signum) { - case SPICE_RECORD_START: { - struct SPICE_RECORD_START *p = params; - g_signal_emit(object, signals[signum], 0, - p->format, p->channels, p->frequency); - break; - } - case SPICE_RECORD_STOP: { - g_signal_emit(object, signals[signum], 0); - break; - } - default: - g_warn_if_reached(); - } -} - /* main context */ static void spice_record_mode(SpiceRecordChannel *channel, uint32_t time, uint32_t mode, uint8_t *data, uint32_t data_size) @@ -451,8 +421,8 @@ static void record_handle_start(SpiceChannel *channel, SpiceMsgIn *in) c->last_frame = g_malloc(c->frame_bytes); c->last_frame_current = 0; - emit_main_context(channel, SPICE_RECORD_START, - start->format, start->channels, start->frequency); + g_coroutine_signal_emit(channel, signals[SPICE_RECORD_START], 0, + start->format, start->channels, start->frequency, NULL); } /* coroutine context */ @@ -460,7 +430,7 @@ static void record_handle_stop(SpiceChannel *channel, SpiceMsgIn *in) { SpiceRecordChannelPrivate *rc = SPICE_RECORD_CHANNEL(channel)->priv; - emit_main_context(channel, SPICE_RECORD_STOP); + g_coroutine_signal_emit(channel, signals[SPICE_RECORD_STOP], 0, NULL); rc->started = FALSE; } @@ -479,7 +449,7 @@ static void record_handle_set_volume(SpiceChannel *channel, SpiceMsgIn *in) c->nchannels = vol->nchannels; c->volume = g_new(guint16, c->nchannels); memcpy(c->volume, vol->volume, sizeof(guint16) * c->nchannels); - g_object_notify_main_context(G_OBJECT(channel), "volume"); + g_coroutine_object_notify(G_OBJECT(channel), "volume"); } /* coroutine context */ @@ -489,7 +459,7 @@ static void record_handle_set_mute(SpiceChannel *channel, SpiceMsgIn *in) SpiceMsgAudioMute *m = spice_msg_in_parsed(in); c->mute = m->mute; - g_object_notify_main_context(G_OBJECT(channel), "mute"); + g_coroutine_object_notify(G_OBJECT(channel), "mute"); } static void channel_set_handlers(SpiceChannelClass *klass) diff --git a/gtk/gio-coroutine.c b/gtk/gio-coroutine.c index d3ac16c..c903bd2 100644 --- a/gtk/gio-coroutine.c +++ b/gtk/gio-coroutine.c @@ -184,20 +184,21 @@ gboolean g_coroutine_condition_wait(GCoroutine *self, GConditionWaitFunc func, g struct signal_data { - GObject *object; + gpointer instance; struct coroutine *caller; - int signum; - gpointer params; - GSignalEmitMainFunc func; - const char *debug_info; + guint signal_id; + GQuark detail; + const gchar *propname; gboolean notified; + va_list var_args; }; static gboolean emit_main_context(gpointer opaque) { struct signal_data *signal = opaque; - signal->func(signal->object, signal->signum, signal->params); + g_signal_emit_valist(signal->instance, signal->signal_id, + signal->detail, signal->var_args); signal->notified = TRUE; coroutine_yieldto(signal->caller, NULL); @@ -205,41 +206,36 @@ static gboolean emit_main_context(gpointer opaque) return FALSE; } -/* coroutine -> main context */ -void g_signal_emit_main_context(GObject *object, - GSignalEmitMainFunc emit_main_func, - int signum, - gpointer params, - const char *debug_info) +void +g_coroutine_signal_emit(gpointer instance, guint signal_id, + GQuark detail, ...) { - struct signal_data data; + struct signal_data data = { + .instance = instance, + .signal_id = signal_id, + .detail = detail, + .caller = coroutine_self(), + }; - g_return_if_fail(coroutine_self()->caller); - - data.object = object; - data.caller = coroutine_self(); - data.signum = signum; - data.params = params; - data.func = emit_main_func; - data.debug_info = debug_info; - data.notified = FALSE; - g_idle_add(emit_main_context, &data); - - /* This switches to the system coroutine context, lets - * the idle function run to dispatch the signal, and - * finally returns once complete. ie this is synchronous - * from the POV of the coroutine despite there being - * an idle function involved - */ - coroutine_yield(NULL); - g_warn_if_fail(data.notified); + va_start (data.var_args, detail); + + if (coroutine_self_is_main()) { + g_signal_emit_valist(instance, signal_id, detail, data.var_args); + } else { + g_idle_add(emit_main_context, &data); + coroutine_yield(NULL); + g_warn_if_fail(data.notified); + } + + va_end (data.var_args); } + static gboolean notify_main_context(gpointer opaque) { struct signal_data *signal = opaque; - g_object_notify(signal->object, signal->params); + g_object_notify(signal->instance, signal->propname); signal->notified = TRUE; coroutine_yieldto(signal->caller, NULL); @@ -248,8 +244,8 @@ static gboolean notify_main_context(gpointer opaque) } /* coroutine -> main context */ -void g_object_notify_main_context(GObject *object, - const gchar *property_name) +void g_coroutine_object_notify(GObject *object, + const gchar *property_name) { struct signal_data data; @@ -257,9 +253,9 @@ void g_object_notify_main_context(GObject *object, g_object_notify(object, property_name); } else { - data.object = object; + data.instance = object; data.caller = coroutine_self(); - data.params = (gpointer)property_name; + data.propname = (gpointer)property_name; data.notified = FALSE; g_idle_add(notify_main_context, &data); diff --git a/gtk/gio-coroutine.h b/gtk/gio-coroutine.h index 1c4094e..b3a6d78 100644 --- a/gtk/gio-coroutine.h +++ b/gtk/gio-coroutine.h @@ -56,9 +56,10 @@ gboolean g_coroutine_condition_wait (GCoroutine *coroutine, GConditionWaitFunc func, gpointer data); void g_coroutine_condition_cancel(GCoroutine *coroutine); -void g_signal_emit_main_context(GObject *object, GSignalEmitMainFunc func, - int signum, gpointer params, const char *debug_info); -void g_object_notify_main_context(GObject *object, const gchar *property_name); +void g_coroutine_signal_emit (gpointer instance, guint signal_id, + GQuark detail, ...); + +void g_coroutine_object_notify(GObject *object, const gchar *property_name); G_END_DECLS diff --git a/gtk/spice-channel-priv.h b/gtk/spice-channel-priv.h index 607c0d4..03eed38 100644 --- a/gtk/spice-channel-priv.h +++ b/gtk/spice-channel-priv.h @@ -186,17 +186,6 @@ void spice_caps_set(GArray *caps, guint32 cap, const gchar *desc); #define spice_channel_set_capability(channel, cap) \ spice_caps_set(SPICE_CHANNEL(channel)->priv->caps, cap, #cap) -/* coroutine context */ -#define emit_main_context(object, event, args...) \ - G_STMT_START { \ - if (coroutine_self_is_main()) { \ - do_emit_main_context(G_OBJECT(object), event, &((struct event) { args })); \ - } else { \ - g_signal_emit_main_context(G_OBJECT(object), do_emit_main_context, \ - event, &((struct event) { args }), G_STRLOC); \ - } \ - } G_STMT_END - gchar *spice_channel_supported_string(void); void spice_vmc_write_async(SpiceChannel *self, diff --git a/gtk/spice-channel.c b/gtk/spice-channel.c index e460590..c9c4819 100644 --- a/gtk/spice-channel.c +++ b/gtk/spice-channel.c @@ -734,29 +734,6 @@ void spice_msg_out_send_internal(SpiceMsgOut *out) spice_channel_write_msg(out->channel, out); } -/* ---------------------------------------------------------------- */ - -struct SPICE_CHANNEL_EVENT { - SpiceChannelEvent event; -}; - -/* main context */ -static void do_emit_main_context(GObject *object, int signum, gpointer params) -{ - switch (signum) { - case SPICE_CHANNEL_EVENT: { - struct SPICE_CHANNEL_EVENT *p = params; - g_signal_emit(object, signals[signum], 0, p->event); - break; - } - case SPICE_CHANNEL_OPEN_FD: - g_warning("this signal is only sent directly from main context"); - break; - default: - g_warn_if_reached(); - } -} - /* * Write all 'data' of length 'datalen' bytes out to * the wire @@ -1094,19 +1071,19 @@ static void spice_channel_recv_auth(SpiceChannel *channel) if (rc != sizeof(link_res)) { CHANNEL_DEBUG(channel, "incomplete auth reply (%d/%" G_GSIZE_FORMAT ")", rc, sizeof(link_res)); - emit_main_context(channel, SPICE_CHANNEL_EVENT, SPICE_CHANNEL_ERROR_LINK); + g_coroutine_signal_emit(channel, signals[SPICE_CHANNEL_EVENT], 0, SPICE_CHANNEL_ERROR_LINK, NULL); return; } if (link_res != SPICE_LINK_ERR_OK) { CHANNEL_DEBUG(channel, "link result: reply %d", link_res); - emit_main_context(channel, SPICE_CHANNEL_EVENT, SPICE_CHANNEL_ERROR_AUTH); + g_coroutine_signal_emit(channel, signals[SPICE_CHANNEL_EVENT], 0, SPICE_CHANNEL_ERROR_AUTH, NULL); return; } c->state = SPICE_CHANNEL_STATE_READY; - emit_main_context(channel, SPICE_CHANNEL_EVENT, SPICE_CHANNEL_OPENED); + g_coroutine_signal_emit(channel, signals[SPICE_CHANNEL_EVENT], 0, SPICE_CHANNEL_OPENED, NULL); if (c->state == SPICE_CHANNEL_STATE_MIGRATION_HANDSHAKE) { spice_channel_send_migration_handshake(channel); @@ -1233,7 +1210,7 @@ error: return FALSE; } - emit_main_context(channel, SPICE_CHANNEL_EVENT, SPICE_CHANNEL_ERROR_LINK); + g_coroutine_signal_emit(channel, signals[SPICE_CHANNEL_EVENT], 0, SPICE_CHANNEL_ERROR_LINK, NULL); return FALSE; } @@ -1648,7 +1625,7 @@ complete: CHANNEL_DEBUG(channel, "%s", "SASL authentication complete"); spice_channel_read(channel, &len, sizeof(len)); if (len != SPICE_LINK_ERR_OK) - emit_main_context(channel, SPICE_CHANNEL_EVENT, SPICE_CHANNEL_ERROR_AUTH); + g_coroutine_signal_emit(channel, signals[SPICE_CHANNEL_EVENT], 0, SPICE_CHANNEL_ERROR_AUTH, NULL); ret = len == SPICE_LINK_ERR_OK; /* This must come *after* check-auth-result, because the former * is defined to be sent unencrypted, and setting saslconn turns @@ -1659,7 +1636,7 @@ complete: error: if (saslconn) sasl_dispose(&saslconn); - emit_main_context(channel, SPICE_CHANNEL_EVENT, SPICE_CHANNEL_ERROR_AUTH); + g_coroutine_signal_emit(channel, signals[SPICE_CHANNEL_EVENT], 0, SPICE_CHANNEL_ERROR_AUTH, NULL); c->has_error = TRUE; /* force disconnect */ ret = FALSE; @@ -1691,7 +1668,7 @@ static void spice_channel_recv_link_msg(SpiceChannel *channel, gboolean *switch_ if (c->peer_pos != c->peer_hdr.size) { g_critical("%s: %s: incomplete link reply (%d/%d)", c->name, __FUNCTION__, rc, c->peer_hdr.size); - emit_main_context(channel, SPICE_CHANNEL_EVENT, SPICE_CHANNEL_ERROR_LINK); + g_coroutine_signal_emit(channel, signals[SPICE_CHANNEL_EVENT], 0, SPICE_CHANNEL_ERROR_LINK, NULL); return; } switch (c->peer_msg->error) { @@ -1759,7 +1736,7 @@ static void spice_channel_recv_link_msg(SpiceChannel *channel, gboolean *switch_ error: SPICE_CHANNEL_GET_CLASS(channel)->channel_disconnect(channel); - emit_main_context(channel, SPICE_CHANNEL_EVENT, SPICE_CHANNEL_ERROR_LINK); + g_coroutine_signal_emit(channel, signals[SPICE_CHANNEL_EVENT], 0, SPICE_CHANNEL_ERROR_LINK, NULL); } /* system context */ @@ -2142,9 +2119,9 @@ static gboolean spice_channel_iterate(SpiceChannel *channel) if (c->has_error) { CHANNEL_DEBUG(channel, "channel got error"); if (c->state > SPICE_CHANNEL_STATE_CONNECTING) - emit_main_context(channel, SPICE_CHANNEL_EVENT, - c->state == SPICE_CHANNEL_STATE_READY ? - SPICE_CHANNEL_ERROR_IO : SPICE_CHANNEL_ERROR_LINK); + g_coroutine_signal_emit(channel, signals[SPICE_CHANNEL_EVENT], 0, + c->state == SPICE_CHANNEL_STATE_READY ? + SPICE_CHANNEL_ERROR_IO : SPICE_CHANNEL_ERROR_LINK, NULL); return FALSE; } @@ -2272,13 +2249,13 @@ static void *spice_channel_coroutine(void *data) if (spice_session_get_client_provided_socket(c->session)) { if (c->fd < 0) { g_critical("fd not provided!"); - emit_main_context(channel, SPICE_CHANNEL_EVENT, SPICE_CHANNEL_ERROR_CONNECT); + g_coroutine_signal_emit(channel, signals[SPICE_CHANNEL_EVENT], 0, SPICE_CHANNEL_ERROR_CONNECT, NULL); goto cleanup; } if (!(c->sock = g_socket_new_from_fd(c->fd, NULL))) { CHANNEL_DEBUG(channel, "Failed to open socket from fd %d", c->fd); - emit_main_context(channel, SPICE_CHANNEL_EVENT, SPICE_CHANNEL_ERROR_CONNECT); + g_coroutine_signal_emit(channel, signals[SPICE_CHANNEL_EVENT], 0, SPICE_CHANNEL_ERROR_CONNECT, NULL); goto cleanup; } @@ -2298,7 +2275,7 @@ reconnect: goto reconnect; } else { CHANNEL_DEBUG(channel, "Connect error"); - emit_main_context(channel, SPICE_CHANNEL_EVENT, SPICE_CHANNEL_ERROR_CONNECT); + g_coroutine_signal_emit(channel, signals[SPICE_CHANNEL_EVENT], 0, SPICE_CHANNEL_ERROR_CONNECT, NULL); g_clear_error(&c->error); goto cleanup; } @@ -2311,7 +2288,7 @@ reconnect: c->ctx = SSL_CTX_new(SSLv23_method()); if (c->ctx == NULL) { g_critical("SSL_CTX_new failed"); - emit_main_context(channel, SPICE_CHANNEL_EVENT, SPICE_CHANNEL_ERROR_TLS); + g_coroutine_signal_emit(channel, signals[SPICE_CHANNEL_EVENT], 0, SPICE_CHANNEL_ERROR_TLS, NULL); goto cleanup; } @@ -2327,7 +2304,7 @@ reconnect: g_warning("only pubkey active"); verify = SPICE_SESSION_VERIFY_PUBKEY; } else { - emit_main_context(channel, SPICE_CHANNEL_EVENT, SPICE_CHANNEL_ERROR_TLS); + g_coroutine_signal_emit(channel, signals[SPICE_CHANNEL_EVENT], 0, SPICE_CHANNEL_ERROR_TLS, NULL); goto cleanup; } } @@ -2345,7 +2322,7 @@ reconnect: c->ssl = SSL_new(c->ctx); if (c->ssl == NULL) { g_critical("SSL_new failed"); - emit_main_context(channel, SPICE_CHANNEL_EVENT, SPICE_CHANNEL_ERROR_TLS); + g_coroutine_signal_emit(channel, signals[SPICE_CHANNEL_EVENT], 0, SPICE_CHANNEL_ERROR_TLS, NULL); goto cleanup; } @@ -2378,7 +2355,7 @@ ssl_reconnect: } else { g_warning("%s: SSL_connect: %s", c->name, ERR_error_string(rc, NULL)); - emit_main_context(channel, SPICE_CHANNEL_EVENT, SPICE_CHANNEL_ERROR_TLS); + g_coroutine_signal_emit(channel, signals[SPICE_CHANNEL_EVENT], 0, SPICE_CHANNEL_ERROR_TLS, NULL); goto cleanup; } } @@ -2611,7 +2588,7 @@ static void channel_disconnect(SpiceChannel *channel) c->has_error = TRUE; /* break the loop */ if (c->state == SPICE_CHANNEL_STATE_READY) - emit_main_context(channel, SPICE_CHANNEL_EVENT, SPICE_CHANNEL_CLOSED); + g_coroutine_signal_emit(channel, signals[SPICE_CHANNEL_EVENT], 0, SPICE_CHANNEL_CLOSED, NULL); c->state = SPICE_CHANNEL_STATE_UNCONNECTED; spice_channel_reset(channel, FALSE); diff --git a/gtk/spice-session.c b/gtk/spice-session.c index c168bc3..2346187 100644 --- a/gtk/spice-session.c +++ b/gtk/spice-session.c @@ -124,21 +124,6 @@ enum { static guint signals[SPICE_SESSION_LAST_SIGNAL]; -struct SPICE_SESSION_MM_TIME_RESET { -}; - -/* main context */ -static void do_emit_main_context(GObject *object, int signum, gpointer params) -{ - switch (signum) { - case SPICE_SESSION_MM_TIME_RESET: - g_signal_emit(object, signals[signum], 0); - break; - default: - g_warn_if_reached(); - } -} - static void update_proxy(SpiceSession *self, const gchar *str) { SpiceSessionPrivate *s = self->priv; @@ -616,7 +601,7 @@ static void spice_session_set_property(GObject *gobject, break; case PROP_READ_ONLY: s->read_only = g_value_get_boolean(value); - g_object_notify_main_context(gobject, "read-only"); + g_coroutine_object_notify(gobject, "read-only"); break; case PROP_CACHE_SIZE: s->images_cache_size = g_value_get_int(value); @@ -2006,7 +1991,7 @@ void spice_session_set_mm_time(SpiceSession *session, guint32 time) if (time > old_time + MM_TIME_DIFF_RESET_THRESH || time < old_time) { SPICE_DEBUG("%s: mm-time-reset, old %u, new %u", __FUNCTION__, old_time, s->mm_time); - emit_main_context(session, SPICE_SESSION_MM_TIME_RESET); + g_coroutine_signal_emit(session, signals[SPICE_SESSION_MM_TIME_RESET], 0, NULL); } } @@ -2066,7 +2051,7 @@ void spice_session_set_migration_state(SpiceSession *session, SpiceSessionMigrat g_return_if_fail(s != NULL); s->migration_state = state; - g_object_notify_main_context(G_OBJECT(session), "migration-state"); + g_coroutine_object_notify(G_OBJECT(session), "migration-state"); } G_GNUC_INTERNAL @@ -2161,7 +2146,7 @@ void spice_session_set_uuid(SpiceSession *session, guint8 uuid[16]) g_return_if_fail(s != NULL); memcpy(s->uuid, uuid, sizeof(s->uuid)); - g_object_notify_main_context(G_OBJECT(session), "uuid"); + g_coroutine_object_notify(G_OBJECT(session), "uuid"); } G_GNUC_INTERNAL @@ -2173,7 +2158,7 @@ void spice_session_set_name(SpiceSession *session, const gchar *name) g_free(s->name); s->name = g_strdup(name); - g_object_notify_main_context(G_OBJECT(session), "name"); + g_coroutine_object_notify(G_OBJECT(session), "name"); } G_GNUC_INTERNAL -- 1.9.0 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel