1 29 package org.jruby.internal.runtime; 30 31 import org.jruby.Ruby; 32 import org.jruby.RubyProc; 33 import org.jruby.RubyThread; 34 import org.jruby.RubyThreadGroup; 35 import org.jruby.exceptions.RaiseException; 36 import org.jruby.exceptions.ThreadKill; 37 import org.jruby.runtime.Block; 38 import org.jruby.runtime.Frame; 39 import org.jruby.runtime.ThreadContext; 40 import org.jruby.runtime.builtin.IRubyObject; 41 42 public class RubyNativeThread extends Thread { 43 private Ruby runtime; 44 private Frame currentFrame; 45 private RubyProc proc; 46 private IRubyObject[] arguments; 47 private RubyThread rubyThread; 48 49 protected RubyNativeThread(RubyThread rubyThread, IRubyObject[] args, Block currentBlock) { 50 super(rubyThread.getRuntime().getThreadService().getRubyThreadGroup(), "Ruby Thread" + rubyThread.hash()); 51 this.rubyThread = rubyThread; 52 this.runtime = rubyThread.getRuntime(); 53 ThreadContext tc = runtime.getCurrentContext(); 54 55 proc = runtime.newProc(false, currentBlock); 56 currentFrame = tc.getCurrentFrame(); 57 this.arguments = args; 58 } 59 60 public RubyThread getRubyThread() { 61 return rubyThread; 62 } 63 64 public void run() { 65 runtime.getThreadService().registerNewThread(rubyThread); 66 ThreadContext context = runtime.getCurrentContext(); 67 68 context.preRunThread(currentFrame); 69 70 try { 72 rubyThread.notifyStarted(); 73 74 IRubyObject result = proc.call(arguments); 75 rubyThread.cleanTerminate(result); 76 } catch (ThreadKill tk) { 77 synchronized (rubyThread.killLock) { 79 rubyThread.killLock.notifyAll(); 80 } 81 } catch (RaiseException e) { 82 rubyThread.exceptionRaised(e); 83 } finally { 84 runtime.getThreadService().setCritical(false); 85 ((RubyThreadGroup)rubyThread.group()).remove(rubyThread); 86 } 87 } 88 } 89 | Popular Tags |