Projects

Ticket #552 (closed defect: fixed)

Opened 2 years ago

Last modified 22 months ago

NSOperationQueue segfaults when more than one operation is being added

Reported by: mattaimonetti@… Owned by: lsansonetti@…
Priority: blocker Milestone: MacRuby 0.6
Component: MacRuby Keywords:
Cc:

Description (last modified by martinlagardette@…) (diff)

I might be doing something wrong but I can't manage to create a NSOperationQueue with more than 1 operation.

framework 'Foundation'

class MyOperation < NSOperation
  attr_reader :name
  
  def initWithName(name)
    init
    @name = name
    self
  end
  
  def main
    puts "Hello #{name}"
  end
  
end

operation_heidi = MyOperation.alloc.initWithName('Heidi')
operation_matt  = MyOperation.alloc.initWithName('Matt')

queue = NSOperationQueue.alloc.init

queue.addOperation operation_heidi
queue.addOperation operation_matt

NSRunLoop.currentRunLoop.runUntilDate(NSDate.dateWithTimeIntervalSinceNow(2.0))

stack trace:

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000008
Crashed Thread:  4  Dispatch queue: com.apple.root.default-priority

Application Specific Information:
Stack dump:
0.	Running pass 'Combine redundant instructions' on function '@10'

objc[14789]: garbage collection is ON

Thread 0:  Dispatch queue: com.apple.main-thread
0   libSystem.B.dylib             	0x00007fff864f3e3a mach_msg_trap + 10
1   libSystem.B.dylib             	0x00007fff864f44ad mach_msg + 59
2   com.apple.CoreFoundation      	0x00007fff805ce7a2 __CFRunLoopRun + 1698
3   com.apple.CoreFoundation      	0x00007fff805cdc2f CFRunLoopRunSpecific + 575
4   com.apple.Foundation          	0x00007fff84c94a24 -[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 270
5   com.apple.Foundation          	0x00007fff84ce048a -[NSRunLoop(NSRunLoop) runUntilDate:] + 78
6   ???                           	0x000000010111093c 0 + 4312860988
7   ???                           	0x0000000101110448 0 + 4312859720
8   ???                           	0x00000002000db160 0 + 8590831968
9   ???                           	0x00007fff709bd638 OBJC_CLASS_$_NSOperation + 0
10  ???                           	0x00007fff709bd610 OBJC_METACLASS_$_NSOperation + 0
11  ???                           	0x00007fff700b24a8 OBJC_CLASS_$_NSObject + 0
12  ???                           	0x00007fff700b24a8 OBJC_CLASS_$_NSObject + 0
13  ???                           	0x00007fff700b24a8 OBJC_CLASS_$_NSObject + 0
14  ???                           	0x00007fff700b24a8 OBJC_CLASS_$_NSObject + 0
[...]
510 ???                           	0x00007fff700b24a8 OBJC_CLASS_$_NSObject + 0
511 ???                           	0x00007fff700b24a8 OBJC_CLASS_$_NSObject + 0

Thread 1:  Dispatch queue: com.apple.libdispatch-manager
0   libSystem.B.dylib             	0x00007fff8650cbba kevent + 10
1   libSystem.B.dylib             	0x00007fff8650ea85 _dispatch_mgr_invoke + 154
2   libSystem.B.dylib             	0x00007fff8650e75c _dispatch_queue_invoke + 185
3   libSystem.B.dylib             	0x00007fff8650e286 _dispatch_worker_thread2 + 244
4   libSystem.B.dylib             	0x00007fff8650dbb8 _pthread_wqthread + 353
5   libSystem.B.dylib             	0x00007fff8650da55 start_wqthread + 13

Thread 2:  Dispatch queue: com.apple.root.default-priority
0   libSystem.B.dylib             	0x00007fff86543bb2 write$NOCANCEL + 10
1   libSystem.B.dylib             	0x00007fff86543ba4 __swrite + 16
2   libSystem.B.dylib             	0x00007fff86543b2d _swrite + 97
3   libSystem.B.dylib             	0x00007fff86543a72 __sflush + 70
4   libSystem.B.dylib             	0x00007fff8650075d __vfprintf + 369
5   libSystem.B.dylib             	0x00007fff865437db vfprintf_l + 111
6   libSystem.B.dylib             	0x00007fff8654375e fprintf + 196
7   libSystem.B.dylib             	0x00007fff865cfe2f __assert_rtn + 168
8   libmacruby.dylib              	0x000000010074cab8 (anonymous namespace)::InstCombiner::DoOneIteration(llvm::Function&, unsigned int) + 4488
9   libmacruby.dylib              	0x000000010074ccc3 (anonymous namespace)::InstCombiner::runOnFunction(llvm::Function&) + 163
10  libmacruby.dylib              	0x00000001008d9c3a llvm::FPPassManager::runOnFunction(llvm::Function&) + 458
11  libmacruby.dylib              	0x00000001008da254 llvm::FunctionPassManagerImpl::run(llvm::Function&) + 164
12  libmacruby.dylib              	0x00000001008da592 llvm::FunctionPassManager::run(llvm::Function&) + 82
13  libmacruby.dylib              	0x0000000100179ab8 RoxorCore::compile(llvm::Function*) + 136 (vm.cpp:486)
14  libmacruby.dylib              	0x000000010017ddd3 RoxorCore::resolve_method(objc_class*, objc_selector*, llvm::Function*, rb_vm_arity_t const&, int, objc_object* (*)(objc_object*, objc_selector*, ...), objc_method*) + 627 (vm.cpp:1843)
15  libmacruby.dylib              	0x000000010017df8b RoxorCore::resolve_methods(std::map<objc_class*, rb_vm_method_source_t*, std::less<objc_class*>, std::allocator<std::pair<objc_class* const, rb_vm_method_source_t*> > >*, objc_class*, objc_selector*) + 203 (stl_tree.h:192)
16  libmacruby.dylib              	0x0000000100184297 rb_vm_resolve_method + 391 (vm.cpp:1931)
17  libmacruby.dylib              	0x00000001001842dc resolveInstanceMethod_imp(void*, objc_selector*, objc_selector*) + 12 (vm.cpp:4681)
18  libobjc.A.dylib               	0x00007fff88212937 _class_resolveMethod + 324
19  libmacruby.dylib              	0x000000010016c88f rb_vm_dispatch + 815 (dispatcher.cpp:588)
20  ???                           	0x0000000101110651 0 + 4312860241
21  com.apple.Foundation          	0x00007fff84c82d23 ____startOperations_block_invoke_2 + 99
22  libSystem.B.dylib             	0x00007fff8652fce8 _dispatch_call_block_and_release + 15
23  libSystem.B.dylib             	0x00007fff8650e279 _dispatch_worker_thread2 + 231
24  libSystem.B.dylib             	0x00007fff8650dbb8 _pthread_wqthread + 353
25  libSystem.B.dylib             	0x00007fff8650da55 start_wqthread + 13

Thread 3:
0   libSystem.B.dylib             	0x00007fff8650d9da __workq_kernreturn + 10
1   libSystem.B.dylib             	0x00007fff8650ddec _pthread_wqthread + 917
2   libSystem.B.dylib             	0x00007fff8650da55 start_wqthread + 13

Thread 4 Crashed:  Dispatch queue: com.apple.root.default-priority
0   libmacruby.dylib              	0x000000010070af9e AddReachableCodeToWorklist(llvm::BasicBlock*, llvm::SmallPtrSet<llvm::BasicBlock*, 64u>&, (anonymous namespace)::InstCombiner&, llvm::TargetData const*) + 846
1   libmacruby.dylib              	0x000000010074ba53 (anonymous namespace)::InstCombiner::DoOneIteration(llvm::Function&, unsigned int) + 291
2   libmacruby.dylib              	0x000000010074ccc3 (anonymous namespace)::InstCombiner::runOnFunction(llvm::Function&) + 163
3   libmacruby.dylib              	0x00000001008d9c3a llvm::FPPassManager::runOnFunction(llvm::Function&) + 458
4   libmacruby.dylib              	0x00000001008da254 llvm::FunctionPassManagerImpl::run(llvm::Function&) + 164
5   libmacruby.dylib              	0x00000001008da592 llvm::FunctionPassManager::run(llvm::Function&) + 82
6   libmacruby.dylib              	0x0000000100179ab8 RoxorCore::compile(llvm::Function*) + 136 (vm.cpp:486)
7   libmacruby.dylib              	0x000000010017ddd3 RoxorCore::resolve_method(objc_class*, objc_selector*, llvm::Function*, rb_vm_arity_t const&, int, objc_object* (*)(objc_object*, objc_selector*, ...), objc_method*) + 627 (vm.cpp:1843)
8   libmacruby.dylib              	0x000000010017df8b RoxorCore::resolve_methods(std::map<objc_class*, rb_vm_method_source_t*, std::less<objc_class*>, std::allocator<std::pair<objc_class* const, rb_vm_method_source_t*> > >*, objc_class*, objc_selector*) + 203 (stl_tree.h:192)
9   libmacruby.dylib              	0x0000000100184297 rb_vm_resolve_method + 391 (vm.cpp:1931)
10  libmacruby.dylib              	0x00000001001842dc resolveInstanceMethod_imp(void*, objc_selector*, objc_selector*) + 12 (vm.cpp:4681)
11  libobjc.A.dylib               	0x00007fff88212937 _class_resolveMethod + 324
12  libmacruby.dylib              	0x000000010016c88f rb_vm_dispatch + 815 (dispatcher.cpp:588)
13  ???                           	0x0000000101110651 0 + 4312860241
14  com.apple.Foundation          	0x00007fff84c82d23 ____startOperations_block_invoke_2 + 99
15  libSystem.B.dylib             	0x00007fff8652fce8 _dispatch_call_block_and_release + 15
16  libSystem.B.dylib             	0x00007fff8650e279 _dispatch_worker_thread2 + 231
17  libSystem.B.dylib             	0x00007fff8650dbb8 _pthread_wqthread + 353
18  libSystem.B.dylib             	0x00007fff8650da55 start_wqthread + 13

Thread 4 crashed with X86 Thread State (64-bit):
  rax: 0x0000000000000000  rbx: 0x0000000102076e30  rcx: 0x0000000000000000  rdx: 0x00000001014603d8
  rdi: 0x000000010145e1e0  rsi: 0x0000000000000001  rbp: 0x000000010377fbf0  rsp: 0x000000010377f330
   r8: 0x00000001014603d8   r9: 0x0000000100f28200  r10: 0x0000000100f28200  r11: 0x000000010377fbb0
  r12: 0x00000001014603d8  r13: 0x0000000000000000  r14: 0x000000010145e1e0  r15: 0x000000010145e1e0
  rip: 0x000000010070af9e  rfl: 0x0000000000010202  cr2: 0x0000000000000008

Change History

Changed 2 years ago by mattaimonetti@…

I was able to add two operations as long as they are from 2 different subclasses:

framework 'Foundation'

class MyOperation < NSOperation
  attr_reader :name
  
  def initWithName(name)
    init
    @name = name
    self
  end
  
  def main
    puts "Hello #{name}"
  end
  
end

class OtherOperation < NSOperation
  attr_reader :name
  
  def initWithName(name)
    init
    @name = name
    self
  end
  
  def main
    puts "Hello #{name}"
  end
  
end

operation_heidi = MyOperation.alloc.initWithName('Heidi')
operation_matt  = OtherOperation.alloc.initWithName('Matt')

queue = NSOperationQueue.alloc.init
queue.addOperation operation_heidi
queue.addOperation operation_matt

# run the main loop for 2 seconds
NSRunLoop.currentRunLoop.runUntilDate(NSDate.dateWithTimeIntervalSinceNow(2.0))

Changed 2 years ago by ernest.prabhakar@…

Not directly relevant to your question, but you can also use GCD directly via the Dispatch module. The basic Queue and Group functionality should be solid in the latest top-of-tree, which I think would address your needs.

Changed 2 years ago by mattaimonetti@…

Thanks Ernie. However, I'm writing a section on some common Foundation classes and a chapter on concurrency programming with MacRuby so, even though GCD will be mentioned as the best option, I still need to cover the other existing solutions ;)

Changed 22 months ago by martinlagardette@…

  • description modified (diff)
  • milestone MacRuby 0.5 deleted

As of r3952:

$> macruby /tmp/nsop.rb 
Assertion failed: (Worklist.empty() && "Worklist must be empty to add initial group"), function AddInitialGroup, file InstructionCombining.cpp, line 110.
Abort trap
Application Specific Information:
objc[92970]: garbage collection is ON
Assertion failed: (Worklist.empty() && "Worklist must be empty to add initial group"), function AddInitialGroup, file InstructionCombining.cpp, line 110.


Thread 0:  Dispatch queue: com.apple.main-thread
0   libSystem.B.dylib             	0x00007fff876f175a mach_msg_trap + 10
1   libSystem.B.dylib             	0x00007fff876f1dcd mach_msg + 59
2   com.apple.CoreFoundation      	0x00007fff8102d452 __CFRunLoopRun + 1698
3   com.apple.CoreFoundation      	0x00007fff8102c8df CFRunLoopRunSpecific + 575
4   com.apple.Foundation          	0x00007fff8296ea38 -[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 270
5   com.apple.Foundation          	0x00007fff829ba49e -[NSRunLoop(NSRunLoop) runUntilDate:] + 78
6   ???                           	0x0000000101100a85 0 + 4312795781
7   libmacruby.dylib              	0x000000010014c560 rb_vm_dispatch + 3184 (dispatcher.cpp:449)
8   ???                           	0x0000000101100558 0 + 4312794456
9   libmacruby.dylib              	0x00000001001616cf rb_vm_run + 351 (vm.cpp:3987)
10  libmacruby.dylib              	0x0000000100045e99 ruby_run_node + 73 (eval.c:201)
11  macruby                       	0x0000000100000d28 main + 152 (main.cpp:40)
12  macruby                       	0x0000000100000c88 start + 52

Thread 1:  Dispatch queue: com.apple.libdispatch-manager
0   libSystem.B.dylib             	0x00007fff8770a4ea kevent + 10
1   libSystem.B.dylib             	0x00007fff8770c3bd _dispatch_mgr_invoke + 154
2   libSystem.B.dylib             	0x00007fff8770c094 _dispatch_queue_invoke + 185
3   libSystem.B.dylib             	0x00007fff8770bbbe _dispatch_worker_thread2 + 252
4   libSystem.B.dylib             	0x00007fff8770b4e8 _pthread_wqthread + 353
5   libSystem.B.dylib             	0x00007fff8770b385 start_wqthread + 13

Thread 2 Crashed:  Dispatch queue: com.apple.root.default-priority
0   libSystem.B.dylib             	0x00007fff8776401e __semwait_signal_nocancel + 10
1   libSystem.B.dylib             	0x00007fff87763f20 nanosleep$NOCANCEL + 129
2   libSystem.B.dylib             	0x00007fff877c0902 usleep$NOCANCEL + 57
3   libSystem.B.dylib             	0x00007fff877dfeb8 abort + 93
4   libSystem.B.dylib             	0x00007fff877ccef0 __pthread_markcancel + 0
5   libmacruby.dylib              	0x00000001006a0de4 AddReachableCodeToWorklist(llvm::BasicBlock*, llvm::SmallPtrSet<llvm::BasicBlock*, 64u>&, (anonymous namespace)::InstCombiner&, llvm::TargetData const*) + 3492
6   libmacruby.dylib              	0x00000001006e2625 (anonymous namespace)::InstCombiner::DoOneIteration(llvm::Function&, unsigned int) + 165
7   libmacruby.dylib              	0x00000001006e3883 (anonymous namespace)::InstCombiner::runOnFunction(llvm::Function&) + 179
8   libmacruby.dylib              	0x0000000100867dbb llvm::FPPassManager::runOnFunction(llvm::Function&) + 475
9   libmacruby.dylib              	0x00000001008691fb llvm::FunctionPassManagerImpl::run(llvm::Function&) + 155
10  libmacruby.dylib              	0x000000010086941e llvm::FunctionPassManager::run(llvm::Function&) + 78
11  libmacruby.dylib              	0x0000000100158c8d RoxorCore::compile(llvm::Function*) + 109 (vm.cpp:521)
12  libmacruby.dylib              	0x000000010015c92b RoxorCore::resolve_method(objc_class*, objc_selector*, llvm::Function*, rb_vm_arity_t const&, int, objc_object* (*)(objc_object*, objc_selector*, ...), objc_method*) + 603 (vm.cpp:1972)
13  libmacruby.dylib              	0x000000010015ca3b RoxorCore::resolve_methods(std::map<objc_class*, rb_vm_method_source_t*, std::less<objc_class*>, std::allocator<std::pair<objc_class* const, rb_vm_method_source_t*> > >*, objc_class*, objc_selector*) + 203 (stl_tree.h:192)
14  libmacruby.dylib              	0x00000001001609dd rb_vm_resolve_method + 205 (vm.cpp:2074)
15  libmacruby.dylib              	0x0000000100160acc resolveInstanceMethod_imp(void*, objc_selector*, objc_selector*) + 12 (vm.cpp:4925)
16  libobjc.A.dylib               	0x00007fff875ea937 _class_resolveMethod + 324
17  libmacruby.dylib              	0x000000010014bcf7 rb_vm_dispatch + 1031 (dispatcher.cpp:605)
18  ???                           	0x0000000101100765 0 + 4312794981
19  ???                           	0x0000000101100840 0 + 4312795200
20  com.apple.Foundation          	0x00007fff8295d081 -[__NSOperationInternal start] + 681
21  com.apple.Foundation          	0x00007fff8295cd37 ____startOperations_block_invoke_2 + 99
22  libSystem.B.dylib             	0x00007fff8772d610 _dispatch_call_block_and_release + 15
23  libSystem.B.dylib             	0x00007fff8770bbb1 _dispatch_worker_thread2 + 239
24  libSystem.B.dylib             	0x00007fff8770b4e8 _pthread_wqthread + 353
25  libSystem.B.dylib             	0x00007fff8770b385 start_wqthread + 13

Thread 3:  Dispatch queue: com.apple.root.default-priority
0   libmacruby.dylib              	0x000000010059a6e2 llvm::LiveVariables::HandlePhysRegDef(unsigned int, llvm::MachineInstr*, llvm::SmallVector<unsigned int, 4u>&) + 866
1   libmacruby.dylib              	0x000000010059df65 llvm::LiveVariables::runOnMachineFunction(llvm::MachineFunction&) + 3541
2   libmacruby.dylib              	0x00000001005b3e6b llvm::MachineFunctionPass::runOnFunction(llvm::Function&) + 43
3   libmacruby.dylib              	0x0000000100867dbb llvm::FPPassManager::runOnFunction(llvm::Function&) + 475
4   libmacruby.dylib              	0x00000001008691fb llvm::FunctionPassManagerImpl::run(llvm::Function&) + 155
5   libmacruby.dylib              	0x000000010086941e llvm::FunctionPassManager::run(llvm::Function&) + 78
6   libmacruby.dylib              	0x00000001005329ca llvm::JIT::runJITOnFunctionUnlocked(llvm::Function*, llvm::MutexGuard const&) + 42
7   libmacruby.dylib              	0x0000000100533e89 llvm::JIT::getPointerToFunction(llvm::Function*) + 969
8   libmacruby.dylib              	0x0000000100158c9b RoxorCore::compile(llvm::Function*) + 123 (vm.cpp:521)
9   libmacruby.dylib              	0x000000010015c92b RoxorCore::resolve_method(objc_class*, objc_selector*, llvm::Function*, rb_vm_arity_t const&, int, objc_object* (*)(objc_object*, objc_selector*, ...), objc_method*) + 603 (vm.cpp:1972)
10  libmacruby.dylib              	0x000000010015ca3b RoxorCore::resolve_methods(std::map<objc_class*, rb_vm_method_source_t*, std::less<objc_class*>, std::allocator<std::pair<objc_class* const, rb_vm_method_source_t*> > >*, objc_class*, objc_selector*) + 203 (stl_tree.h:192)
11  libmacruby.dylib              	0x00000001001609dd rb_vm_resolve_method + 205 (vm.cpp:2074)
12  libmacruby.dylib              	0x0000000100160acc resolveInstanceMethod_imp(void*, objc_selector*, objc_selector*) + 12 (vm.cpp:4925)
13  libobjc.A.dylib               	0x00007fff875ea937 _class_resolveMethod + 324
14  libmacruby.dylib              	0x000000010014bcf7 rb_vm_dispatch + 1031 (dispatcher.cpp:605)
15  ???                           	0x0000000101100765 0 + 4312794981
16  ???                           	0x0000000101100840 0 + 4312795200
17  com.apple.Foundation          	0x00007fff8295d081 -[__NSOperationInternal start] + 681
18  com.apple.Foundation          	0x00007fff8295cd37 ____startOperations_block_invoke_2 + 99
19  libSystem.B.dylib             	0x00007fff8772d610 _dispatch_call_block_and_release + 15
20  libSystem.B.dylib             	0x00007fff8770bbb1 _dispatch_worker_thread2 + 239
21  libSystem.B.dylib             	0x00007fff8770b4e8 _pthread_wqthread + 353
22  libSystem.B.dylib             	0x00007fff8770b385 start_wqthread + 13

Changed 22 months ago by lsansonetti@…

Root cause is the same as #551.

Changed 22 months ago by lsansonetti@…

  • status changed from new to closed
  • resolution set to fixed
  • milestone set to MacRuby 0.6

Should be fixed in r3958.

Note: See TracTickets for help on using tickets.