(x_term_init): Instead of inhibiting GC while running Lisp
authorStefan Monnier <monnier@iro.umontreal.ca>
Sat, 16 Jan 2010 04:49:37 +0000 (23:49 -0500)
committerStefan Monnier <monnier@iro.umontreal.ca>
Sat, 16 Jan 2010 04:49:37 +0000 (23:49 -0500)
code, link the new kboard into all_kboard before running Lisp code,
and protect the new terminal with GCPRO (Bug#5365).
(x_term_init): Remove unused var `atom'.
(x_delete_display, x_delete_terminal): Remove unused var `i'.

src/ChangeLog
src/xterm.c

index 98489e1..9cbab2b 100644 (file)
@@ -1,3 +1,11 @@
+2010-01-16  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * xterm.c (x_term_init): Instead of inhibiting GC while running Lisp
+       code, link the new kboard into all_kboard before running Lisp code,
+       and protect the new terminal with GCPRO (Bug#5365).
+       (x_term_init): Remove unused var `atom'.
+       (x_delete_display, x_delete_terminal): Remove unused var `i'.
+
 2010-01-15  Jan Djärv  <jan.h.d@swipnet.se>
 
        * xfns.c (x_get_current_desktop, x_get_desktop_workarea): New functions.
index 72dff20..b541683 100644 (file)
@@ -9821,7 +9821,7 @@ x_wm_set_icon_pixmap (f, pixmap_id)
 {
   Pixmap icon_pixmap, icon_mask;
 
-#ifndef USE_X_TOOLKIT
+#if !defined USE_X_TOOLKIT && !defined USE_GTK
   Window window = FRAME_OUTER_WINDOW (f);
 #endif
 
@@ -10076,7 +10076,6 @@ x_term_init (display_name, xrm_option, resource_name)
     int argc;
     char *argv[NUM_ARGV];
     char **argv2 = argv;
-    GdkAtom atom;
     guint id;
 #ifndef HAVE_GTK_MULTIDISPLAY
     if (!EQ (Vinitial_window_system, Qx))
@@ -10215,25 +10214,36 @@ x_term_init (display_name, xrm_option, resource_name)
        terminal->kboard = (KBOARD *) xmalloc (sizeof (KBOARD));
        init_kboard (terminal->kboard);
        terminal->kboard->Vwindow_system = Qx;
+
+       /* Add the keyboard to the list before running Lisp code (via
+           Qvendor_specific_keysyms below), since these are not traced
+           via terminals but only through all_kboards.  */
+       terminal->kboard->next_kboard = all_kboards;
+       all_kboards = terminal->kboard;
+
        if (!EQ (XSYMBOL (Qvendor_specific_keysyms)->function, Qunbound))
          {
            char *vendor = ServerVendor (dpy);
-           /* Temporarily hide the partially initialized terminal,
-              but make sure it doesn't get garbage collected.  */
-           int count = inhibit_garbage_collection ();
+
+           /* Protect terminal from GC before removing it from the
+              list of terminals.  */
+           struct gcpro gcpro1;
+           Lisp_Object gcpro_term;
+           XSETTERMINAL (gcpro_term, terminal);
+           GCPRO1 (gcpro_term);
+
+           /* Temporarily hide the partially initialized terminal.  */
            terminal_list = terminal->next_terminal;
            UNBLOCK_INPUT;
            terminal->kboard->Vsystem_key_alist
              = call1 (Qvendor_specific_keysyms,
                       vendor ? build_string (vendor) : empty_unibyte_string);
            BLOCK_INPUT;
-           unbind_to (count, Qnil);
            terminal->next_terminal = terminal_list;
            terminal_list = terminal;
+           UNGCPRO;
          }
 
-       terminal->kboard->next_kboard = all_kboards;
-       all_kboards = terminal->kboard;
        /* Don't let the initial kboard remain current longer than necessary.
           That would cause problems if a file loaded on startup tries to
           prompt in the mini-buffer.  */
@@ -10582,7 +10592,6 @@ void
 x_delete_display (dpyinfo)
      struct x_display_info *dpyinfo;
 {
-  int i;
   struct terminal *t;
 
   /* Close all frames and delete the generic struct terminal for this
@@ -10734,7 +10743,6 @@ void
 x_delete_terminal (struct terminal *terminal)
 {
   struct x_display_info *dpyinfo = terminal->display_info.x;
-  int i;
 
   /* Protect against recursive calls.  delete_frame in
      delete_terminal calls us back when it deletes our last frame.  */