termux-packages/packages/libknot/pthread_cancel.patch

93 lines
1.9 KiB
Diff

--- a/src/contrib/conn_pool.c
+++ b/src/contrib/conn_pool.c
@@ -63,10 +63,26 @@
return fd;
}
+#ifdef __ANDROID__
+static void thread_signal_handler(int signum)
+{
+ pthread_exit(0);
+}
+#endif
+
static void *closing_thread(void *_arg)
{
conn_pool_t *pool = _arg;
+#ifdef __ANDROID__
+ struct sigaction actions;
+ memset(&actions, 0, sizeof(actions));
+ sigemptyset(&actions.sa_mask);
+ actions.sa_flags = 0;
+ actions.sa_handler = thread_signal_handler;
+ sigaction(SIGUSR2, &actions, NULL);
+#endif
+
while (true) {
knot_time_t now = knot_time(), next = 0;
knot_timediff_t timeout = conn_pool_timeout(pool, 0);
@@ -117,7 +133,11 @@
void conn_pool_deinit(conn_pool_t *pool)
{
if (pool != NULL) {
+#ifndef __ANDROID__
pthread_cancel(pool->closing_thread);
+#else
+ pthread_kill(pool->closing_thread, SIGUSR2);
+#endif
pthread_join(pool->closing_thread, NULL);
int fd;
--- a/src/knot/common/stats.c
+++ b/src/knot/common/stats.c
@@ -249,8 +249,24 @@
free(file_name);
}
+#ifdef __ANDROID__
+static void thread_signal_handler(int signum)
+{
+ pthread_exit(0);
+}
+#endif
+
static void *dumper(void *data)
{
+#ifdef __ANDROID__
+ struct sigaction actions;
+ memset(&actions, 0, sizeof(actions));
+ sigemptyset(&actions.sa_mask);
+ actions.sa_flags = 0;
+ actions.sa_handler = thread_signal_handler;
+ sigaction(SIGUSR2, &actions, NULL);
+#endif
+
while (true) {
assert(stats.timer > 0);
sleep(stats.timer);
@@ -291,7 +307,11 @@
}
// Stop current dumping.
} else if (stats.active_dumper) {
+#ifndef __ANDROID__
pthread_cancel(stats.dumper);
+#else
+ pthread_kill(stats.dumper, SIGUSR2);
+#endif
pthread_join(stats.dumper, NULL);
stats.active_dumper = false;
}
@@ -300,7 +320,11 @@
void stats_deinit(void)
{
if (stats.active_dumper) {
+#ifndef __ANDROID__
pthread_cancel(stats.dumper);
+#else
+ pthread_kill(stats.dumper, SIGUSR2);
+#endif
pthread_join(stats.dumper, NULL);
}