changeset 28354:d6ae8188fa58

(register_color, unregister_colors, unregister_colors) [DEBUG_X_COLORS]: New functions. (x_free_colors) [DEBUG_X_COLORS]: Unregister colors.
author Gerd Moellmann <gerd@gnu.org>
date Mon, 27 Mar 2000 14:47:42 +0000
parents 5246aef1c8e1
children 11d7a6fdad5f
files src/xfaces.c
diffstat 1 files changed, 66 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/xfaces.c	Mon Mar 27 14:46:48 2000 +0000
+++ b/src/xfaces.c	Mon Mar 27 14:47:42 2000 +0000
@@ -527,6 +527,60 @@
 
 #ifdef HAVE_X_WINDOWS
 
+#ifdef DEBUG_X_COLORS
+
+/* The following is a poor mans infrastructure for debugging X color
+   allocation problems on displays with PseudoColor-8.  Some X servers
+   like 3.3.5 XF86_SVGA with Matrox cards apparently don't implement
+   color reference counts completely so that they don't signal an
+   error when a color is freed whose reference count is already 0.
+   Other X servers do.  To help me debug this, the following code
+   implements a simple reference counting schema of its own, for a
+   single display/screen.  --gerd.  */
+
+/* Reference counts for pixel colors.  */
+
+int color_count[256];
+
+/* Register color PIXEL as allocated.  */
+
+void
+register_color (pixel)
+     unsigned long pixel;
+{
+  xassert (pixel < 256);
+  ++color_count[pixel];
+}
+
+
+/* Register color PIXEL as deallocated.  */
+
+void
+unregister_color (pixel)
+     unsigned long pixel;
+{
+  xassert (pixel < 256);
+  if (color_count[pixel] > 0)
+    --color_count[pixel];
+  else
+    abort ();
+}
+
+
+/* Register N colors from PIXELS as deallocated.  */
+
+void
+unregister_colors (pixels, n)
+     unsigned long *pixels;
+     int n;
+{
+  int i;
+  for (i = 0; i < n; ++i)
+    unregister_color (pixels[i]);
+}
+
+#endif /* DEBUG_X_COLORS */
+
 /* Free colors used on frame F.  PIXELS is an array of NPIXELS pixel
    color values.  Interrupt input must be blocked when this function
    is called.  */
@@ -564,10 +618,20 @@
 	      px[j++] = pixels[i];
 
 	  if (j)
-	    XFreeColors (dpy, cmap, px, j, 0);
+	    {
+	      XFreeColors (dpy, cmap, px, j, 0);
+#ifdef DEBUG_X_COLORS
+	      unregister_colors (px, j);
+#endif
+	    }
 	}
       else
-	XFreeColors (dpy, cmap, pixels, npixels, 0);
+	{
+	  XFreeColors (dpy, cmap, pixels, npixels, 0);
+#ifdef DEBUG_X_COLORS
+	  unregister_colors (pixels, npixels);
+#endif
+	}
     }
 }