emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] trunk r113655: Fix X GC leak in GTK and raw (no toolkit) X


From: Dmitry Antipov
Subject: [Emacs-diffs] trunk r113655: Fix X GC leak in GTK and raw (no toolkit) X ports.
Date: Fri, 02 Aug 2013 13:22:54 +0000
User-agent: Bazaar (2.6b2)

------------------------------------------------------------
revno: 113655
revision-id: address@hidden
parent: address@hidden
committer: Dmitry Antipov <address@hidden>
branch nick: trunk
timestamp: Fri 2013-08-02 17:22:23 +0400
message:
  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.
modified:
  src/ChangeLog                  changelog-20091113204419-o5vbwnq5f7feedwu-1438
  src/widget.c                   widget.c-20091113204419-o5vbwnq5f7feedwu-676
  src/xfns.c                     xfns.c-20091113204419-o5vbwnq5f7feedwu-274
  src/xterm.c                    xterm.c-20091113204419-o5vbwnq5f7feedwu-244
=== modified file 'src/ChangeLog'
--- a/src/ChangeLog     2013-08-02 09:42:23 +0000
+++ b/src/ChangeLog     2013-08-02 13:22:23 +0000
@@ -1,3 +1,13 @@
+2013-08-02  Dmitry Antipov  <address@hidden>
+
+       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  <address@hidden>
 
        * nsterm.m (windowWillResize:toSize:): Only change title if

=== modified file 'src/widget.c'
--- a/src/widget.c      2013-06-30 16:14:22 +0000
+++ b/src/widget.c      2013-08-02 13:22:23 +0000
@@ -503,26 +503,6 @@
   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 @@
 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

=== modified file 'src/xfns.c'
--- a/src/xfns.c        2013-08-02 03:55:24 +0000
+++ b/src/xfns.c        2013-08-02 13:22:23 +0000
@@ -2788,10 +2788,6 @@
                  | 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.  */

=== modified file 'src/xterm.c'
--- a/src/xterm.c       2013-08-01 07:33:58 +0000
+++ b/src/xterm.c       2013-08-02 13:22:23 +0000
@@ -9439,6 +9439,19 @@
        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));
     }
 


reply via email to

[Prev in Thread] Current Thread [Next in Thread]