Просмотр исходного кода

Allow using custom signal handler from non-main thread (#2551)

Remove thread local attribute of prev_sig_act_SIGSEGV/SIGBUS to allow using
custom signal handler from non-main thread since in a thread spawned by
embedder, embedder may be unable to call wasm_runtime_init_thread_env to
initialize them.

And fix the handling of prev_sig_act when its sa_handler is SIG_DFL, SIG_IGN,
or a user customized handler.
Enrico Loparco 2 лет назад
Родитель
Сommit
132378f30b
1 измененных файлов с 10 добавлено и 5 удалено
  1. 10 5
      core/shared/platform/common/posix/posix_thread.c

+ 10 - 5
core/shared/platform/common/posix/posix_thread.c

@@ -509,8 +509,8 @@ mask_signals(int how)
     pthread_sigmask(how, &set, NULL);
 }
 
-static os_thread_local_attribute struct sigaction prev_sig_act_SIGSEGV;
-static os_thread_local_attribute struct sigaction prev_sig_act_SIGBUS;
+static struct sigaction prev_sig_act_SIGSEGV;
+static struct sigaction prev_sig_act_SIGBUS;
 
 /* ASAN is not designed to work with custom stack unwind or other low-level \
  things. > Ignore a function that does some low-level magic. (e.g. walking \
@@ -540,11 +540,16 @@ signal_callback(int sig_num, siginfo_t *sig_info, void *sig_ucontext)
     if (prev_sig_act && (prev_sig_act->sa_flags & SA_SIGINFO)) {
         prev_sig_act->sa_sigaction(sig_num, sig_info, sig_ucontext);
     }
-    else if (prev_sig_act
-             && ((void *)prev_sig_act->sa_sigaction == SIG_DFL
-                 || (void *)prev_sig_act->sa_sigaction == SIG_IGN)) {
+    else if (prev_sig_act && (void *)prev_sig_act->sa_handler == SIG_DFL) {
+        /* Default action */
         sigaction(sig_num, prev_sig_act, NULL);
     }
+    else if (prev_sig_act && (void *)prev_sig_act->sa_handler == SIG_IGN) {
+        /* Ignore this signal */
+    }
+    else if (prev_sig_act && prev_sig_act->sa_handler) {
+        prev_sig_act->sa_handler(sig_num);
+    }
     /* Output signal info and then crash if signal is unhandled */
     else {
         switch (sig_num) {