emacs-devel
[Top][All Lists]
Advanced

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

signal handling bogosities


From: Miles Bader
Subject: signal handling bogosities
Date: 19 Dec 2002 19:15:46 +0900

I've got another core dump from my face-realization-filter code
(see attached backtrace), and seeing it raises some more fundamental
questions about the redisplay code.

Basically the problem seem to be that it's evaluating lisp code in a
place where it shouldn't, though I'm not sure I understand all the rules
for exactly where is OK and where is not.

The point of failure is this, in `Feval' (eval.c, line 1983):

  if (handling_signal)
    abort ();

it _is_ in a signal handler, specifically:

   #16 0x080dc6f2 in input_available_signal (signo=29)
       at /usr/local/src/emacs/src/keyboard.c:6633

That signal results in `note_mouse_movement', and then
`note_mouse_highlight' being called:

   #11 0x080b2345 in note_mouse_highlight (f=0x850aa18, x=184, y=260)
       at /usr/local/src/emacs/src/xterm.c:7407
   #12 0x080b162e in note_mouse_movement (frame=0x850aa18, event=0xbffd1064)
       at /usr/local/src/emacs/src/xterm.c:6893
   #13 0x080b5f05 in handle_one_xevent (dpyinfo=0x84f5490, eventp=0xbffd13ac, 
       bufp_r=0xbffd1418, numcharsp=0xbffd141c, finish=0xbffd13a8)
       at /usr/local/src/emacs/src/xterm.c:11291

note_mouse_highlight then tries to figure out the proper mouse-face-id,
which calls face realization, and if realize-face-filter-functions has
a non-nil value, calls the lisp interpreter, and thus dies as seen.

Now, I suppose that calling the lisp interpreter inside a signal handler
might be a bad thing, and so perhaps the check in Feval is reasonable
(though the byte-code evaluator _doesn't_ seem to check; perhaps if I
compiled my code, it would work :-).

What concerns me is that even without that, it seems to be doing an
absurd amount of stuff inside the the signal handler, to the extent that
it seems very hard to be sure _what_ code will end being called.  After
it does the face lookup that killed me, it seems to go and actually
display the mouse face, and in other branches of the code the whole
redisplay engine seems to be invoked, for exposure events (I don't know
whether that can result in lisp code being called, but it seems as if it
could -- given the complexity of redisplay, it's kind of hard to tell).

So what do people think?  The whole thing seems really broken to me, but
I don't have a complete grasp of the code.  How hard would be to
restructure things to just queue this stuff for an event-loop outside
the signal handler to handle?

Thanks,

-Miles



Here's the full backtrace:


#0  0x402eac51 in kill () from /lib/libc.so.6
#1  0x080d377a in abort () at /usr/local/src/emacs/src/emacs.c:412
#2  0x0812b44a in Feval (form=1481199500)
    at /usr/local/src/emacs/src/eval.c:1984
#3  0x081292b2 in Fprogn (args=1481198692)
    at /usr/local/src/emacs/src/eval.c:424
#4  0x0812c586 in funcall_lambda (fun=1481198684, nargs=1, 
    arg_vector=0xbffd0b08) at /usr/local/src/emacs/src/eval.c:2921
#5  0x0812c1b1 in Ffuncall (nargs=2, args=0xbffd0b04)
    at /usr/local/src/emacs/src/eval.c:2798
#6  0x0812a880 in internal_condition_case_2 (bfun=0x812bebc <Ffuncall>, 
    nargs=2, args=0xbffd0b04, handlers=405463828, 
    hfun=0x805cd10 <safe_eval_handler>) at /usr/local/src/emacs/src/eval.c:1435
#7  0x0805ce03 in safe_call (nargs=2, args=0xbffd0b04)
    at /usr/local/src/emacs/src/xdisp.c:1400
#8  0x0805ce38 in safe_call1 (fn=408560044, arg=1220621664)
    at /usr/local/src/emacs/src/xdisp.c:1420
#9  0x080a2a9e in realize_face (cache=0x850f090, attrs=0xbffd0c68, c=0, 
    base_face=0x0, former_face_id=-1) at /usr/local/src/emacs/src/xfaces.c:6723
#10 0x080a3b95 in face_at_buffer_position (w=0x8cf3e78, pos=1983, 
    region_beg=0, region_end=0, endptr=0xbffd0d6c, limit=1984, mouse=1)
    at /usr/local/src/emacs/src/xfaces.c:5648
#11 0x080b2345 in note_mouse_highlight (f=0x850aa18, x=184, y=260)
    at /usr/local/src/emacs/src/xterm.c:7407
#12 0x080b162e in note_mouse_movement (frame=0x850aa18, event=0xbffd1064)
    at /usr/local/src/emacs/src/xterm.c:6893
#13 0x080b5f05 in handle_one_xevent (dpyinfo=0x84f5490, eventp=0xbffd13ac, 
    bufp_r=0xbffd1418, numcharsp=0xbffd141c, finish=0xbffd13a8)
    at /usr/local/src/emacs/src/xterm.c:11291
#14 0x080b654d in XTread_socket (sd=0, bufp=0xbffd244c, numchars=4096, 
    expected=1) at /usr/local/src/emacs/src/xterm.c:11719
#15 0x080dc531 in read_avail_input (expected=1)
    at /usr/local/src/emacs/src/keyboard.c:6470
#16 0x080dc6f2 in input_available_signal (signo=29)
    at /usr/local/src/emacs/src/keyboard.c:6633
#17 0x402eabd8 in sigaction () from /lib/libc.so.6
#18 0x08057271 in sit_for (sec=30, usec=0, reading=1, display=1, 
    initial_display=0) at /usr/local/src/emacs/src/dispnew.c:6247
#19 0x080d8305 in read_char (commandflag=1, nmaps=2, maps=0xbfffeb60, 
    prev_event=405463780, used_mouse_menu=0xbfffebac)
    at /usr/local/src/emacs/src/keyboard.c:2635
#20 0x080de7a0 in read_key_sequence (keybuf=0xbfffecb0, bufsize=30, 
    prompt=405463780, dont_downcase_last=0, can_return_switch_frame=1, 
    fix_current_buffer=1) at /usr/local/src/emacs/src/keyboard.c:8398
#21 0x080d63f8 in command_loop_1 () at /usr/local/src/emacs/src/keyboard.c:1478
#22 0x0812a689 in internal_condition_case (bfun=0x80d60f0 <command_loop_1>, 
    handlers=405560436, hfun=0x80d5d04 <cmd_error>)
    at /usr/local/src/emacs/src/eval.c:1352
#23 0x080d5fc8 in command_loop_2 () at /usr/local/src/emacs/src/keyboard.c:1279
#24 0x0812a21d in internal_catch (tag=405521716, 
    func=0x80d5fa4 <command_loop_2>, arg=405463780)
    at /usr/local/src/emacs/src/eval.c:1112
#25 0x080d5f73 in command_loop () at /usr/local/src/emacs/src/keyboard.c:1258
#26 0x080d5ac0 in recursive_edit_1 ()
    at /usr/local/src/emacs/src/keyboard.c:974
#27 0x080d5bf0 in Frecursive_edit ()
    at /usr/local/src/emacs/src/keyboard.c:1030
#28 0x080d4a83 in main (argc=3, argv=0xbffff274)
    at /usr/local/src/emacs/src/emacs.c:1659

-- 
Yo mama's so fat when she gets on an elevator it HAS to go down.



reply via email to

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