--- src/cups/thread.c 2020-07-05 13:16:28.060000000 +0000 +++ src-mod/cups/thread.c 2020-07-05 13:18:17.010000000 +0000 @@ -145,6 +145,40 @@ pthread_rwlock_unlock(rwlock); } +/* + * '_cupsThreadAndroidSignalHandler()' - Wrapper around pthread_exit(0) to be called from a signal handler + */ + +void +_cupsThreadAndroidSignalHandler(int sig) +{ + pthread_exit(0); +} + +/* + * '_cupsThreadAndroidWrapper()' - Function for wrapping a thread start with a signal handler for cancellation + */ + +void * +_cupsThreadAndroidWrapper(void *arg) +{ + _cups_wrapped_thread_func_t *wrapped = (_cups_wrapped_thread_func_t*) arg; + + struct sigaction actions; + memset(&actions, 0, sizeof(actions)); + sigemptyset(&actions.sa_mask); + actions.sa_flags = 0; + actions.sa_handler = _cupsThreadAndroidSignalHandler; + sigaction(SIGUSR2, &actions, NULL); + + _cups_thread_func_t func = wrapped->func; + void *func_arg = wrapped->arg; + + free(wrapped); + + return (*func)(func_arg); +} + /* * '_cupsThreadCancel()' - Cancel (kill) a thread. @@ -153,7 +187,7 @@ void _cupsThreadCancel(_cups_thread_t thread)/* I - Thread ID */ { - pthread_cancel(thread); + pthread_kill(thread, SIGUSR2); } @@ -168,7 +202,11 @@ { pthread_t thread; - if (pthread_create(&thread, NULL, (void *(*)(void *))func, arg)) + _cups_wrapped_thread_func_t *wrapped = malloc(sizeof(_cups_wrapped_thread_func_t)); + wrapped->func = func; + wrapped->arg = arg; + + if (pthread_create(&thread, NULL, _cupsThreadAndroidWrapper, wrapped)) return (0); else return (thread);