956 |
|
U.putObjectRelease(thread, INHERITEDACCESSCONTROLCONTEXT, acc); |
957 |
|
} |
958 |
|
|
959 |
– |
/** |
960 |
– |
* Returns a new group with the system ThreadGroup (the |
961 |
– |
* topmost, parent-less group) as parent. Uses Unsafe to |
962 |
– |
* traverse Thread.group and ThreadGroup.parent fields. |
963 |
– |
*/ |
964 |
– |
static final ThreadGroup createThreadGroup(String name) { |
965 |
– |
if (name == null) |
966 |
– |
throw new NullPointerException(); |
967 |
– |
try { |
968 |
– |
long tg = U.objectFieldOffset |
969 |
– |
(Thread.class.getDeclaredField("group")); |
970 |
– |
long gp = U.objectFieldOffset |
971 |
– |
(ThreadGroup.class.getDeclaredField("parent")); |
972 |
– |
ThreadGroup group = (ThreadGroup) |
973 |
– |
U.getObject(Thread.currentThread(), tg); |
974 |
– |
while (group != null) { |
975 |
– |
ThreadGroup parent = (ThreadGroup)U.getObject(group, gp); |
976 |
– |
if (parent == null) |
977 |
– |
return new ThreadGroup(group, name); |
978 |
– |
group = parent; |
979 |
– |
} |
980 |
– |
} catch (ReflectiveOperationException e) { |
981 |
– |
throw new Error(e); |
982 |
– |
} |
983 |
– |
// fall through if null as cannot-happen safeguard |
984 |
– |
throw new Error("Cannot create ThreadGroup"); |
985 |
– |
} |
986 |
– |
|
959 |
|
// Serialization support |
960 |
|
|
961 |
|
private static final long serialVersionUID = -5851777807851030925L; |