#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@…): Following patch seems to fix the problem (for me, MBP quad-core), can someone else give it a try? {{{ diff --git a/vm.cpp b/vm.cpp index a959bf0..8480414 100644 --- a/vm.cpp +++ b/vm.cpp @@ -2464,6 +2464,8 @@ RoxorCore::copy_methods(Class from_class, Class to_class) Method *methods; unsigned int i, methods_count; + lock(); + // Copy existing Objective-C methods. methods = class_copyMethodList(from_class, &methods_count); if (methods != NULL) { @@ -2503,6 +2505,8 @@ RoxorCore::copy_methods(Class from_class, Class to_class) } } + unlock(); + // Force a resolving of these selectors on the target class. This must be // done outside the next loop since the resolver messes up the Core // structures. @@ -2512,6 +2516,8 @@ RoxorCore::copy_methods(Class from_class, Class to_class) class_getInstanceMethod(to_class, *iter); } + lock(); + // Now, let's really copy the lazy methods. std::vector<SEL> sels_to_add; for (std::vector<SEL>::iterator iter = sels_to_copy.begin(); @@ -2533,7 +2539,9 @@ RoxorCore::copy_methods(Class from_class, Class to_class) rb_vm_method_source_t *m_src = iter2->second; + unlock(); Method m = class_getInstanceMethod(to_class, sel); + lock(); if (m != NULL) { // The method already exists on the target class, we need to // JIT it. @@ -2568,6 +2576,8 @@ RoxorCore::copy_methods(Class from_class, Class to_class) method_source_sels.insert(std::make_pair(to_class, *i)); } #endif + + unlock(); } extern "C" }}} -- Ticket URL: <http://www.macruby.org/trac/ticket/1294#comment:17> MacRuby <http://macruby.org/>