54 lines
1.5 KiB
Diff
54 lines
1.5 KiB
Diff
|
--- a/src/transcode.c
|
||
|
+++ b/src/transcode.c
|
||
|
@@ -41,6 +41,7 @@
|
||
|
|
||
|
#include <ctype.h>
|
||
|
#include <math.h>
|
||
|
+#include <stdatomic.h>
|
||
|
|
||
|
#include "cmdline.h"
|
||
|
|
||
|
@@ -215,6 +216,7 @@
|
||
|
/*************************************************************************/
|
||
|
|
||
|
static pthread_t event_thread_id = (pthread_t)0;
|
||
|
+static atomic_flag event_thread_cancel;
|
||
|
static const char *signame = "unknown signal";
|
||
|
|
||
|
static void tc_stop_all(void)
|
||
|
@@ -271,7 +273,7 @@
|
||
|
|
||
|
/* Loop waiting for external events */
|
||
|
for (;;) {
|
||
|
- pthread_testcancel();
|
||
|
+ if (!atomic_flag_test_and_set(&event_thread_cancel)) pthread_exit(NULL);
|
||
|
|
||
|
tc_socket_wait();
|
||
|
|
||
|
@@ -283,7 +285,7 @@
|
||
|
if (tc_probe_pid > 0)
|
||
|
kill(tc_probe_pid, SIGTERM);
|
||
|
}
|
||
|
- pthread_testcancel();
|
||
|
+ if (!atomic_flag_test_and_set(&event_thread_cancel)) pthread_exit(NULL);
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
@@ -305,7 +307,7 @@
|
||
|
void *thread_status = NULL;
|
||
|
|
||
|
// pthread_kill(event_thread_id, SIGINT);
|
||
|
- pthread_cancel(event_thread_id);
|
||
|
+ atomic_flag_clear(&event_thread_cancel);
|
||
|
pthread_join(event_thread_id, &thread_status);
|
||
|
}
|
||
|
}
|
||
|
@@ -2721,6 +2723,7 @@
|
||
|
tc_error("failed to initialize socket handler");
|
||
|
|
||
|
// now we start the signal handler thread
|
||
|
+ atomic_flag_test_and_set(&event_thread_cancel);
|
||
|
if (pthread_create(&event_thread_id, NULL, event_thread, &sigs_to_block) != 0)
|
||
|
tc_error("failed to start signal handler thread");
|
||
|
|