client: run client_manager_expire() in an idle event

With the GLib main loop, the client manager can install its own event
in case a client is expired.  No need for main.c to call
client_manager_expire() manually.
This commit is contained in:
Max Kellermann 2008-12-31 14:30:03 +01:00
parent a12b57e1e9
commit 3cd0b90ff6
3 changed files with 22 additions and 3 deletions

View File

@ -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;

View File

@ -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);

View File

@ -196,7 +196,6 @@ main_notify_triggered(void)
unsigned flags;
syncPlayerAndPlaylist();
client_manager_expire();
reap_update_task();
/* send "idle" notificaions to all subscribed