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:
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));
}