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 LIST_HEAD(clients);
static unsigned num_clients; static unsigned num_clients;
static guint expire_source_id;
static void client_write_deferred(struct client *client); static void client_write_deferred(struct client *client);
@ -135,8 +136,27 @@ void client_set_permission(struct client *client, unsigned permission)
client->permission = 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) 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) { if (client->source_id != 0) {
g_source_remove(client->source_id); g_source_remove(client->source_id);
client->source_id = 0; client->source_id = 0;
@ -601,7 +621,8 @@ void client_manager_deinit(void)
client_max_connections = 0; client_max_connections = 0;
} }
void client_manager_expire(void) static void
client_manager_expire(void)
{ {
struct client *client, *n; struct client *client, *n;

View File

@ -29,7 +29,6 @@ struct sockaddr;
void client_manager_init(void); void client_manager_init(void);
void client_manager_deinit(void); void client_manager_deinit(void);
void client_manager_expire(void);
void client_new(int fd, const struct sockaddr *addr, int uid); void client_new(int fd, const struct sockaddr *addr, int uid);

View File

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