diff options
author | Max Kellermann <max@duempel.org> | 2009-03-15 19:06:10 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2009-03-15 19:06:10 +0100 |
commit | 58844aabac6407a95a8c2fb5ad22f969628c6bed (patch) | |
tree | 99e0befa7a14fd62b20790a8839ec09bd540832c /src/output/httpd_client.c | |
parent | 50c2dde5b50dcd864db362c47c859ea23f2ec16b (diff) | |
download | mpd-58844aabac6407a95a8c2fb5ad22f969628c6bed.tar.gz mpd-58844aabac6407a95a8c2fb5ad22f969628c6bed.tar.xz mpd-58844aabac6407a95a8c2fb5ad22f969628c6bed.zip |
httpd_output: clear the client's page queue on cancel
When the httpd output is cancelled, it freed all pages, but didn't
remove them from the queue. Call g_queue_clear() and remove the
write source id.
Diffstat (limited to 'src/output/httpd_client.c')
-rw-r--r-- | src/output/httpd_client.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/src/output/httpd_client.c b/src/output/httpd_client.c index fb3f0548a..6f87b972a 100644 --- a/src/output/httpd_client.c +++ b/src/output/httpd_client.c @@ -409,13 +409,24 @@ httpd_client_queue_size(const struct httpd_client *client) return size; } +/* g_queue_clear() was introduced in GLib 2.14 */ +#if !GLIB_CHECK_VERSION(2,14,0) +#define g_queue_clear(q) do { g_queue_free(q); q = g_queue_new(); } while (0) +#endif + void -httpd_client_cancel(const struct httpd_client *client) +httpd_client_cancel(struct httpd_client *client) { if (client->state != RESPONSE) return; g_queue_foreach(client->pages, httpd_client_unref_page, NULL); + g_queue_clear(client->pages); + + if (client->write_source_id != 0 && client->current_page == NULL) { + g_source_remove(client->write_source_id); + client->write_source_id = 0; + } } static GIOStatus |