From: Rusty Russell Date: Tue, 25 Jan 2011 02:12:43 +0000 (+1030) Subject: lca2011: use max_clients field to control dynamic length of clients array. X-Git-Url: https://git.ozlabs.org/?p=ccan-lca-2011.git;a=commitdiff_plain;h=b6eb393a66f1018e73f7c16cc7c61e97ab632fcb lca2011: use max_clients field to control dynamic length of clients array. --- diff --git a/ccan/oserver/oserver.c b/ccan/oserver/oserver.c index 362bfae..9fb7ebb 100644 --- a/ccan/oserver/oserver.c +++ b/ccan/oserver/oserver.c @@ -87,7 +87,7 @@ static bool get_subclient(struct client *me) { unsigned int i; - for (i = 0; i < ARRAY_SIZE(me->oserver->clients); i++) { + for (i = 0; i < me->oserver->max_clients; i++) { struct client *c = me->oserver->clients[i]; if (!c || c == me) continue; @@ -104,7 +104,7 @@ static bool get_oracle(struct client *me) { unsigned int i; - for (i = 0; i < ARRAY_SIZE(me->oserver->clients); i++) { + for (i = 0; i < me->oserver->max_clients; i++) { struct client *c = me->oserver->clients[i]; if (!c || c == me) continue; @@ -223,15 +223,21 @@ static int cleanup_client(struct client *client) return 0; } -static unsigned int max_client(struct client *clients[5]) +static unsigned int find_id(struct oserver *oserver) { - unsigned int i, ret = 0; + unsigned int id; - for (i = 0; i < 5; i++) { - if (clients[i]) - ret = i+1; + for (id = 0; id < oserver->max_clients; id++) { + if (oserver->clients[id] == NULL) + return id; } - return ret; + + /* Enlarge. */ + oserver->clients = talloc_realloc(oserver, + oserver->clients, + struct client *, + ++oserver->max_clients); + return id; } static void add_client(struct tevent_context *ev, @@ -257,21 +263,8 @@ static void add_client(struct tevent_context *ev, service_client, client); tevent_fd_set_auto_close(client->fde); - /* Find empty slot in array for this client. */ - for (client->id = 0; oserver->clients[client->id]; client->id++); + client->id = find_id(oserver); oserver->clients[client->id] = client; - talloc_set_destructor(client, cleanup_client); - - /* Full? Stop listening... */ - if (client->id == ARRAY_SIZE(oserver->clients)-1) - tevent_fd_set_flags(oserver->fde, 0); - oserver->max_clients = max_client(oserver->clients); -} - -static void clear_clients(struct oserver *oserver) -{ - memset(oserver->clients, 0, - ARRAY_SIZE(oserver->clients) * sizeof(oserver->clients[0])); } static int destroy_oserver(struct oserver *oserver) @@ -343,8 +336,6 @@ static bool load_file(struct oserver *oserver, const char *file) static bool complete_server(struct tevent_context *ev, struct oserver *oserver, const char *dumpfile) { - oserver->max_clients = max_client(oserver->clients); - /* Re-set this even if restored from file, in case it changed. */ oserver->dumpfile = dumpfile; if (oserver->dumpfile) @@ -375,7 +366,7 @@ struct oserver *oserver_restore(struct tevent_context *ev, const char *dumpfile) } /* Restore ignored fields in clients, and talloc hierarchy. */ - for (i = 0; i < ARRAY_SIZE(oserver->clients); i++) { + for (i = 0; i < oserver->max_clients; i++) { struct client *client = oserver->clients[i]; if (!client) continue; @@ -419,7 +410,8 @@ struct oserver *oserver_setup(struct tevent_context *ev, unsigned short port, oserver->argv_len++); } else oserver->argv_len = 0; - clear_clients(oserver); + oserver->max_clients = 0; + oserver->clients = NULL; oserver->fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (oserver->fd < 0) { talloc_free(oserver); diff --git a/ccan/oserver/oserver_types.h b/ccan/oserver/oserver_types.h index 6f7b42b..4d70199 100644 --- a/ccan/oserver/oserver_types.h +++ b/ccan/oserver/oserver_types.h @@ -38,8 +38,7 @@ CDUMP_SAVED struct client { CDUMP_SAVED struct oserver { unsigned int max_clients; - /* 5 clients should be enough for anybody! */ - struct client *clients[5]; + struct client **clients CDUMP_LEN(max_clients); int fd; struct tevent_fd *fde CDUMP_IGNORE; const char *dumpfile; diff --git a/ccan/oserver/test/run-one-client-disconnect.c b/ccan/oserver/test/run-one-client-disconnect.c index f26c6ef..a0c9ca5 100644 --- a/ccan/oserver/test/run-one-client-disconnect.c +++ b/ccan/oserver/test/run-one-client-disconnect.c @@ -87,7 +87,7 @@ static unsigned int count_clients(struct oserver *oserver) { unsigned int i, count = 0; - for (i = 0; i < ARRAY_SIZE(oserver->clients); i++) { + for (i = 0; i < oserver->max_clients; i++) { if (oserver->clients[i]) count++; }