exchange

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

commit 9a68b1c633019dfe2c2072315be06570a105be52
parent d9fb333e6ae2fc49f3fa792c560c42a0c7b89f0d
Author: Christian Grothoff <christian@grothoff.org>
Date:   Sat, 10 May 2025 01:55:58 +0200

Revert "fix unclean pthread destruction"

This reverts commit cfbc5326c788b9ef2f647a1ce9c73d0fc7d503e7.

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

diff --git a/src/util/secmod_common.c b/src/util/secmod_common.c @@ -365,6 +365,26 @@ 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. * @@ -380,6 +400,7 @@ sign_worker (void *cls) client->cb.init (client)) { GNUNET_break (0); + TES_free_client (client); return NULL; } while (! in_shutdown) @@ -395,6 +416,7 @@ sign_worker (void *cls) client->cb.dispatch)) break; } + TES_free_client (client); return NULL; } @@ -474,19 +496,7 @@ listen_job (void *cls) { GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "pthread_create"); - 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); + TES_free_client (client); } } } @@ -560,8 +570,6 @@ 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); @@ -582,25 +590,4 @@ 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)); }