[MacRuby] #1346: Segfault occurs when invoked a Module#attr within some threads.

MacRuby ruby-noreply at macosforge.org
Tue Jul 5 18:27:00 PDT 2011


#1346: Segfault occurs when invoked a Module#attr within some threads.
----------------------------------+-----------------------------------------
 Reporter:  watson1978@…          |       Owner:  lsansonetti@…        
     Type:  defect                |      Status:  new                  
 Priority:  blocker               |   Milestone:                       
Component:  MacRuby               |    Keywords:                       
----------------------------------+-----------------------------------------

Comment(by watson1978@…):

 To fix this issue and #1347, at least, it looks like it needs the
 exclusive control for JIT compile.

 {{{
 #!diff
 diff --git a/vm.cpp b/vm.cpp
 index abdf61b..947fb83 100644
 --- a/vm.cpp
 +++ b/vm.cpp
 @@ -2630,14 +2630,18 @@ rb_vm_define_attr(Class klass, const char *name,
 bool read, bool write)
      ID iname = rb_intern(buf);

      if (read) {
 +       GET_CORE()->lock();
         Function *f = RoxorCompiler::shared->compile_read_attr(iname);
 +       GET_CORE()->unlock();
         SEL sel = sel_registerName(name);
         rb_vm_prepare_method(klass, false, sel, f, rb_vm_arity(0),
                 VM_METHOD_FBODY);
      }

      if (write) {
 +       GET_CORE()->unlock();
         Function *f = RoxorCompiler::shared->compile_write_attr(iname);
 +       GET_CORE()->unlock();
         snprintf(buf, sizeof buf, "%s=:", name);
         SEL sel = sel_registerName(buf);
         rb_vm_prepare_method(klass, false, sel, f, rb_vm_arity(1),
 @@ -2734,8 +2738,10 @@ rb_vm_define_method3(Class klass, ID mid,
 rb_vm_block_t *block)
      const int arity = rb_vm_arity_n(block->arity);
      SEL sel = rb_vm_id_to_sel(mid, arity);

 +    GET_CORE()->lock();
      Function *func = RoxorCompiler::shared->compile_block_caller(block);
      IMP imp = GET_CORE()->compile(func);
 +    GET_CORE()->unlock();
      NODE *body = rb_vm_cfunc_node_from_imp(klass, arity < -1 ? -2 :
 arity, imp, 0);
      GC_RETAIN(body);
      GC_RETAIN(block);
 }}}

-- 
Ticket URL: <http://www.macruby.org/trac/ticket/1346#comment:1>
MacRuby <http://macruby.org/>



More information about the macruby-tickets mailing list