]> git.eshelyaron.com Git - emacs.git/commitdiff
Add extra thread-related checking
authorPo Lu <luangruo@yahoo.com>
Sat, 27 May 2023 08:30:12 +0000 (16:30 +0800)
committerPo Lu <luangruo@yahoo.com>
Sat, 27 May 2023 08:30:12 +0000 (16:30 +0800)
* java/org/gnu/emacs/EmacsService.java (EmacsService)
(checkEmacsThread): New function.
(fillPolygon, drawRectangle, drawLine, drawPoint, copyArea)
(clearArea):
* java/org/gnu/emacs/EmacsThread.java (EmacsThread):
* java/org/gnu/emacs/EmacsView.java (EmacsView, swapBuffers):
Call where appropriate.

java/org/gnu/emacs/EmacsService.java
java/org/gnu/emacs/EmacsThread.java
java/org/gnu/emacs/EmacsView.java

index bb17d27bcf86078fd64fd8ac2e7913181af23525..d2e52ed5e62f2a563c94af59b891de49c9538392 100644 (file)
@@ -100,6 +100,10 @@ public final class EmacsService extends Service
      information.  */
   public static final boolean DEBUG_IC = false;
 
+  /* Flag that says whether or not to perform extra checks on threads
+     performing drawing calls.  */
+  private static final boolean DEBUG_THREADS = false;
+
   /* Return the directory leading to the directory in which native
      library files are stored on behalf of CONTEXT.  */
 
@@ -309,10 +313,29 @@ public final class EmacsService extends Service
     syncRunnable (runnable);
   }
 
+\f
+
+  public static void
+  checkEmacsThread ()
+  {
+    if (DEBUG_THREADS)
+      {
+       if (Thread.currentThread () instanceof EmacsThread)
+         return;
+
+       throw new RuntimeException ("Emacs thread function"
+                                   + " called from other thread!");
+      }
+  }
+
+  /* These drawing functions must only be called from the Emacs
+     thread.  */
+
   public void
   fillRectangle (EmacsDrawable drawable, EmacsGC gc,
                 int x, int y, int width, int height)
   {
+    checkEmacsThread ();
     EmacsFillRectangle.perform (drawable, gc, x, y,
                                width, height);
   }
@@ -321,6 +344,7 @@ public final class EmacsService extends Service
   fillPolygon (EmacsDrawable drawable, EmacsGC gc,
               Point points[])
   {
+    checkEmacsThread ();
     EmacsFillPolygon.perform (drawable, gc, points);
   }
 
@@ -328,6 +352,7 @@ public final class EmacsService extends Service
   drawRectangle (EmacsDrawable drawable, EmacsGC gc,
                 int x, int y, int width, int height)
   {
+    checkEmacsThread ();
     EmacsDrawRectangle.perform (drawable, gc, x, y,
                                width, height);
   }
@@ -336,6 +361,7 @@ public final class EmacsService extends Service
   drawLine (EmacsDrawable drawable, EmacsGC gc,
            int x, int y, int x2, int y2)
   {
+    checkEmacsThread ();
     EmacsDrawLine.perform (drawable, gc, x, y,
                           x2, y2);
   }
@@ -344,6 +370,7 @@ public final class EmacsService extends Service
   drawPoint (EmacsDrawable drawable, EmacsGC gc,
             int x, int y)
   {
+    checkEmacsThread ();
     EmacsDrawPoint.perform (drawable, gc, x, y);
   }
 
@@ -353,6 +380,7 @@ public final class EmacsService extends Service
            int srcX, int srcY, int width, int height, int destX,
            int destY)
   {
+    checkEmacsThread ();
     EmacsCopyArea.perform (srcDrawable, gc, dstDrawable,
                           srcX, srcY, width, height, destX,
                           destY);
@@ -361,6 +389,7 @@ public final class EmacsService extends Service
   public void
   clearWindow (EmacsWindow window)
   {
+    checkEmacsThread ();
     window.clearWindow ();
   }
 
@@ -368,6 +397,7 @@ public final class EmacsService extends Service
   clearArea (EmacsWindow window, int x, int y, int width,
             int height)
   {
+    checkEmacsThread ();
     window.clearArea (x, y, width, height);
   }
 
index 468c6530af0e9090b7d4dae89e234ec87b3737ac..1343b70bf5a8e00421809bb8ade321859b2cc2ea 100644 (file)
@@ -25,7 +25,7 @@ import java.util.Arrays;
 import android.os.Build;
 import android.util.Log;
 
-public class EmacsThread extends Thread
+public final class EmacsThread extends Thread
 {
   private static final String TAG = "EmacsThread";
 
index eb1d88ae2424e3234f8f25078be8437d4ecaaabb..09bc9d719d3bbfa281d4045af446e89f27b6656d 100644 (file)
@@ -338,6 +338,7 @@ public final class EmacsView extends ViewGroup
   public void
   damageRect (Rect damageRect)
   {
+    EmacsService.checkEmacsThread ();
     damageRegion.union (damageRect);
   }
 
@@ -351,6 +352,10 @@ public final class EmacsView extends ViewGroup
     Rect damageRect;
     Bitmap bitmap;
 
+    /* Make sure this function is called only from the Emacs
+       thread.  */
+    EmacsService.checkEmacsThread ();
+
     damageRect = null;
 
     /* Now see if there is a damage region.  */