emacs-devel
[Top][All Lists]
Advanced

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

Re: Current trunk aborts with MinGW


From: Eli Zaretskii
Subject: Re: Current trunk aborts with MinGW
Date: Tue, 30 Sep 2014 16:59:02 +0300

> Date: Tue, 30 Sep 2014 10:25:49 +0200
> From: martin rudalics <address@hidden>
> 
> A MinGW build of current trunk aborts here as follows:
> 
> 
> Breakpoint 1, terminate_due_to_signal (sig=22, backtrace_limit=2147483647) at 
> emacs.c:361
> 361     signal (sig, SIG_DFL);
> (gdb) bt
> #0  terminate_due_to_signal (sig=22, backtrace_limit=2147483647) at 
> emacs.c:361
> #1  0x01173d6b in die (msg=0x14bb004 "XTYPE (a) == type && XUNTAG (a, type) 
> == ptr", file=0x14baf34 "lisp.h", line=926) at alloc.c:7111
> #2  0x010f9651 in make_lisp_ptr (ptr=0x4a7fe0c, type=Lisp_String) at 
> lisp.h:926
> #3  0x0101b2a2 in x_get_arg (dpyinfo=0x206d800, alist=..., param=..., 
> attribute=0x14de8e4 "left", class=0x14de8df "Left", type=RES_TYPE_NUMBER) at 
> frame.c:4152
> #4  0x01202cc9 in w32_createwindow (f=0x16c70b8) at w32fns.c:1987
> #5  0x01203b0e in w32_msg_pump (msg_buf=0x4a7ff54) at w32fns.c:2519
> #6  0x01204067 in address@hidden (arg=0x0) at w32fns.c:2724
> #7  0x7c80b683 in KERNEL32!GetModuleFileNameA () from 
> C:\WINDOWS\system32\kernel32.dll
> #8  0x00000000 in ?? ()
> 
> Lisp Backtrace:
> "x-create-frame" (0x82e7c8)
> "x-create-frame-with-faces" (0x82eb18)
> "make-frame" (0x82ee68)
> "frame-initialize" (0x82f1b8)
> "command-line" (0x82f53c)
> "normal-top-level" (0x82f800)
> 
> 
> Help welcome, martin

So I think we are very lucky to have this exposed before the release
of 24.4, because this reveals a fatal flaw in our code for the last 6
years: we are consing Lisp objects in a thread other than the main
(a.k.a. "Lisp") thread.  This is an absolute no-no, and can explain
any number of weird crash reports we had in the meantime, especially
from users whose Emacs usage patterns create frames a lot.

I fixed this in the emacs-24 branch (r117524).  The patch is below for
those who need this for the trunk and cannot wait for the merge.

=== modified file 'src/w32fns.c'
--- src/w32fns.c        2014-07-12 09:25:29 +0000
+++ src/w32fns.c        2014-09-30 13:53:24 +0000
@@ -1911,13 +1911,12 @@ w32_createscrollbar (struct frame *f, st
 }
 
 static void
-w32_createwindow (struct frame *f)
+w32_createwindow (struct frame *f, int *coords)
 {
   HWND hwnd;
   RECT rect;
-  Lisp_Object top = Qunbound;
-  Lisp_Object left = Qunbound;
-  struct w32_display_info *dpyinfo = &one_w32_display_info;
+  int top;
+  int left;
 
   rect.left = rect.top = 0;
   rect.right = FRAME_PIXEL_WIDTH (f);
@@ -1932,25 +1931,21 @@ w32_createwindow (struct frame *f)
 
   if (f->size_hint_flags & USPosition || f->size_hint_flags & PPosition)
     {
-      XSETINT (left, f->left_pos);
-      XSETINT (top, f->top_pos);
+      left = f->left_pos;
+      top = f->top_pos;
     }
-  else if (EQ (left, Qunbound) && EQ (top, Qunbound))
+  else
     {
-      /* When called with RES_TYPE_NUMBER, w32_get_arg will return zero
-        for anything that is not a number and is not Qunbound.  */
-      left = x_get_arg (dpyinfo, Qnil, Qleft, "left", "Left", RES_TYPE_NUMBER);
-      top = x_get_arg (dpyinfo, Qnil, Qtop, "top", "Top", RES_TYPE_NUMBER);
+      left = coords[0];
+      top = coords[1];
     }
 
   FRAME_W32_WINDOW (f) = hwnd
     = CreateWindow (EMACS_CLASS,
                    f->namebuf,
                    f->output_data.w32->dwStyle | WS_CLIPCHILDREN,
-                   EQ (left, Qunbound) ? CW_USEDEFAULT : XINT (left),
-                   EQ (top, Qunbound) ? CW_USEDEFAULT : XINT (top),
-                   rect.right - rect.left,
-                   rect.bottom - rect.top,
+                   left, top,
+                   rect.right - rect.left, rect.bottom - rect.top,
                    NULL,
                    NULL,
                    hinst,
@@ -2468,7 +2463,8 @@ w32_msg_pump (deferred_msg * msg_buf)
                  the patch for XP is not publicly available until XP SP3,
                  and older versions will never be patched.  */
               CoInitialize (NULL);
-             w32_createwindow ((struct frame *) msg.wParam);
+             w32_createwindow ((struct frame *) msg.wParam,
+                               (int *) msg.lParam);
              if (!PostThreadMessage (dwMainThreadId, WM_EMACS_DONE, 0, 0))
                emacs_abort ();
              break;
@@ -4069,8 +4065,25 @@ static void
 my_create_window (struct frame * f)
 {
   MSG msg;
+  static int coords[2];
+  Lisp_Object left, top;
+  struct w32_display_info *dpyinfo = &one_w32_display_info;
+
+  /* When called with RES_TYPE_NUMBER, x_get_arg will return zero for
+     anything that is not a number and is not Qunbound.  */
+  left = x_get_arg (dpyinfo, Qnil, Qleft, "left", "Left", RES_TYPE_NUMBER);
+  top = x_get_arg (dpyinfo, Qnil, Qtop, "top", "Top", RES_TYPE_NUMBER);
+  if (EQ (left, Qunbound))
+    coords[0] = CW_USEDEFAULT;
+  else
+    coords[0] = XINT (left);
+  if (EQ (top, Qunbound))
+    coords[1] = CW_USEDEFAULT;
+  else
+    coords[1] = XINT (top);
 
-  if (!PostThreadMessage (dwWindowsThreadId, WM_EMACS_CREATEWINDOW, (WPARAM)f, 
0))
+  if (!PostThreadMessage (dwWindowsThreadId, WM_EMACS_CREATEWINDOW,
+                         (WPARAM)f, (LPARAM)coords))
     emacs_abort ();
   GetMessage (&msg, NULL, WM_EMACS_DONE, WM_EMACS_DONE);
 }




reply via email to

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