596 |
|
} |
597 |
|
|
598 |
|
// Unsafe mechanics |
599 |
< |
private static final sun.misc.Unsafe U; |
599 |
> |
private static final sun.misc.Unsafe U = sun.misc.Unsafe.getUnsafe(); |
600 |
|
private static final long BOUND; |
601 |
|
private static final long SLOT; |
602 |
|
private static final long MATCH; |
604 |
|
private static final int ABASE; |
605 |
|
static { |
606 |
|
try { |
607 |
– |
U = sun.misc.Unsafe.getUnsafe(); |
608 |
– |
Class<?> ek = Exchanger.class; |
609 |
– |
Class<?> nk = Node.class; |
610 |
– |
Class<?> ak = Node[].class; |
611 |
– |
Class<?> tk = Thread.class; |
607 |
|
BOUND = U.objectFieldOffset |
608 |
< |
(ek.getDeclaredField("bound")); |
608 |
> |
(Exchanger.class.getDeclaredField("bound")); |
609 |
|
SLOT = U.objectFieldOffset |
610 |
< |
(ek.getDeclaredField("slot")); |
610 |
> |
(Exchanger.class.getDeclaredField("slot")); |
611 |
> |
|
612 |
|
MATCH = U.objectFieldOffset |
613 |
< |
(nk.getDeclaredField("match")); |
613 |
> |
(Node.class.getDeclaredField("match")); |
614 |
> |
|
615 |
|
BLOCKER = U.objectFieldOffset |
616 |
< |
(tk.getDeclaredField("parkBlocker")); |
617 |
< |
int scale = U.arrayIndexScale(ak); |
616 |
> |
(Thread.class.getDeclaredField("parkBlocker")); |
617 |
> |
|
618 |
> |
int scale = U.arrayIndexScale(Node[].class); |
619 |
|
if ((scale & (scale - 1)) != 0 || scale > (1 << ASHIFT)) |
620 |
|
throw new Error("Unsupported array scale"); |
621 |
|
// ABASE absorbs padding in front of element 0 |
622 |
< |
ABASE = U.arrayBaseOffset(ak) + (1 << ASHIFT); |
622 |
> |
ABASE = U.arrayBaseOffset(Node[].class) + (1 << ASHIFT); |
623 |
|
} catch (ReflectiveOperationException e) { |
624 |
|
throw new Error(e); |
625 |
|
} |