diff options
| author | Po Lu | 2023-06-17 12:07:40 +0800 |
|---|---|---|
| committer | Po Lu | 2023-06-17 12:07:40 +0800 |
| commit | 797c30b7abc165d5ebe65474c7398ccad0e3023c (patch) | |
| tree | 86598bd005f85684a8ff67dc5c67cce9548fcc1f /src/android.c | |
| parent | fa821ed18639aa1b0275c2938af9987c0c71b581 (diff) | |
| download | emacs-797c30b7abc165d5ebe65474c7398ccad0e3023c.tar.gz emacs-797c30b7abc165d5ebe65474c7398ccad0e3023c.zip | |
Initialize signal mask earlier
* java/org/gnu/emacs/EmacsService.java (onCreate, run): Don't
initialize signal mask here.
* java/org/gnu/emacs/EmacsApplication.java (onCreate): Do it
here instead.
* src/android.c (JNICALL): Restore previous signal masks.
Diffstat (limited to 'src/android.c')
| -rw-r--r-- | src/android.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/src/android.c b/src/android.c index ccc2da95f03..d6a56dfe0b8 100644 --- a/src/android.c +++ b/src/android.c | |||
| @@ -261,6 +261,14 @@ void *unused_pointer; | |||
| 261 | 261 | ||
| 262 | #endif /* __i386__ */ | 262 | #endif /* __i386__ */ |
| 263 | 263 | ||
| 264 | /* Whether or not the default signal mask has been changed. If so, | ||
| 265 | the signal mask must be restored before calling | ||
| 266 | android_emacs_init. */ | ||
| 267 | static bool signal_mask_changed_p; | ||
| 268 | |||
| 269 | /* The signal mask at the time Emacs was started. */ | ||
| 270 | static sigset_t startup_signal_mask; | ||
| 271 | |||
| 264 | 272 | ||
| 265 | 273 | ||
| 266 | /* Event handling functions. Events are stored on a (circular) queue | 274 | /* Event handling functions. Events are stored on a (circular) queue |
| @@ -2562,7 +2570,15 @@ NATIVE_NAME (initEmacs) (JNIEnv *env, jobject object, jarray argv, | |||
| 2562 | ANDROID_DELETE_LOCAL_REF (argv); | 2570 | ANDROID_DELETE_LOCAL_REF (argv); |
| 2563 | ANDROID_DELETE_LOCAL_REF (dump_file_object); | 2571 | ANDROID_DELETE_LOCAL_REF (dump_file_object); |
| 2564 | 2572 | ||
| 2573 | /* Restore the signal mask at the time of startup if it was changed | ||
| 2574 | to block unwanted signals from reaching system threads. */ | ||
| 2575 | |||
| 2576 | if (signal_mask_changed_p) | ||
| 2577 | pthread_sigmask (SIG_SETMASK, &startup_signal_mask, NULL); | ||
| 2578 | |||
| 2579 | /* Now start Emacs proper. */ | ||
| 2565 | android_emacs_init (nelements, c_argv, dump_file); | 2580 | android_emacs_init (nelements, c_argv, dump_file); |
| 2581 | |||
| 2566 | /* android_emacs_init should never return. */ | 2582 | /* android_emacs_init should never return. */ |
| 2567 | emacs_abort (); | 2583 | emacs_abort (); |
| 2568 | } | 2584 | } |
| @@ -3128,9 +3144,14 @@ NATIVE_NAME (setupSystemThread) (void) | |||
| 3128 | sigdelset (&sigset, SIGSEGV); | 3144 | sigdelset (&sigset, SIGSEGV); |
| 3129 | sigdelset (&sigset, SIGBUS); | 3145 | sigdelset (&sigset, SIGBUS); |
| 3130 | 3146 | ||
| 3131 | if (pthread_sigmask (SIG_BLOCK, &sigset, NULL)) | 3147 | /* Save the signal mask that was previously used. It will be |
| 3148 | restored in `initEmacs'. */ | ||
| 3149 | |||
| 3150 | if (pthread_sigmask (SIG_BLOCK, &sigset, &startup_signal_mask)) | ||
| 3132 | __android_log_print (ANDROID_LOG_WARN, __func__, | 3151 | __android_log_print (ANDROID_LOG_WARN, __func__, |
| 3133 | "pthread_sigmask: %s", strerror (errno)); | 3152 | "pthread_sigmask: %s", strerror (errno)); |
| 3153 | else | ||
| 3154 | signal_mask_changed_p = true; | ||
| 3134 | } | 3155 | } |
| 3135 | 3156 | ||
| 3136 | #ifdef __clang__ | 3157 | #ifdef __clang__ |