aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2008-12-24 03:00:08 +0100
committerMax Kellermann <max@duempel.org>2008-12-24 03:00:08 +0100
commitd2d11d70a80bde0b348ccfd59bf1ec82bb997cb7 (patch)
tree2912851b969ea47444224406e2c7c6ffc9b25f24
parentd96cda95a18d50c6deb79cbb31ea084579a9c208 (diff)
downloadmpd-d2d11d70a80bde0b348ccfd59bf1ec82bb997cb7.tar.gz
mpd-d2d11d70a80bde0b348ccfd59bf1ec82bb997cb7.tar.xz
mpd-d2d11d70a80bde0b348ccfd59bf1ec82bb997cb7.zip
client: always attempt to flush deferred buffers
When a response is very long (e.g. a large playlist > 100k songs), most of it will end up in the deferred buffers. Filling the deferred queue is very expensive currently, because a new buffer is allocated for every client_write() operation. This may lead to long delays, and the client might give up and disconnect meanwhile. This patch makes MPD attempt to flush the deferred queue as often as possible, to work around this problem. Due to the MPD 0.14 code freeze, we should not optimize the buffering code now.
Diffstat (limited to '')
-rw-r--r--src/client.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/client.c b/src/client.c
index f654797b7..74b31392a 100644
--- a/src/client.c
+++ b/src/client.c
@@ -700,10 +700,19 @@ static void client_write_output(struct client *client)
if (client_is_expired(client) || !client->send_buf_used)
return;
- if (!g_queue_is_empty(client->deferred_send))
+ if (!g_queue_is_empty(client->deferred_send)) {
client_defer_output(client, client->send_buf,
client->send_buf_used);
- else
+
+ /* try to flush the deferred buffers now; the current
+ server command may take too long to finish, and
+ meanwhile try to feed output to the client,
+ otherwise it will time out. One reason why
+ deferring is slow might be that currently each
+ client_write() allocates a new deferred buffer.
+ This should be optimized after MPD 0.14. */
+ client_write_deferred(client);
+ } else
client_write_direct(client, client->send_buf,
client->send_buf_used);