Projects

Ticket #551 (closed defect: fixed)

Opened 2 years ago

Last modified 22 months ago

NSThread.alloc.initWithTarget segfaulting

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

Description

I can't seem to get the same stack trace twice, here is the code:

framework 'Foundation'

class ExpensiveCalculation
  def start(to_process)
    loop{ print '*' }
  end
end

calculation = ExpensiveCalculation.new
thread = NSThread.alloc.initWithTarget(calculation, selector:'start:', object:'dummy_obj')
thread.start

1.upto(10_000) do
  print '.'
end

thread.dummy
exit

Disabling the GC makes the crash even more obvious.

example of a stack trace:

Stack dump:
0.	Running pass 'Global Value Numbering' on function '@__ruby_scope3'

objc[14056]: garbage collection is ON

Thread 0:  Dispatch queue: com.apple.main-thread
0   libmacruby.dylib              	0x0000000100506bc3 llvm::RegsForValue::getCopyToRegs(llvm::SDValue, llvm::SelectionDAG&, llvm::DebugLoc, llvm::SDValue&, llvm::SDValue*) const + 355
1   libmacruby.dylib              	0x000000010050dda9 llvm::SelectionDAGLowering::CopyValueToVirtualRegister(llvm::Value*, unsigned int) + 1001
2   libmacruby.dylib              	0x00000001005103d9 llvm::SelectionDAGISel::LowerArguments(llvm::BasicBlock*) + 3625
3   libmacruby.dylib              	0x0000000100548a53 llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function&, llvm::MachineFunction&, llvm::MachineModuleInfo*, llvm::DwarfWriter*, llvm::TargetInstrInfo const&) + 3123
4   libmacruby.dylib              	0x000000010054943d llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) + 1581
5   libmacruby.dylib              	0x000000010062240b llvm::MachineFunctionPass::runOnFunction(llvm::Function&) + 91
6   libmacruby.dylib              	0x00000001008d9c3a llvm::FPPassManager::runOnFunction(llvm::Function&) + 458
7   libmacruby.dylib              	0x00000001008da254 llvm::FunctionPassManagerImpl::run(llvm::Function&) + 164
8   libmacruby.dylib              	0x00000001008da592 llvm::FunctionPassManager::run(llvm::Function&) + 82
9   libmacruby.dylib              	0x00000001005a774a llvm::JIT::runJITOnFunctionUnlocked(llvm::Function*, llvm::MutexGuard const&) + 42
10  libmacruby.dylib              	0x00000001005a8bef llvm::JIT::getPointerToFunction(llvm::Function*) + 943
11  libmacruby.dylib              	0x0000000100179ac5 RoxorCore::compile(llvm::Function*) + 149 (vm.cpp:486)
12  libmacruby.dylib              	0x0000000100162d0e rb_vm_prepare_block + 1198 (dispatcher.cpp:1725)
13  ???                           	0x00000001011102bf 0 + 4312859327
14  libmacruby.dylib              	0x0000000100040f49 ruby_run_node + 73 (eval.c:199)
15  macruby                       	0x0000000100000dd8 main + 152 (main.cpp:42)
16  macruby                       	0x0000000100000d34 start + 52

Thread 1:
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 2:  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 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:
0   libmacruby.dylib              	0x000000010070147d (anonymous namespace)::GVN::iterateOnFunction(llvm::Function&) + 3261
1   libmacruby.dylib              	0x0000000100701aac (anonymous namespace)::GVN::runOnFunction(llvm::Function&) + 300
2   libmacruby.dylib              	0x00000001008d9c3a llvm::FPPassManager::runOnFunction(llvm::Function&) + 458
3   libmacruby.dylib              	0x00000001008da254 llvm::FunctionPassManagerImpl::run(llvm::Function&) + 164
4   libmacruby.dylib              	0x00000001008da592 llvm::FunctionPassManager::run(llvm::Function&) + 82
5   libmacruby.dylib              	0x0000000100179ab8 RoxorCore::compile(llvm::Function*) + 136 (vm.cpp:486)
6   libmacruby.dylib              	0x0000000100162d0e rb_vm_prepare_block + 1198 (dispatcher.cpp:1725)
7   ???                           	0x00000001011107eb 0 + 4312860651
8   libSystem.B.dylib             	0x00007fff8652cf8e _pthread_start + 331
9   libSystem.B.dylib             	0x00007fff8652ce41 thread_start + 13

Change History

Changed 22 months ago by lsansonetti@…

Here is a better test:

framework 'Foundation'

class Foo
  def test(obj)
    loop { print '*' }
  end
end

o = Foo.new
t = NSThread.alloc.initWithTarget(o, selector: :"test:", object: 'dummy')
t.start

10000.times { print '.' }

puts "finished"

Replacing the "10000.times" loop with a simple "sleep 3" does not cause a crash anymore, so the problem is likely not related to NSThread at all.

Changed 22 months ago by lsansonetti@…

Finally it seems related. Looks like the core still thinks we are in single-threaded mode.

(gdb) p RoxorCore::shared->multithreaded
$2 = false

Changed 22 months ago by lsansonetti@…

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

Should be fixed in r3958.

Note: See TracTickets for help on using tickets.