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:
parent
a12b57e1e9
commit
3cd0b90ff6
23
src/client.c
23
src/client.c
@ -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;
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user