#1347: Segfault occurs when invoked a Module#define_method within some threads. ----------------------------------+----------------------------------------- Reporter: watson1978@… | Owner: lsansonetti@… Type: defect | Status: new Priority: blocker | Milestone: Component: MacRuby | Keywords: ----------------------------------+----------------------------------------- Comment(by watson1978@…): To fix this problem and #1348, it looks like it would need to exclusive control as following. {{{ #!diff diff --git a/vm.cpp b/vm.cpp index eebda6d..fb57f37 100644 --- a/vm.cpp +++ b/vm.cpp @@ -1022,6 +1022,7 @@ RoxorCore::add_method(Class klass, SEL sel, IMP imp, IMP ruby_imp, real_node->sel = sel; // Cache the implementation. + GET_CORE()->lock(); std::map<IMP, rb_vm_method_node_t *>::iterator iter2 = ruby_imps.find(imp); rb_vm_method_node_t *node; if (iter2 == ruby_imps.end()) { @@ -1033,6 +1034,7 @@ RoxorCore::add_method(Class klass, SEL sel, IMP imp, IMP ruby_imp, node = iter2->second; assert(node->objc_imp == imp); } + GET_CORE()->unlock(); node->klass = klass; node->arity = arity; node->flags = flags; @@ -3052,7 +3054,7 @@ RoxorCore::gen_to_ocval_convertor(std::string type) #endif } -static const int VM_LVAR_USES_SIZE = 8; +static const int VM_LVAR_USES_SIZE = 16; enum { VM_LVAR_USE_TYPE_BLOCK = 1, VM_LVAR_USE_TYPE_BINDING = 2 @@ -3072,6 +3074,7 @@ rb_vm_add_lvar_use(rb_vm_var_uses **var_uses, void *use, return; } + GET_CORE()->lock(); if ((*var_uses == NULL) || ((*var_uses)->uses_count == VM_LVAR_USES_SIZE)) { @@ -3087,6 +3090,7 @@ rb_vm_add_lvar_use(rb_vm_var_uses **var_uses, void *use, GC_WB(&(*var_uses)->uses[current_index], use); (*var_uses)->use_types[current_index] = use_type; ++(*var_uses)->uses_count; + GET_CORE()->unlock(); } extern "C" }}} MacRuby crashes If does not change VM_LVAR_USES_SIZE. but, I do not know yet why it needs to change :( -- Ticket URL: <http://www.macruby.org/trac/ticket/1347#comment:1> MacRuby <http://macruby.org/>