int xmmsc_ipc_io_out_callback (xmmsc_ipc_t *ipc) { bool disco = false; x_return_val_if_fail (ipc, false); x_return_val_if_fail (!ipc->disconnect, false); while (!x_queue_is_empty (ipc->out_msg)) { xmms_ipc_msg_t *msg = x_queue_peek_head (ipc->out_msg); if (xmms_ipc_msg_write_transport (msg, ipc->transport, &disco)) { x_queue_pop_head (ipc->out_msg); xmms_ipc_msg_destroy (msg); } else { break; } } if (disco) { xmmsc_ipc_disconnect (ipc); } else { if (ipc->need_out_callback) ipc->need_out_callback (xmmsc_ipc_io_out (ipc), ipc->need_out_data); } return !disco; }
static gboolean xmms_ipc_client_write_cb (GIOChannel *iochan, GIOCondition cond, gpointer data) { xmms_ipc_client_t *client = data; bool disconnect = FALSE; g_return_val_if_fail (client, FALSE); while (TRUE) { xmms_ipc_msg_t *msg; g_mutex_lock (client->lock); msg = g_queue_peek_head (client->out_msg); g_mutex_unlock (client->lock); if (!msg) break; if (!xmms_ipc_msg_write_transport (msg, client->transport, &disconnect)) { if (disconnect) { break; } else { /* try sending again later */ return TRUE; } } g_mutex_lock (client->lock); g_queue_pop_head (client->out_msg); g_mutex_unlock (client->lock); xmms_ipc_msg_destroy (msg); } return FALSE; }