From 95f9076a2139f5fb042b944a0658b6cda2fa35db Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sat, 30 Apr 2016 08:17:37 +0000 Subject: implementing new scheduler shutdown semantics --- src/peerstore/gnunet-peerstore.c | 11 +++---- src/peerstore/gnunet-service-peerstore.c | 55 ++++++++++++++++++++------------ src/peerstore/peerstore_api.c | 6 ++-- 3 files changed, 43 insertions(+), 29 deletions(-) (limited to 'src/peerstore') diff --git a/src/peerstore/gnunet-peerstore.c b/src/peerstore/gnunet-peerstore.c index 68ae1746f..25a4f0ff4 100644 --- a/src/peerstore/gnunet-peerstore.c +++ b/src/peerstore/gnunet-peerstore.c @@ -60,16 +60,15 @@ shutdown_task (void *cls) * @param cfg configuration */ static void -run (void *cls, char *const *args, const char *cfgfile, +run (void *cls, + char *const *args, + const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg) { - - peerstore_handle = NULL; - GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &shutdown_task, - NULL); + GNUNET_SCHEDULER_add_shutdown (&shutdown_task, + NULL); peerstore_handle = GNUNET_PEERSTORE_connect (cfg); GNUNET_assert (NULL != peerstore_handle); - ret = 0; } diff --git a/src/peerstore/gnunet-service-peerstore.c b/src/peerstore/gnunet-service-peerstore.c index 3a2d928e3..048201c77 100644 --- a/src/peerstore/gnunet-service-peerstore.c +++ b/src/peerstore/gnunet-service-peerstore.c @@ -90,6 +90,11 @@ static struct ClientEntry *client_head; */ static struct ClientEntry *client_tail; +/** + * Task run to clean up expired records. + */ +static struct GNUNET_SCHEDULER_Task *expire_task; + /** * Are we in the process of shutting down the service? #GNUNET_YES / #GNUNET_NO */ @@ -117,6 +122,11 @@ do_shutdown () GNUNET_CONTAINER_multihashmap_destroy (watchers); watchers = NULL; } + if (NULL != expire_task) + { + GNUNET_SCHEDULER_cancel (expire_task); + expire_task = NULL; + } GNUNET_SCHEDULER_shutdown (); } @@ -147,21 +157,18 @@ static void cleanup_expired_records (void *cls) { int ret; - const struct GNUNET_SCHEDULER_TaskContext *tc; - tc = GNUNET_SCHEDULER_get_task_context (); - if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)) - return; + expire_task = NULL; GNUNET_assert (NULL != db); - ret = - db->expire_records (db->cls, GNUNET_TIME_absolute_get (), - expire_records_continuation, NULL); + ret = db->expire_records (db->cls, GNUNET_TIME_absolute_get (), + &expire_records_continuation, NULL); if (GNUNET_OK != ret) { - GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply - (GNUNET_TIME_UNIT_SECONDS, - EXPIRED_RECORDS_CLEANUP_INTERVAL), - &cleanup_expired_records, NULL); + GNUNET_assert (NULL == expire_task); + expire_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply + (GNUNET_TIME_UNIT_SECONDS, + EXPIRED_RECORDS_CLEANUP_INTERVAL), + &cleanup_expired_records, NULL); } } @@ -173,14 +180,18 @@ cleanup_expired_records (void *cls) * @param success count of records deleted or #GNUNET_SYSERR */ static void -expire_records_continuation (void *cls, int success) +expire_records_continuation (void *cls, + int success) { if (success > 0) - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "%d records expired.\n", success); - GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply - (GNUNET_TIME_UNIT_SECONDS, - EXPIRED_RECORDS_CLEANUP_INTERVAL), - &cleanup_expired_records, NULL); + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "%d records expired.\n", + success); + GNUNET_assert (NULL == expire_task); + expire_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply + (GNUNET_TIME_UNIT_SECONDS, + EXPIRED_RECORDS_CLEANUP_INTERVAL), + &cleanup_expired_records, NULL); } @@ -565,18 +576,20 @@ run (void *cls, struct GNUNET_SERVER_Handle *server, if (NULL == db) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Could not load database backend `%s'\n"), db_lib_name); + _("Could not load database backend `%s'\n"), + db_lib_name); GNUNET_SCHEDULER_add_now (&shutdown_task, NULL); return; } nc = GNUNET_SERVER_notification_context_create (server, 16); watchers = GNUNET_CONTAINER_multihashmap_create (10, GNUNET_NO); - GNUNET_SCHEDULER_add_now (&cleanup_expired_records, NULL); + expire_task = GNUNET_SCHEDULER_add_now (&cleanup_expired_records, + NULL); GNUNET_SERVER_add_handlers (server, handlers); GNUNET_SERVER_connect_notify (server, &handle_client_connect, NULL); GNUNET_SERVER_disconnect_notify (server, &handle_client_disconnect, NULL); - GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &shutdown_task, - NULL); + GNUNET_SCHEDULER_add_shutdown (&shutdown_task, + NULL); } diff --git a/src/peerstore/peerstore_api.c b/src/peerstore/peerstore_api.c index 14117a333..f1c5ccd32 100644 --- a/src/peerstore/peerstore_api.c +++ b/src/peerstore/peerstore_api.c @@ -213,7 +213,7 @@ struct GNUNET_PEERSTORE_IterateContext * Task identifier for the function called * on iterate request timeout */ - struct GNUNET_SCHEDULER_Task * timeout_task; + struct GNUNET_SCHEDULER_Task *timeout_task; }; @@ -340,7 +340,9 @@ handle_client_error (void *cls, enum GNUNET_MQ_Error error) * @return #GNUNET_YES (continue to iterate) */ static int -rewatch_it (void *cls, const struct GNUNET_HashCode *key, void *value) +rewatch_it (void *cls, + const struct GNUNET_HashCode *key, + void *value) { struct GNUNET_PEERSTORE_Handle *h = cls; struct GNUNET_PEERSTORE_WatchContext *wc = value; -- cgit v1.2.3