118 @Override
119 public void run() {
120 if (Thread.currentThread() == this && !hasRun) {
121 hasRun = true;
122 super.run();
123 }
124 }
125
126 // Use Unsafe to access Thread group and ThreadGroup parent fields
127 static {
128 try {
129 ACC = new AccessControlContext(new ProtectionDomain[] {
130 new ProtectionDomain(null, null)
131 });
132
133 // Find and use topmost ThreadGroup as parent of new group
134 UNSAFE = jdk.internal.misc.Unsafe.getUnsafe();
135 Class<?> tk = Thread.class;
136 Class<?> gk = ThreadGroup.class;
137
138 THREAD_LOCALS = UNSAFE.objectFieldOffset
139 (tk.getDeclaredField("threadLocals"));
140 INHERITABLE_THREAD_LOCALS = UNSAFE.objectFieldOffset
141 (tk.getDeclaredField("inheritableThreadLocals"));
142 INHERITEDACCESSCONTROLCONTEXT = UNSAFE.objectFieldOffset
143 (tk.getDeclaredField("inheritedAccessControlContext"));
144 CONTEXTCLASSLOADER = UNSAFE.objectFieldOffset
145 (tk.getDeclaredField("contextClassLoader"));
146
147 long tg = UNSAFE.objectFieldOffset(tk.getDeclaredField("group"));
148 long gp = UNSAFE.objectFieldOffset(gk.getDeclaredField("parent"));
149 ThreadGroup group = (ThreadGroup)
150 UNSAFE.getObject(Thread.currentThread(), tg);
151
152 while (group != null) {
153 ThreadGroup parent = (ThreadGroup)UNSAFE.getObject(group, gp);
154 if (parent == null)
155 break;
156 group = parent;
157 }
158 final ThreadGroup root = group;
159 INNOCUOUSTHREADGROUP = AccessController.doPrivileged(
160 new PrivilegedAction<ThreadGroup>() {
161 @Override
162 public ThreadGroup run() {
163 return new ThreadGroup(root, "InnocuousThreadGroup");
164 }
165 });
166 } catch (Exception e) {
167 throw new Error(e);
168 }
|
118 @Override
119 public void run() {
120 if (Thread.currentThread() == this && !hasRun) {
121 hasRun = true;
122 super.run();
123 }
124 }
125
126 // Use Unsafe to access Thread group and ThreadGroup parent fields
127 static {
128 try {
129 ACC = new AccessControlContext(new ProtectionDomain[] {
130 new ProtectionDomain(null, null)
131 });
132
133 // Find and use topmost ThreadGroup as parent of new group
134 UNSAFE = jdk.internal.misc.Unsafe.getUnsafe();
135 Class<?> tk = Thread.class;
136 Class<?> gk = ThreadGroup.class;
137
138 THREAD_LOCALS = UNSAFE.objectFieldOffset(tk, "threadLocals");
139 INHERITABLE_THREAD_LOCALS = UNSAFE.objectFieldOffset
140 (tk, "inheritableThreadLocals");
141 INHERITEDACCESSCONTROLCONTEXT = UNSAFE.objectFieldOffset
142 (tk, "inheritedAccessControlContext");
143 CONTEXTCLASSLOADER = UNSAFE.objectFieldOffset
144 (tk, "contextClassLoader");
145
146 long tg = UNSAFE.objectFieldOffset(tk, "group");
147 long gp = UNSAFE.objectFieldOffset(gk, "parent");
148 ThreadGroup group = (ThreadGroup)
149 UNSAFE.getObject(Thread.currentThread(), tg);
150
151 while (group != null) {
152 ThreadGroup parent = (ThreadGroup)UNSAFE.getObject(group, gp);
153 if (parent == null)
154 break;
155 group = parent;
156 }
157 final ThreadGroup root = group;
158 INNOCUOUSTHREADGROUP = AccessController.doPrivileged(
159 new PrivilegedAction<ThreadGroup>() {
160 @Override
161 public ThreadGroup run() {
162 return new ThreadGroup(root, "InnocuousThreadGroup");
163 }
164 });
165 } catch (Exception e) {
166 throw new Error(e);
167 }
|