From 21f36705266934d5a351d4d7f360734540132139 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Thu, 9 Nov 2023 10:12:24 +0800 Subject: [PATCH] Guarantee files are auto-saved when Emacs is terminated by Android * java/org/gnu/emacs/EmacsNative.java (shutDownEmacs): * java/org/gnu/emacs/EmacsService.java (onDestroy): New function. When invoked, call shut_down_emacs and await its completion. * src/android.c (android_shut_down_emacs, shutDownEmacs): New functions. --- java/org/gnu/emacs/EmacsNative.java | 4 ++++ java/org/gnu/emacs/EmacsService.java | 12 ++++++++++++ src/android.c | 19 +++++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/java/org/gnu/emacs/EmacsNative.java b/java/org/gnu/emacs/EmacsNative.java index f15927bb3a7..946a38f7f84 100644 --- a/java/org/gnu/emacs/EmacsNative.java +++ b/java/org/gnu/emacs/EmacsNative.java @@ -92,6 +92,10 @@ public final class EmacsNative loadup.el itself. */ public static native void initEmacs (String argv[], String dumpFile); + /* Call shut_down_emacs to auto-save and unlock files in the main + thread, then return. */ + public static native void shutDownEmacs (); + /* Abort and generate a native core dump. */ public static native void emacsAbort (); diff --git a/java/org/gnu/emacs/EmacsService.java b/java/org/gnu/emacs/EmacsService.java index 1325cd85e9b..ab6d57b9c4f 100644 --- a/java/org/gnu/emacs/EmacsService.java +++ b/java/org/gnu/emacs/EmacsService.java @@ -321,6 +321,18 @@ public final class EmacsService extends Service } } + @Override + public void + onDestroy () + { + /* This function is called immediately before the system kills + Emacs. In this respect, it is rather akin to a SIGDANGER + signal, so force an auto-save accordingly. */ + + EmacsNative.shutDownEmacs (); + super.onDestroy (); + } + /* Functions from here on must only be called from the Emacs diff --git a/src/android.c b/src/android.c index 3397ec0e740..f5af742b422 100644 --- a/src/android.c +++ b/src/android.c @@ -1938,6 +1938,25 @@ NATIVE_NAME (quit) (JNIEnv *env, jobject object) kill (getpid (), SIGIO); } +/* Call shut_down_emacs subsequent to a call to the service's + onDestroy callback. CLOSURE is ignored. */ + +static void +android_shut_down_emacs (void *closure) +{ + __android_log_print (ANDROID_LOG_INFO, __func__, + "The Emacs service is being shut down"); + shut_down_emacs (0, Qnil); +} + +JNIEXPORT void JNICALL +NATIVE_NAME (shutDownEmacs) (JNIEnv *env, jobject object) +{ + JNI_STACK_ALIGNMENT_PROLOGUE; + + android_run_in_emacs_thread (android_shut_down_emacs, NULL); +} + JNIEXPORT jlong JNICALL NATIVE_NAME (sendConfigureNotify) (JNIEnv *env, jobject object, jshort window, jlong time, -- 2.39.2