< prev index next >

src/java.base/share/classes/jdk/internal/misc/InnocuousThread.java

Print this page
rev 17358 : 8182487: Add Unsafe.objectFieldOffset(Class, String)
Reviewed-by: dsimms


 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         }
< prev index next >