]> git.eshelyaron.com Git - emacs.git/commitdiff
Clear image caches in reaction to system VM warnings
authorPo Lu <luangruo@yahoo.com>
Fri, 10 Nov 2023 06:57:24 +0000 (14:57 +0800)
committerPo Lu <luangruo@yahoo.com>
Fri, 10 Nov 2023 06:58:16 +0000 (14:58 +0800)
* java/org/gnu/emacs/EmacsNative.java (onLowMemory):

* java/org/gnu/emacs/EmacsService.java (onLowMemory): New
function.

* src/android.c (android_on_low_memory, onLowMemory): New
functions called when a VM caution is registered.  Clear
the image cache and run garbage collection.

java/org/gnu/emacs/EmacsNative.java
java/org/gnu/emacs/EmacsService.java
src/android.c

index 946a38f7f847f602ddb1276c548ff62098ef21be..78176dd0e473350c226e057cb7f8da7d59d070a0 100644 (file)
@@ -96,6 +96,9 @@ public final class EmacsNative
      thread, then return.  */
   public static native void shutDownEmacs ();
 
+  /* Garbage collect and clear each frame's image cache.  */
+  public static native void onLowMemory ();
+
   /* Abort and generate a native core dump.  */
   public static native void emacsAbort ();
 
index ab6d57b9c4f35f07cc7b0452f4877e343c0091df..1aac1a6c4dd3dc191014c870afc781beb82a4522 100644 (file)
@@ -321,6 +321,10 @@ public final class EmacsService extends Service
       }
   }
 
+  /* The native functions the subsequent two functions call do nothing
+     in the infrequent case the Emacs thread is awaiting a response
+     for the main thread.  Caveat emptor! */
+
   @Override
   public void
   onDestroy ()
@@ -333,6 +337,14 @@ public final class EmacsService extends Service
     super.onDestroy ();
   }
 
+  @Override
+  public void
+  onLowMemory ()
+  {
+    EmacsNative.onLowMemory ();
+    super.onLowMemory ();
+  }
+
 \f
 
   /* Functions from here on must only be called from the Emacs
index f5af742b4224235b32e943ca991e6edf4b1a93b8..7a670cb507f4c41bfeb835ffd6aba336007340e0 100644 (file)
@@ -1957,6 +1957,26 @@ NATIVE_NAME (shutDownEmacs) (JNIEnv *env, jobject object)
   android_run_in_emacs_thread (android_shut_down_emacs, NULL);
 }
 
+/* Carry out garbage collection and clear all image caches on the
+   Android terminal.  Called when the system has depleted most of its
+   memory and desires that background processes release unused
+   core.  */
+
+static void
+android_on_low_memory (void *closure)
+{
+  Fclear_image_cache (Qt, Qt);
+  garbage_collect ();
+}
+
+JNIEXPORT void JNICALL
+NATIVE_NAME (onLowMemory) (JNIEnv *env, jobject object)
+{
+  JNI_STACK_ALIGNMENT_PROLOGUE;
+
+  android_run_in_emacs_thread (android_on_low_memory, NULL);
+}
+
 JNIEXPORT jlong JNICALL
 NATIVE_NAME (sendConfigureNotify) (JNIEnv *env, jobject object,
                                   jshort window, jlong time,