Subject: Re: bug#3090: 23.0.92.3; hang involving XftGlyphExtents after moving cursor

From: Daniel Clemente <[email-masked]>
Date: Thu, 14 May 2009 14:03:35 +0200

El dj, abr 23 2009, Daniel Clemente va escriure:
> This is a hang I had with the code from 20.m4.2009, which I could not reproduce anymore. 

  Today it happened again with a newer Emacs, showing the same effects:

XftCharIndex(0xcd8b200, 0xcac8b80, 32, 786432, 8)                              = 411
XftGlyphExtents(0xcd8b200, 0xcac8b80, 0xbf9fe14c, 1, 0xbf9fdfa8)               = 0
memmove(0xbf9fdfa8, 0xfa68e18, 72, 0xbf9fdffc, 0xbf9fe000)                     = 0xbf9fdfa8
memmove(0xbf9fde08, 0xf3cc098, 72, 12, 0xbf9fde08)                             = 0xbf9fde08
__ctype_tolower_loc()                                                          = 0xb70c6b14
__ctype_tolower_loc()                                                          = 0xb70c6b14
__ctype_tolower_loc()                                                          = 0xb70c6b14
__ctype_tolower_loc()                                                          = 0xb70c6b14
XftCharIndex(0xcd8b200, 0xcac8b80, 106, 0xfe02c34, 1216)                       = 323
XftGlyphExtents(0xcd8b200, 0xcac8b80, 0xbf9fe14c, 1, 0xbf9fdfa8)               = 0
XftCharIndex(0xcd8b200, 0xcac8b80, 112, 786432, 8)                             = 319
XftGlyphExtents(0xcd8b200, 0xcac8b80, 0xbf9fe14c, 1, 0xbf9fdfa8)               = 0
XftCharIndex(0xcd8b200, 0xcac8b80, 97, 786432, 8)                              = 673
XftGlyphExtents(0xcd8b200, 0xcac8b80, 0xbf9fe14c, 1, 0xbf9fdfa8)               = 0
XftCharIndex(0xcd8b200, 0xcac8b80, 95, 786432, 8)                              = 662
XftGlyphExtents(0xcd8b200, 0xcac8b80, 0xbf9fe14c, 1, 0xbf9fdfa8)               = 0
XftCharIndex(0xcd8b200, 0xcac8b80, 121, 786432, 8)                             = 325
XftGlyphExtents(0xcd8b200, 0xcac8b80, 0xbf9fe14c, 1, 0xbf9fdfa8)               = 0
XftCharIndex(0xcd8b200, 0xcac8b80, 95, 786432, 8)                              = 662
XftGlyphExtents(0xcd8b200, 0xcac8b80, 0xbf9fe14c, 1, 0xbf9fdfa8)               = 0
XftCharIndex(0xcd8b200, 0xcac8b80, 99, 786432, 8)                              = 682
XftGlyphExtents(0xcd8b200, 0xcac8b80, 0xbf9fe14c, 1, 0xbf9fdfa8)               = 0
strlen("font for")                                                             = 8
memmove(0x10931b5c, 0x823e60f, 8, 0xbf9fe0b4, 9712)                            = 0x10931b5c
XftCharExists(0xcd8b200, 0xd338dc8, 237, 0xce8c450, 0xff33570)                 = 1
XftCharIndex(0xcd8b200, 0xd338dc8, 237, 0x8225671, 0xf165965)                  = 432
XftGlyphExtents(0xcd8b200, 0xd338dc8, 0xbf9fe14c, 1, 0xbf9fdfa8)               = 0
XftCharIndex(0xcd8b200, 0xcac8b80, 97, 786432, 8)                              = 673
XftGlyphExtents(0xcd8b200, 0xcac8b80, 0xbf9fe14c, 1, 0xbf9fdfa8)               = 0
XftCharIndex(0xcd8b200, 0xcac8b80, 32, 0xfe02b8c, 1228)                        = 411

  Notice the "font for" string; that may be meaningful.

  After waiting around 3 minutes, I saw a round of fast free() calls for a while:

free(0x10f5e230)                                                               = <void>
free(0x10f5e330)                                                               = <void>
free(0x10f5e1d0)                                                               = <void>
free(0x10f5e210)                                                               = <void>
free(0x10f5e170)                                                               = <void>
free(0x10f5e270)                                                               = <void>

…

  Then it started again, and so on:

XftGlyphExtents(0xcd8b200, 0xcaf00c8, 0xbf9fc54c, 1, 0xbf9fc3a8)               = 0
XftCharIndex(0xcd8b200, 0xcaf00c8, 102, 786432, 8)                             = 314
XftGlyphExtents(0xcd8b200, 0xcaf00c8, 0xbf9fc54c, 1, 0xbf9fc3a8)               = 0
XftCharIndex(0xcd8b200, 0xcaf00c8, 101, 786432, 8)                             = 313
XftGlyphExtents(0xcd8b200, 0xcaf00c8, 0xbf9fc54c, 1, 0xbf9fc3a8)               = 0
XftCharIndex(0xcd8b200, 0xcaf00c8, 114, 786432, 8)                             = 326
…

  The backtrace showed the first time:

(gdb) bt
#0  0x0821e32e in find_interval ()
#1  0x08224402 in Fnext_single_property_change ()
#2  0x0822a467 in composition_compute_stop_pos ()
#3  0x08073928 in compute_stop_pos ()
#4  0x00000187 in ?? ()
#5  0xffffffff in ?? ()
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
Current language:  auto; currently asm
(gdb) 

  And after continuing and stopping again:

#0  0x081d11cc in assq_no_quit ()
#1  0x080f0908 in get_lface_attributes ()
#2  0x080f0b73 in merge_face_ref ()
#3  0x080f70ff in face_at_buffer_position ()
#4  0x0807353a in handle_face_prop ()
#5  0x0807aecd in handle_stop ()
#6  0x0807e0ef in next_element_from_buffer ()
#7  0x0807d055 in get_next_display_element ()
#8  0x0807e412 in move_it_in_display_line_to ()
#9  0x0807fd30 in move_it_to ()
#10 0x08088ab0 in try_scrolling ()
#11 0x0809676e in redisplay_window ()
#12 0x080976d3 in redisplay_window_0 ()
#13 0x081cac76 in internal_condition_case_1 ()
#14 0x08074fdb in redisplay_windows ()
#15 0x0808da75 in redisplay_internal ()
#16 0x0808e6f2 in redisplay_preserve_echo_area ()
#17 0x08057759 in sit_for ()
#18 0x0815b8b8 in command_loop_1 ()
#19 0x081caeb0 in internal_condition_case ()
#20 0x0814fd65 in command_loop_2 ()
#21 0x081caf8a in internal_catch ()
#22 0x08152481 in recursive_edit_1 ()
#23 0x08182095 in read_minibuf ()
#24 0x081cdb22 in Feval ()
#25 0x081cde8f in Fprogn ()
#26 0x081cc0b5 in funcall_lambda ()
#27 0x081cdf4b in apply_lambda ()
#28 0x081cd8cf in Feval ()
#29 0x081cdd40 in Fsetq ()
#30 0x081cdc9b in Feval ()
#31 0x081cedef in Flet ()
#32 0x081cdc9b in Feval ()
#33 0x081cde8f in Fprogn ()
#34 0x081cc0b5 in funcall_lambda ()
#35 0x081cdf4b in apply_lambda ()
#36 0x081cd8cf in Feval ()
#37 0x081cde8f in Fprogn ()
#38 0x081caf8a in internal_catch ()
#39 0x081cdcfd in Fcatch ()
#40 0x081cdc9b in Feval ()
#41 0x081cdd40 in Fsetq ()
#42 0x081cdc9b in Feval ()
#43 0x081cedef in Flet ()
#44 0x081cdc9b in Feval ()
#45 0x081ce83d in Fcond ()
#46 0x081cdc9b in Feval ()
#47 0x081ceb77 in FletX ()
#48 0x081cdc9b in Feval ()
#49 0x081cde8f in Fprogn ()
#50 0x081cc0b5 in funcall_lambda ()
#51 0x081cdf4b in apply_lambda ()
#52 0x081cd8cf in Feval ()
#53 0x081cdd40 in Fsetq ()
#54 0x081cdc9b in Feval ()
#55 0x081cedef in Flet ()
#56 0x081cdc9b in Feval ()
#57 0x081c827a in Fcall_interactively ()
#58 0x081cc626 in Ffuncall ()
#59 0x081cc7b9 in call3 ()
#60 0x0815b314 in command_loop_1 ()
#61 0x081caeb0 in internal_condition_case ()
#62 0x0814fd65 in command_loop_2 ()
#63 0x081caf8a in internal_catch ()
#64 0x0815250f in recursive_edit_1 ()
#65 0x08152624 in Frecursive_edit ()
#66 0x081488c7 in main ()

  My Emacs was this time:
GNU Emacs 23.0.92.6 (i686-pc-linux-gnu, GTK+ Version 2.16.0) of 2009-04-27
  The ./configure I had used is:
CFLAGS="-O3 -w" ./configure --prefix=/opt/dc
  It ran under --daemon.

-- Daniel