From 0b66a17293953e905668cc5b5764068b65b9f4c1 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Thu, 13 Oct 2011 21:01:22 +0000 Subject: [PATCH] more client disconnect code --- src/ats/gnunet-service-ats.c | 1 - src/ats/gnunet-service-ats_performance.c | 21 +++++++++++++++ src/ats/gnunet-service-ats_scheduling.c | 33 +++++++++++++++++++----- 3 files changed, 48 insertions(+), 7 deletions(-) diff --git a/src/ats/gnunet-service-ats.c b/src/ats/gnunet-service-ats.c index 3e1a5e5ad..19a5d4380 100644 --- a/src/ats/gnunet-service-ats.c +++ b/src/ats/gnunet-service-ats.c @@ -60,7 +60,6 @@ handle_ats_start (void *cls, struct GNUNET_SERVER_Client *client, } - /** * A client disconnected from us. Tear down the local client * record. diff --git a/src/ats/gnunet-service-ats_performance.c b/src/ats/gnunet-service-ats_performance.c index fa60e4973..edad22512 100644 --- a/src/ats/gnunet-service-ats_performance.c +++ b/src/ats/gnunet-service-ats_performance.c @@ -48,6 +48,18 @@ static struct PerformanceClient *pc_head; * Tail of linked list of all clients to this service. */ static struct PerformanceClient *pc_tail; + + +static struct PerformanceClient * +find_client (struct GNUNET_SERVER_Client *client) +{ + struct PerformanceClient * pc; + + for (pc = pc_head; pc != NULL; pc = pc->next) + if (pc->client == client) + return pc; + return NULL; +} void @@ -55,6 +67,7 @@ GAS_add_performance_client (struct GNUNET_SERVER_Client *client) { struct PerformanceClient * pc; + GNUNET_break (NULL == find_client (client)); pc = GNUNET_malloc (sizeof (struct PerformanceClient)); pc->client = client; GNUNET_CONTAINER_DLL_insert(pc_head, pc_tail, pc); @@ -64,6 +77,14 @@ GAS_add_performance_client (struct GNUNET_SERVER_Client *client) void GAS_remove_performance_client (struct GNUNET_SERVER_Client *client) { + struct PerformanceClient * pc; + + pc = find_client (client); + if (NULL == pc) + return; + GNUNET_CONTAINER_DLL_remove (pc_head, pc_tail, pc); + GNUNET_SERVER_client_drop (client); + GNUNET_free (pc); } diff --git a/src/ats/gnunet-service-ats_scheduling.c b/src/ats/gnunet-service-ats_scheduling.c index 9400e12ff..bf2c6187a 100644 --- a/src/ats/gnunet-service-ats_scheduling.c +++ b/src/ats/gnunet-service-ats_scheduling.c @@ -42,29 +42,50 @@ struct SchedulingClient /** * Head of linked list of all clients to this service. */ -static struct SchedulingClient *ac_head; +static struct SchedulingClient *sc_head; /** * Tail of linked list of all clients to this service. */ -static struct SchedulingClient *ac_tail; +static struct SchedulingClient *sc_tail; + + +static struct SchedulingClient * +find_client (struct GNUNET_SERVER_Client *client) +{ + struct SchedulingClient * sc; + + for (sc = sc_head; sc != NULL; sc = sc->next) + if (sc->client == client) + return sc; + return NULL; +} void GAS_add_scheduling_client (struct GNUNET_SERVER_Client *client) { - struct SchedulingClient *ac; + struct SchedulingClient *sc; - ac = GNUNET_malloc (sizeof (struct SchedulingClient)); - ac->client = client; + GNUNET_break (NULL == find_client (client)); + sc = GNUNET_malloc (sizeof (struct SchedulingClient)); + sc->client = client; GNUNET_SERVER_client_keep (client); - GNUNET_CONTAINER_DLL_insert(ac_head, ac_tail, ac); + GNUNET_CONTAINER_DLL_insert(sc_head, sc_tail, sc); } void GAS_remove_scheduling_client (struct GNUNET_SERVER_Client *client) { + struct SchedulingClient * sc; + + sc = find_client (client); + if (NULL == sc) + return; + GNUNET_CONTAINER_DLL_remove (sc_head, sc_tail, sc); + GNUNET_SERVER_client_drop (client); + GNUNET_free (sc); } -- 2.25.1