static void on_channel_closed (CockpitChannel *local, const gchar *problem, gpointer user_data) { CockpitRouter *self = COCKPIT_ROUTER (user_data); const gchar *channel; GQueue *fenced; GList *l; channel = cockpit_channel_get_id (local); g_hash_table_remove (self->channels, channel); g_hash_table_remove (self->groups, channel); /* * If this was the last channel in the fence group then resume all other channels * as there's no barrier preventing them from functioning. */ if (!g_hash_table_remove (self->fences, channel) || g_hash_table_size (self->fences) != 0) return; fenced = self->fenced; self->fenced = NULL; if (!fenced) return; for (l = fenced->head; l != NULL; l = g_list_next (l)) cockpit_transport_thaw (self->transport, l->data); g_queue_free_full (fenced, g_free); }
/** * cockpit_channel_ready: * @self: a pipe * @message: an optional control message, or NULL * * Called by channel implementations to signal when they're * ready. Any messages received before the channel was ready * will be delivered to the channel's recv() vfunc in the order * that they were received. * * If this is called immediately after or during construction then * the closing will happen after the main loop so that handlers * can connect appropriately. */ void cockpit_channel_ready (CockpitChannel *self, JsonObject *message) { g_object_ref (self); cockpit_transport_thaw (self->priv->transport, self->priv->id); cockpit_channel_control (self, "ready", message); g_object_unref (self); }