aboutsummaryrefslogtreecommitdiffstats
path: root/src/android.c
diff options
context:
space:
mode:
authorPo Lu2023-06-17 12:07:40 +0800
committerPo Lu2023-06-17 12:07:40 +0800
commit797c30b7abc165d5ebe65474c7398ccad0e3023c (patch)
tree86598bd005f85684a8ff67dc5c67cce9548fcc1f /src/android.c
parentfa821ed18639aa1b0275c2938af9987c0c71b581 (diff)
downloademacs-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.c23
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. */
267static bool signal_mask_changed_p;
268
269/* The signal mask at the time Emacs was started. */
270static 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__