exchange

Base system with REST service to issue digital coins, run by the payment service provider
Log | Files | Refs | Submodules | README | LICENSE

commit cfbc5326c788b9ef2f647a1ce9c73d0fc7d503e7
parent a90ee41a414c8e2c9e550ab325f1db5906c81f41
Author: Christian Grothoff <christian@grothoff.org>
Date:   Fri,  9 May 2025 20:57:46 +0200

fix unclean pthread destruction

Diffstat:
Msrc/util/secmod_common.c | 59++++++++++++++++++++++++++++++++++++-----------------------
1 file changed, 36 insertions(+), 23 deletions(-)

diff --git a/src/util/secmod_common.c b/src/util/secmod_common.c @@ -365,26 +365,6 @@ TES_await_ready (struct TES_Client *client) } -void -TES_free_client (struct TES_Client *client) -{ - GNUNET_assert (0 == pthread_mutex_lock (&TES_clients_lock)); - GNUNET_CONTAINER_DLL_remove (TES_clients_head, - TES_clients_tail, - client); - GNUNET_assert (0 == pthread_mutex_unlock (&TES_clients_lock)); - GNUNET_break (0 == close (client->csock)); -#ifdef __linux__ - GNUNET_break (0 == close (client->esock)); -#else - GNUNET_break (0 == close (client->esock_in)); - GNUNET_break (0 == close (client->esock_out)); -#endif - pthread_detach (client->worker); - GNUNET_free (client); -} - - /** * Main function of a worker thread that signs. * @@ -400,7 +380,6 @@ sign_worker (void *cls) client->cb.init (client)) { GNUNET_break (0); - TES_free_client (client); return NULL; } while (! in_shutdown) @@ -416,7 +395,6 @@ sign_worker (void *cls) client->cb.dispatch)) break; } - TES_free_client (client); return NULL; } @@ -496,7 +474,19 @@ listen_job (void *cls) { GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "pthread_create"); - TES_free_client (client); + GNUNET_assert (0 == pthread_mutex_lock (&TES_clients_lock)); + GNUNET_CONTAINER_DLL_remove (TES_clients_head, + TES_clients_tail, + client); + GNUNET_assert (0 == pthread_mutex_unlock (&TES_clients_lock)); + GNUNET_break (0 == close (client->csock)); +#ifdef __linux__ + GNUNET_break (0 == close (client->esock)); +#else + GNUNET_break (0 == close (client->esock_in)); + GNUNET_break (0 == close (client->esock_out)); +#endif + GNUNET_free (client); } } } @@ -570,6 +560,8 @@ TES_listen_start (const struct GNUNET_CONFIGURATION_Handle *cfg, void TES_listen_stop (void) { + struct TES_Client *client; + if (NULL != listen_task) { GNUNET_SCHEDULER_cancel (listen_task); @@ -590,4 +582,25 @@ TES_listen_stop (void) GNUNET_free (unixpath); in_shutdown = true; TES_wake_clients (); + GNUNET_assert (0 == pthread_mutex_lock (&TES_clients_lock)); + while (NULL != (client = TES_clients_head)) + { + void *rval; + + GNUNET_CONTAINER_DLL_remove (TES_clients_head, + TES_clients_tail, + client); + GNUNET_break (0 == + pthread_join (client->worker, + &rval)); + GNUNET_break (0 == close (client->csock)); +#ifdef __linux__ + GNUNET_break (0 == close (client->esock)); +#else + GNUNET_break (0 == close (client->esock_in)); + GNUNET_break (0 == close (client->esock_out)); +#endif + GNUNET_free (client); + } + GNUNET_assert (0 == pthread_mutex_unlock (&TES_clients_lock)); }