aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/client.c23
-rw-r--r--src/client.h1
-rw-r--r--src/main.c1
3 files changed, 22 insertions, 3 deletions
diff --git a/src/client.c b/src/client.c
index 117155bd9..9a251d3db 100644
--- a/src/client.c
+++ b/src/client.c
@@ -110,6 +110,7 @@ struct client {
static LIST_HEAD(clients);
static unsigned num_clients;
+static guint expire_source_id;
static void client_write_deferred(struct client *client);
@@ -135,8 +136,27 @@ void client_set_permission(struct client *client, unsigned permission)
client->permission = permission;
}
+static void
+client_manager_expire(void);
+
+/**
+ * An idle event which calls client_manager_expire().
+ */
+static gboolean
+client_manager_expire_event(G_GNUC_UNUSED gpointer data)
+{
+ expire_source_id = 0;
+ client_manager_expire();
+ return false;
+}
+
static inline void client_set_expired(struct client *client)
{
+ if (expire_source_id == 0 && client->fd >= 0)
+ /* delayed deletion */
+ expire_source_id = g_idle_add(client_manager_expire_event,
+ NULL);
+
if (client->source_id != 0) {
g_source_remove(client->source_id);
client->source_id = 0;
@@ -601,7 +621,8 @@ void client_manager_deinit(void)
client_max_connections = 0;
}
-void client_manager_expire(void)
+static void
+client_manager_expire(void)
{
struct client *client, *n;
diff --git a/src/client.h b/src/client.h
index dabd1c576..d2e3301dc 100644
--- a/src/client.h
+++ b/src/client.h
@@ -29,7 +29,6 @@ struct sockaddr;
void client_manager_init(void);
void client_manager_deinit(void);
-void client_manager_expire(void);
void client_new(int fd, const struct sockaddr *addr, int uid);
diff --git a/src/main.c b/src/main.c
index 28cce4b71..23bff7c8a 100644
--- a/src/main.c
+++ b/src/main.c
@@ -196,7 +196,6 @@ main_notify_triggered(void)
unsigned flags;
syncPlayerAndPlaylist();
- client_manager_expire();
reap_update_task();
/* send "idle" notificaions to all subscribed