From 1dd73826f941d2034d763e47280e527e5c731309 Mon Sep 17 00:00:00 2001 From: Richard Grenville Date: Sat, 3 Nov 2012 10:30:32 +0800 Subject: [PATCH] Bug fix: A XserverRegion leak - Fix a XserverRegion leak introduced in b78ab316fd. I hope this is the reason of the slowdowns many users reported. Thanks to xrestop! - Cache the screen region as a variable. - Add debugging code for region allocation. --- compton.c | 19 ++++++++++++++++++- compton.h | 20 ++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/compton.c b/compton.c index b98e6a60f..235ef6ed5 100644 --- a/compton.c +++ b/compton.c @@ -69,6 +69,8 @@ Picture root_tile; XserverRegion all_damage; Bool has_name_pixmap; int root_height, root_width; +/// A region of the size of the screen. +XserverRegion screen_reg = None; /// Pregenerated alpha pictures. Picture *alpha_picts = NULL; @@ -1638,6 +1640,16 @@ win_paint_win(Display *dpy, win *w, Picture tgt_buffer) { } } +/** + * Rebuild cached screen_reg. + */ +static void +rebuild_screen_reg(Display *dpy) { + if (screen_reg) + XFixesDestroyRegion(dpy, screen_reg); + screen_reg = get_screen_region(dpy); +} + static void paint_all(Display *dpy, XserverRegion region, win *t) { #ifdef DEBUG_REPAINT @@ -1652,7 +1664,7 @@ paint_all(Display *dpy, XserverRegion region, win *t) { } else { // Remove the damaged area out of screen - XFixesIntersectRegion(dpy, region, region, get_screen_region(dpy)); + XFixesIntersectRegion(dpy, region, region, screen_reg); } #ifdef MONITOR_REPAINT @@ -2483,6 +2495,8 @@ configure_win(Display *dpy, XConfigureEvent *ce) { root_width = ce->width; root_height = ce->height; + rebuild_screen_reg(dpy); + return; } @@ -2995,6 +3009,7 @@ ev_focus_out(XFocusChangeEvent *ev) { inline static void ev_create_notify(XCreateWindowEvent *ev) { + assert(ev->parent == root); add_win(dpy, ev->window, 0, ev->override_redirect); } @@ -4520,6 +4535,8 @@ main(int argc, char **argv) { root_width = DisplayWidth(dpy, scr); root_height = DisplayHeight(dpy, scr); + rebuild_screen_reg(dpy); + root_picture = XRenderCreatePicture(dpy, root, XRenderFindVisualFormat(dpy, DefaultVisual(dpy, scr)), CPSubwindowMode, &pa); diff --git a/compton.h b/compton.h index d78e64fe1..3bed918a4 100644 --- a/compton.h +++ b/compton.h @@ -89,6 +89,26 @@ #include #endif +#ifdef DEBUG_ALLOC_REG +static inline XserverRegion +XFixesCreateRegion_(Display *dpy, XRectangle *p, int n, + const char *func, int line) { + XserverRegion reg = XFixesCreateRegion(dpy, p, n); + printf("%#010lx: XFixesCreateRegion() in %s():%d\n", reg, func, line); + return reg; +} + +static inline void +XFixesDestroyRegion_(Display *dpy, XserverRegion reg, + const char *func, int line) { + XFixesDestroyRegion(dpy, reg); + printf("%#010lx: XFixesDestroyRegion() in %s():%d\n", reg, func, line); +} + +#define XFixesCreateRegion(dpy, p, n) XFixesCreateRegion_(dpy, p, n, __func__, __LINE__) +#define XFixesDestroyRegion(dpy, reg) XFixesDestroyRegion_(dpy, reg, __func__, __LINE__) +#endif + // === Constants === #if !(COMPOSITE_MAJOR > 0 || COMPOSITE_MINOR >= 2) #error libXcomposite version unsupported