/** * Shutdown a IPC Server */ static void xmms_ipc_shutdown_server (xmms_ipc_t *ipc) { GList *c; xmms_ipc_client_t *co; if (!ipc) return; g_mutex_lock (ipc->mutex_lock); g_source_remove_by_user_data (ipc); g_io_channel_unref (ipc->chan); xmms_ipc_transport_destroy (ipc->transport); for (c = ipc->clients; c; c = g_list_next (c)) { co = c->data; if (!co) continue; co->ipc = NULL; } g_list_free (ipc->clients); g_mutex_unlock (ipc->mutex_lock); g_mutex_free (ipc->mutex_lock); g_free (ipc); }
static void xmms_ipc_client_destroy (xmms_ipc_client_t *client) { guint i; XMMS_DBG ("Destroying client!"); if (client->ipc) { g_mutex_lock (client->ipc->mutex_lock); client->ipc->clients = g_list_remove (client->ipc->clients, client); g_mutex_unlock (client->ipc->mutex_lock); } g_main_loop_unref (client->ml); g_io_channel_unref (client->iochan); xmms_ipc_transport_destroy (client->transport); g_mutex_lock (client->lock); while (!g_queue_is_empty (client->out_msg)) { xmms_ipc_msg_t *msg = g_queue_pop_head (client->out_msg); xmms_ipc_msg_destroy (msg); } g_queue_free (client->out_msg); for (i = 0; i < XMMS_IPC_SIGNAL_END; i++) { g_list_free (client->broadcasts[i]); } g_mutex_unlock (client->lock); g_mutex_free (client->lock); g_free (client); }
void xmmsc_ipc_destroy (xmmsc_ipc_t *ipc) { if (!ipc) return; x_list_free (ipc->results_list); if (ipc->transport) { xmms_ipc_transport_destroy (ipc->transport); } if (ipc->out_msg) { x_queue_free (ipc->out_msg); } if (ipc->read_msg) { xmms_ipc_msg_destroy (ipc->read_msg); } if (ipc->error) { free (ipc->error); } if (ipc->disconnect_data && ipc->disconnect_data_free_func) { xmmsc_user_data_free_func_t f = ipc->disconnect_data_free_func; f (ipc->disconnect_data); } if (ipc->need_out_data && ipc->need_out_data_free_func) { xmmsc_user_data_free_func_t f = ipc->need_out_data_free_func; f (ipc->need_out_data); } free (ipc); }
static gboolean xmms_ipc_source_accept (GIOChannel *chan, GIOCondition cond, gpointer data) { xmms_ipc_t *ipc = (xmms_ipc_t *) data; xmms_ipc_transport_t *transport; xmms_ipc_client_t *client; if (!(cond & G_IO_IN)) { xmms_log_error ("IPC listener got error/hup"); return FALSE; } XMMS_DBG ("Client connected"); transport = xmms_ipc_server_accept (ipc->transport); if (!transport) { xmms_log_error ("accept returned null!"); return TRUE; } client = xmms_ipc_client_new (ipc, transport); if (!client) { xmms_ipc_transport_destroy (transport); return TRUE; } g_mutex_lock (ipc->mutex_lock); ipc->clients = g_list_append (ipc->clients, client); g_mutex_unlock (ipc->mutex_lock); /* Now that the client has been registered in the ipc->clients list * we may safely start its thread. */ g_thread_create (xmms_ipc_client_thread, client, FALSE, NULL); return TRUE; }