1 30 package org.jruby; 31 32 import java.util.HashMap ; 33 import java.util.Map ; 34 35 import org.jruby.runtime.Block; 36 import org.jruby.runtime.CallbackFactory; 37 import org.jruby.runtime.ObjectAllocator; 38 import org.jruby.runtime.builtin.IRubyObject; 39 40 47 public class RubyThreadGroup extends RubyObject { 48 private Map rubyThreadList = new HashMap (); 49 private boolean enclosed = false; 50 51 public static RubyClass createThreadGroupClass(Ruby runtime) { 53 RubyClass threadGroupClass = runtime.defineClass("ThreadGroup", runtime.getObject(), ObjectAllocator.NOT_ALLOCATABLE_ALLOCATOR); 54 CallbackFactory callbackFactory = runtime.callbackFactory(RubyThreadGroup.class); 55 56 threadGroupClass.defineMethod("add", callbackFactory.getMethod("add", RubyThread.class)); 57 threadGroupClass.defineMethod("enclose", callbackFactory.getMethod("enclose")); 58 threadGroupClass.defineMethod("enclosed?", callbackFactory.getMethod("isEnclosed")); 59 threadGroupClass.defineMethod("list", callbackFactory.getMethod("list")); 60 threadGroupClass.getMetaClass().defineMethod("new", callbackFactory.getSingletonMethod("newInstance")); 61 62 RubyThreadGroup defaultThreadGroup = new RubyThreadGroup(runtime, threadGroupClass); 64 threadGroupClass.defineConstant("Default", defaultThreadGroup); 65 66 return threadGroupClass; 67 } 68 69 public static IRubyObject newInstance(IRubyObject recv, Block block) { 70 return new RubyThreadGroup(recv.getRuntime(), (RubyClass)recv); 71 } 72 73 public IRubyObject add(RubyThread rubyThread, Block block) { 74 if (isFrozen()) { 75 throw getRuntime().newTypeError("can't add to frozen ThreadGroup"); 76 } 77 78 if (rubyThread.group() != getRuntime().getNil()) { 79 RubyThreadGroup threadGroup = (RubyThreadGroup)rubyThread.group(); 80 threadGroup.rubyThreadList.remove(new Integer (System.identityHashCode(rubyThread))); 81 } 82 83 rubyThread.setThreadGroup(this); 84 rubyThreadList.put(new Integer (System.identityHashCode(rubyThread)), rubyThread); 85 86 return this; 87 } 88 89 public void remove(RubyThread rubyThread) { 90 rubyThread.setThreadGroup(null); 91 rubyThreadList.remove(new Integer (System.identityHashCode(rubyThread))); 92 } 93 94 public IRubyObject enclose(Block block) { 95 enclosed = true; 96 97 return this; 98 } 99 100 public IRubyObject isEnclosed(Block block) { 101 return new RubyBoolean(getRuntime(), enclosed); 102 } 103 104 public IRubyObject list(Block block) { 105 return getRuntime().newArrayNoCopy((IRubyObject[])rubyThreadList.values().toArray(new IRubyObject[rubyThreadList.size()])); 106 } 107 108 private RubyThreadGroup(Ruby runtime, RubyClass type) { 109 super(runtime, type); 110 } 111 112 } 113 | Popular Tags |