diff options
author | Max Kellermann <max@duempel.org> | 2008-12-24 03:00:08 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2008-12-24 03:00:08 +0100 |
commit | d2d11d70a80bde0b348ccfd59bf1ec82bb997cb7 (patch) | |
tree | 2912851b969ea47444224406e2c7c6ffc9b25f24 /src/client.c | |
parent | d96cda95a18d50c6deb79cbb31ea084579a9c208 (diff) | |
download | mpd-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.c | 13 |
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); |