From 4b5c9326ce8f6b7856437cbbdbcccb415b38a5fc Mon Sep 17 00:00:00 2001 From: Dmitry Antipov Date: Fri, 2 Aug 2013 17:22:23 +0400 Subject: [PATCH] Fix X GC leak in GTK and raw (no toolkit) X ports. * xterm.c (x_free_frame_resources): If white and black relief GCs are allocated, always free them here. * xfns.c (x_make_gc): Omit redundant initialization. * widget.c (create_frame_gcs): Remove the leftover. (EmacsFrameDestroy): Do nothing because all GCs are now freed in x_free_frame_resources. --- src/ChangeLog | 10 ++++++++++ src/widget.c | 34 +--------------------------------- src/xfns.c | 4 ---- src/xterm.c | 13 +++++++++++++ 4 files changed, 24 insertions(+), 37 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index dedbe08d914..2a511d2fc8a 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,13 @@ +2013-08-02 Dmitry Antipov + + Fix X GC leak in GTK and raw (no toolkit) X ports. + * xterm.c (x_free_frame_resources): If white and black relief + GCs are allocated, always free them here. + * xfns.c (x_make_gc): Omit redundant initialization. + * widget.c (create_frame_gcs): Remove the leftover. + (EmacsFrameDestroy): Do nothing because all GCs are now freed + in x_free_frame_resources. + 2013-08-02 Jan Djärv * nsterm.m (windowWillResize:toSize:): Only change title if diff --git a/src/widget.c b/src/widget.c index e2c8e9fa23f..f66ec0b80ec 100644 --- a/src/widget.c +++ b/src/widget.c @@ -503,26 +503,6 @@ widget_update_wm_size_hints (Widget widget) update_wm_hints (ew); } - -#if 0 - -static void -create_frame_gcs (EmacsFrame ew) -{ - struct frame *s = ew->emacs_frame.frame; - - s->output_data.x->normal_gc - = XCreateGC (XtDisplay (ew), RootWindowOfScreen (XtScreen (ew)), 0, 0); - s->output_data.x->reverse_gc - = XCreateGC (XtDisplay (ew), RootWindowOfScreen (XtScreen (ew)), 0, 0); - s->output_data.x->cursor_gc - = XCreateGC (XtDisplay (ew), RootWindowOfScreen (XtScreen (ew)), 0, 0); - s->output_data.x->black_relief.gc = 0; - s->output_data.x->white_relief.gc = 0; -} - -#endif /* 0 */ - static char setup_frame_cursor_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -683,19 +663,7 @@ EmacsFrameRealize (Widget widget, XtValueMask *mask, XSetWindowAttributes *attrs static void EmacsFrameDestroy (Widget widget) { - EmacsFrame ew = (EmacsFrame) widget; - struct frame* s = ew->emacs_frame.frame; - - if (! s) emacs_abort (); - if (! s->output_data.x) emacs_abort (); - - block_input (); - x_free_gcs (s); - if (s->output_data.x->white_relief.gc) - XFreeGC (XtDisplay (widget), s->output_data.x->white_relief.gc); - if (s->output_data.x->black_relief.gc) - XFreeGC (XtDisplay (widget), s->output_data.x->black_relief.gc); - unblock_input (); + /* All GCs are now freed in x_free_frame_resources. */ } static void diff --git a/src/xfns.c b/src/xfns.c index 642bdabb411..afae67d6327 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -2788,10 +2788,6 @@ x_make_gc (struct frame *f) | GCFillStyle | GCLineWidth), &gc_values); - /* Reliefs. */ - f->output_data.x->white_relief.gc = 0; - f->output_data.x->black_relief.gc = 0; - /* Create the gray border tile used when the pointer is not in the frame. Since this depends on the frame's pixel values, this must be done on a per-frame basis. */ diff --git a/src/xterm.c b/src/xterm.c index 83c6dd470d0..9f296d9a82e 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -9439,6 +9439,19 @@ x_free_frame_resources (struct frame *f) unload_color (f, f->output_data.x->black_relief.pixel); x_free_gcs (f); + + /* Free extra GCs allocated by x_setup_relief_colors. */ + if (f->output_data.x->white_relief.gc) + { + XFreeGC (dpyinfo->display, f->output_data.x->white_relief.gc); + f->output_data.x->white_relief.gc = 0; + } + if (f->output_data.x->black_relief.gc) + { + XFreeGC (dpyinfo->display, f->output_data.x->black_relief.gc); + f->output_data.x->black_relief.gc = 0; + } + XFlush (FRAME_X_DISPLAY (f)); } -- 2.11.4.GIT