From d2d11d70a80bde0b348ccfd59bf1ec82bb997cb7 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 24 Dec 2008 03:00:08 +0100 Subject: 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. --- src/client.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'src') 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); -- cgit v1.2.3