diff options
author | Max Kellermann <max@duempel.org> | 2009-07-23 19:20:30 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2009-07-23 19:20:30 +0200 |
commit | 884201b9190946f157f2b4e2aadb5131051cbb5f (patch) | |
tree | db44fd4ca020c11951792e51793b9501b64f3833 /src | |
parent | a0afd0369f5c5918d0eb65847ee1e3cdbfe980a6 (diff) | |
download | mpd-884201b9190946f157f2b4e2aadb5131051cbb5f.tar.gz mpd-884201b9190946f157f2b4e2aadb5131051cbb5f.tar.xz mpd-884201b9190946f157f2b4e2aadb5131051cbb5f.zip |
client: moved some code to client_list_X()
Make the client list management a separate sub-library.
Diffstat (limited to 'src')
-rw-r--r-- | src/client.c | 64 |
1 files changed, 51 insertions, 13 deletions
diff --git a/src/client.c b/src/client.c index 43d6f9e33..5e2ef6b4f 100644 --- a/src/client.c +++ b/src/client.c @@ -103,6 +103,49 @@ static GList *clients; static unsigned num_clients; static guint expire_source_id; +static bool +client_list_is_empty(void) +{ + return num_clients == 0; +} + +static bool +client_list_is_full(void) +{ + return num_clients >= client_max_connections; +} + +static struct client * +client_list_get_first(void) +{ + assert(clients != NULL); + + return clients->data; +} + +static void +client_list_foreach(GFunc func, gpointer user_data) +{ + g_list_foreach(clients, func, user_data); +} + +static void +client_list_add(struct client *client) +{ + clients = g_list_prepend(clients, client); + ++num_clients; +} + +static void +client_list_remove(struct client *client) +{ + assert(num_clients > 0); + assert(clients != NULL); + + clients = g_list_remove(clients, client); + --num_clients; +} + static void client_write_deferred(struct client *client); static void client_write_output(struct client *client); @@ -223,11 +266,7 @@ deferred_buffer_free(gpointer data, G_GNUC_UNUSED gpointer user_data) static void client_close(struct client *client) { - assert(num_clients > 0); - assert(clients != NULL); - - clients = g_list_remove(clients, client); - --num_clients; + client_list_remove(client); client_set_expired(client); @@ -253,15 +292,14 @@ void client_new(int fd, const struct sockaddr *sa, size_t sa_length, int uid) struct client *client; char *remote; - if (num_clients >= client_max_connections) { + if (client_list_is_full()) { g_warning("Max Connections Reached!"); close(fd); return; } client = g_new0(struct client, 1); - clients = g_list_prepend(clients, client); - ++num_clients; + client_list_add(client); client_init(client, fd); client->uid = uid; @@ -568,13 +606,13 @@ void client_manager_init(void) static void client_close_all(void) { - while (clients != NULL) { - struct client *client = clients->data; + while (!client_list_is_empty()) { + struct client *client = client_list_get_first(); client_close(client); } - assert(num_clients == 0); + assert(client_list_is_empty()); } void client_manager_deinit(void) @@ -607,7 +645,7 @@ client_check_expired_callback(gpointer data, G_GNUC_UNUSED gpointer user_data) static void client_manager_expire(void) { - g_list_foreach(clients, client_check_expired_callback, NULL); + client_list_foreach(client_check_expired_callback, NULL); } static size_t @@ -902,7 +940,7 @@ void client_manager_idle_add(unsigned flags) { assert(flags != 0); - g_list_foreach(clients, client_idle_callback, GUINT_TO_POINTER(flags)); + client_list_foreach(client_idle_callback, GUINT_TO_POINTER(flags)); } bool client_idle_wait(struct client *client, unsigned flags) |