[MacRuby] #1294: MacRuby crashes when loading files on the non-main thread
MacRuby
ruby-noreply at macosforge.org
Mon Jun 27 21:58:07 PDT 2011
#1294: MacRuby crashes when loading files on the non-main thread
------------------------------------+---------------------------------------
Reporter: mrada@… | Owner: lsansonetti@…
Type: defect | Status: new
Priority: blocker | Milestone:
Component: MacRuby | Keywords: reduction 0.11-blocker
------------------------------------+---------------------------------------
Comment(by lsansonetti@…):
Here is a full back trace of a crash running your snippet:
{{{
(gdb) thread apply all bt
Thread 3 (process 25683):
#0 0x00007fff8701d976 in Auto::Zone::block_start ()
#1 0x00007fff8700aca6 in auto_zone_set_write_barrier ()
#2 0x00007fff82772625 in objc_assign_strongCast_gc ()
#3 0x00007fff88fa8bcf in __CFBasicHashRehash ()
#4 0x00007fff88fb4ebd in __CFBasicHashAddValue ()
#5 0x00007fff88fbc6b8 in CFBasicHashSetValue ()
#6 0x00007fff88fbc4d7 in CFDictionarySetValue ()
#7 0x000000010015ef91 in rb_intern_uchars (chars=0x10377eb10,
chars_len=4, str=8590246688) at symbol.c:120
#8 0x000000010015f2cd in rb_intern_str (str=8590246688) at symbol.c:130
#9 0x0000000100079b04 in ruby_yyparse (parser=0x2000b0fe0) at
parse.y:7655
#10 0x000000010008d44a in yycompile0 (arg=<value temporarily unavailable,
due to optimizations>, tracing=<value temporarily unavailable, due to
optimizations>) at parse.y:5000
#11 0x00000001000ad198 in load_file (parser=8590656832, fname=0x2000af040
"/Library/Frameworks/MacRuby.framework/Versions/0.11/usr/lib/ruby/1.9.2/fileutils.rb",
script=0, opt=0x10377f6f0) at ruby.c:1118
#12 0x00000001000ad57c in rb_load_file (fname=0x2000af040
"/Library/Frameworks/MacRuby.framework/Versions/0.11/usr/lib/ruby/1.9.2/fileutils.rb")
at ruby.c:1135
#13 0x0000000100155e59 in rb_vm_load (fname_str=0x2000af040
"/Library/Frameworks/MacRuby.framework/Versions/0.11/usr/lib/ruby/1.9.2/fileutils.rb",
wrap=<value temporarily unavailable, due to optimizations>) at vm.cpp:5602
#14 0x00000001000362db in load_try (path=<value temporarily unavailable,
due to optimizations>) at load.c:246
#15 0x000000010015264a in rb_rescue2 (b_proc=<value temporarily
unavailable, due to optimizations>, data1=<value temporarily unavailable,
due to optimizations>, r_proc=0x100036230 <load_rescue>, data2=8590657088)
at vm.cpp:3648
#16 0x0000000100036a77 in rb_require_safe (fname=<value temporarily
unavailable, due to optimizations>, safe=<value temporarily unavailable,
due to optimizations>) at load.c:292
#17 0x000000010013cfd9 in rb_vm_dispatch (_vm=0x103431c90,
cache=0x102daa700, top=8590061504, self=8590061504, klass=0x20001ee00,
sel=0x100e28de0, block=0x0, opt=2 '\002', argc=<value temporarily
unavailable, due to optimizations>, argv=0x103780ab0) at
dispatcher.cpp:161
#18 0x0000000103200634 in ?? ()
#19 0x0000000103200b4d in ?? ()
#20 0x000000010013e109 in rb_vm_block_eval (b=0x103431c90, argc=<value
temporarily unavailable, due to optimizations>, argv=0x20) at
dispatcher.cpp:98
#21 0x0000000100153cf8 in rb_vm_thread_run (thread=8590081824) at
vm.cpp:4856
#22 0x00007fff824684f6 in _pthread_start ()
#23 0x00007fff824683a9 in thread_start ()
Thread 2 (process 25683):
#0 0x00007fff870165a6 in Auto::WriteBarrier::range_has_marked_cards ()
#1 0x00007fff87029944 in
Auto::MemoryScanner::scan_retained_and_old_blocks ()
#2 0x00007fff87024a47 in Auto::Collector::check_roots ()
#3 0x00007fff870298b1 in Auto::MemoryScanner::scan ()
#4 0x00007fff8701e77d in Auto::Zone::collect ()
#5 0x00007fff87007a7e in auto_collect_internal ()
#6 0x00007fff870080bd in auto_collection_work ()
#7 0x00007fff8246b284 in _dispatch_call_block_and_release ()
#8 0x00007fff82449df2 in _dispatch_queue_drain ()
#9 0x00007fff82449c54 in _dispatch_queue_invoke ()
#10 0x00007fff824497fe in _dispatch_worker_thread2 ()
#11 0x00007fff82449128 in _pthread_wqthread ()
#12 0x00007fff82448fc5 in start_wqthread ()
Thread 1 (process 25683):
#0 0x00007fff824471f0 in strlcat ()
#1 0x000000010006d1e5 in named_arg_gen (parser=0x2000b1520, id=12968,
init=1) at parse.y:8896
#2 0x000000010007d8b2 in ruby_yyparse (parser=<value temporarily
unavailable, due to optimizations>) at parse.y:3017
#3 0x000000010008d44a in yycompile0 (arg=<value temporarily unavailable,
due to optimizations>, tracing=<value temporarily unavailable, due to
optimizations>) at parse.y:5000
#4 0x00000001000ad198 in load_file (parser=8590659296, fname=0x2000afc80
"/Library/Frameworks/MacRuby.framework/Versions/0.11/usr/lib/ruby/1.9.2/fileutils.rb",
script=0, opt=0x7fff5fbfe520) at ruby.c:1118
#5 0x00000001000ad57c in rb_load_file (fname=0x2000afc80
"/Library/Frameworks/MacRuby.framework/Versions/0.11/usr/lib/ruby/1.9.2/fileutils.rb")
at ruby.c:1135
#6 0x0000000100155e59 in rb_vm_load (fname_str=0x2000afc80
"/Library/Frameworks/MacRuby.framework/Versions/0.11/usr/lib/ruby/1.9.2/fileutils.rb",
wrap=<value temporarily unavailable, due to optimizations>) at vm.cpp:5602
#7 0x00000001000362db in load_try (path=<value temporarily unavailable,
due to optimizations>) at load.c:246
#8 0x000000010015264a in rb_rescue2 (b_proc=<value temporarily
unavailable, due to optimizations>, data1=<value temporarily unavailable,
due to optimizations>, r_proc=0x100036230 <load_rescue>, data2=8590024064)
at vm.cpp:3648
#9 0x0000000100036a77 in rb_require_safe (fname=<value temporarily
unavailable, due to optimizations>, safe=<value temporarily unavailable,
due to optimizations>) at load.c:292
#10 0x000000010013cfd9 in rb_vm_dispatch (_vm=0x100e230c0,
cache=0x102000700, top=8590061504, self=8590061504, klass=0x20001ee00,
sel=0x100e28de0, block=0x0, opt=2 '\002', argc=<value temporarily
unavailable, due to optimizations>, argv=0x7fff5fbff908) at
dispatcher.cpp:161
#11 0x0000000103200634 in ?? ()
#12 0x0000000103200162 in ?? ()
#13 0x0000000100155b36 in rb_vm_run (fname=0x2000a89a0 "t.rb",
node=0x2000239a0, binding=<value temporarily unavailable, due to
optimizations>, inside_eval=<value temporarily unavailable, due to
optimizations>) at vm.cpp:4115
#14 0x000000010002dd20 in ruby_run_node (n=0x2000239a0) at eval.c:211
#15 0x00000001000e9ce8 in main (argc=2, argv=0x100e1bf50, envp=<value
temporarily unavailable, due to optimizations>) at main.cpp:40
(gdb)
}}}
It seems to call into parse.y functions concurrently, however the parser
is not thread-safe. We need to secure access to it.
--
Ticket URL: <http://www.macruby.org/trac/ticket/1294#comment:11>
MacRuby <http://macruby.org/>
More information about the macruby-tickets
mailing list