[phodav] spice-webdavd: remove client on push error
- From: Marc-Andre Lureau <malureau src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [phodav] spice-webdavd: remove client on push error
- Date: Mon, 9 Feb 2015 14:55:56 +0000 (UTC)
commit 741b28ba59b84aefbcedbf1d24942e25c9806cea
Author: Marc-André Lureau <marcandre lureau gmail com>
Date: Mon Feb 9 14:26:28 2015 +0100
spice-webdavd: remove client on push error
spice/spice-webdavd.c | 56 +++++++++++++++++++++++++++++++++---------------
1 files changed, 38 insertions(+), 18 deletions(-)
---
diff --git a/spice/spice-webdavd.c b/spice/spice-webdavd.c
index 708b0c6..2235bcb 100644
--- a/spice/spice-webdavd.c
+++ b/spice/spice-webdavd.c
@@ -46,12 +46,14 @@ typedef struct _OutputQueue
GQueue *queue;
} OutputQueue;
+typedef void (*PushedCb) (OutputQueue *q, gpointer user_data, GError *error);
+
typedef struct _OutputQueueElem
{
OutputQueue *queue;
const guint8 *buf;
gsize size;
- GFunc cb;
+ PushedCb cb;
gpointer user_data;
} OutputQueueElem;
@@ -144,11 +146,11 @@ output_queue_idle (gpointer user_data)
g_debug ("flushing %" G_GSIZE_FORMAT, e->size);
g_output_stream_write_all (q->output, e->buf, e->size, NULL, NULL, &error);
- if (error)
- goto end;
-
if (e->cb)
- e->cb (q, e->user_data);
+ e->cb (q, e->user_data, error);
+
+ if (error)
+ goto end;
q->flushing = TRUE;
g_output_stream_flush_async (q->output, G_PRIORITY_DEFAULT, NULL, output_queue_flush_cb, e);
@@ -157,12 +159,7 @@ output_queue_idle (gpointer user_data)
return FALSE;
end:
- if (error)
- {
- g_warning ("error: %s", error->message);
- g_clear_error (&error);
- }
-
+ g_clear_error (&error);
q->idle_id = 0;
g_free (e);
output_queue_unref (q);
@@ -172,7 +169,7 @@ end:
static void
output_queue_push (OutputQueue *q, const guint8 *buf, gsize size,
- GFunc pushed_cb, gpointer user_data)
+ PushedCb pushed_cb, gpointer user_data)
{
OutputQueueElem *e = g_new (OutputQueueElem, 1);
@@ -343,8 +340,26 @@ my_input_stream_read_finish (GInputStream *stream,
}
static void
-mux_pushed_client_cb (OutputQueue *q, gpointer user_data)
+handle_push_error (OutputQueue *q, gpointer user_data, GError *error)
+{
+ Client *client = user_data;
+
+ if (!error)
+ return;
+
+ g_warning ("push error: %s", error->message);
+ remove_client (client);
+ return;
+}
+
+static void
+mux_pushed_client_cb (OutputQueue *q, gpointer user_data, GError *error)
{
+ if (error) {
+ handle_push_error (q, user_data, error);
+ return;
+ }
+
start_mux_read (mux_istream);
}
@@ -372,7 +387,7 @@ mux_data_read_cb (GObject *source_object,
if (c)
output_queue_push (c->queue, (guint8 *) demux.buf, demux.size,
- (GFunc) mux_pushed_client_cb, c);
+ mux_pushed_client_cb, c);
else
start_mux_read (mux_istream);
}
@@ -444,10 +459,15 @@ start_mux_read (GInputStream *istream)
static void client_start_read (Client *client);
static void
-mux_pushed_cb (OutputQueue *q, gpointer user_data)
+mux_pushed_cb (OutputQueue *q, gpointer user_data, GError *error)
{
Client *client = user_data;
+ if (error) {
+ handle_push_error (q, client, error);
+ return;
+ }
+
if (client->size == 0)
{
remove_client (client);
@@ -480,9 +500,9 @@ client_read_cb (GObject *source_object,
g_return_if_fail (size >= 0);
client->size = size;
- output_queue_push (mux_queue, (guint8 *) &client->id, sizeof (gint64), NULL, NULL);
- output_queue_push (mux_queue, (guint8 *) &client->size, sizeof (guint16), NULL, NULL);
- output_queue_push (mux_queue, (guint8 *) client->buf, size, (GFunc) mux_pushed_cb, client);
+ output_queue_push (mux_queue, (guint8 *) &client->id, sizeof (gint64), handle_push_error, client);
+ output_queue_push (mux_queue, (guint8 *) &client->size, sizeof (guint16), handle_push_error, client);
+ output_queue_push (mux_queue, (guint8 *) client->buf, size, mux_pushed_cb, client);
return;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]