Mercurial > emacs
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 + } } }