426 |
|
|
427 |
|
// CAS methods for fields |
428 |
|
final boolean casNext(Node cmp, Node val) { |
429 |
< |
return UNSAFE.compareAndSwapObject(this, nextOffset, cmp, val); |
429 |
> |
return U.compareAndSwapObject(this, NEXT, cmp, val); |
430 |
|
} |
431 |
|
|
432 |
|
final boolean casItem(Object cmp, Object val) { |
433 |
|
// assert cmp == null || cmp.getClass() != Node.class; |
434 |
< |
return UNSAFE.compareAndSwapObject(this, itemOffset, cmp, val); |
434 |
> |
return U.compareAndSwapObject(this, ITEM, cmp, val); |
435 |
|
} |
436 |
|
|
437 |
|
/** |
439 |
|
* only be seen after publication via casNext. |
440 |
|
*/ |
441 |
|
Node(Object item, boolean isData) { |
442 |
< |
UNSAFE.putObject(this, itemOffset, item); // relaxed write |
442 |
> |
U.putObject(this, ITEM, item); // relaxed write |
443 |
|
this.isData = isData; |
444 |
|
} |
445 |
|
|
448 |
|
* only after CASing head field, so uses relaxed write. |
449 |
|
*/ |
450 |
|
final void forgetNext() { |
451 |
< |
UNSAFE.putObject(this, nextOffset, this); |
451 |
> |
U.putObject(this, NEXT, this); |
452 |
|
} |
453 |
|
|
454 |
|
/** |
461 |
|
* else we don't care). |
462 |
|
*/ |
463 |
|
final void forgetContents() { |
464 |
< |
UNSAFE.putObject(this, itemOffset, this); |
465 |
< |
UNSAFE.putObject(this, waiterOffset, null); |
464 |
> |
U.putObject(this, ITEM, this); |
465 |
> |
U.putObject(this, WAITER, null); |
466 |
|
} |
467 |
|
|
468 |
|
/** |
508 |
|
private static final long serialVersionUID = -3375979862319811754L; |
509 |
|
|
510 |
|
// Unsafe mechanics |
511 |
< |
private static final sun.misc.Unsafe UNSAFE; |
512 |
< |
private static final long itemOffset; |
513 |
< |
private static final long nextOffset; |
514 |
< |
private static final long waiterOffset; |
511 |
> |
private static final sun.misc.Unsafe U = sun.misc.Unsafe.getUnsafe(); |
512 |
> |
private static final long ITEM; |
513 |
> |
private static final long NEXT; |
514 |
> |
private static final long WAITER; |
515 |
|
static { |
516 |
|
try { |
517 |
< |
UNSAFE = sun.misc.Unsafe.getUnsafe(); |
518 |
< |
Class<?> k = Node.class; |
519 |
< |
itemOffset = UNSAFE.objectFieldOffset |
520 |
< |
(k.getDeclaredField("item")); |
521 |
< |
nextOffset = UNSAFE.objectFieldOffset |
522 |
< |
(k.getDeclaredField("next")); |
523 |
< |
waiterOffset = UNSAFE.objectFieldOffset |
524 |
< |
(k.getDeclaredField("waiter")); |
517 |
> |
ITEM = U.objectFieldOffset |
518 |
> |
(Node.class.getDeclaredField("item")); |
519 |
> |
NEXT = U.objectFieldOffset |
520 |
> |
(Node.class.getDeclaredField("next")); |
521 |
> |
WAITER = U.objectFieldOffset |
522 |
> |
(Node.class.getDeclaredField("waiter")); |
523 |
|
} catch (ReflectiveOperationException e) { |
524 |
|
throw new Error(e); |
525 |
|
} |
537 |
|
|
538 |
|
// CAS methods for fields |
539 |
|
private boolean casTail(Node cmp, Node val) { |
540 |
< |
return UNSAFE.compareAndSwapObject(this, tailOffset, cmp, val); |
540 |
> |
return U.compareAndSwapObject(this, TAIL, cmp, val); |
541 |
|
} |
542 |
|
|
543 |
|
private boolean casHead(Node cmp, Node val) { |
544 |
< |
return UNSAFE.compareAndSwapObject(this, headOffset, cmp, val); |
544 |
> |
return U.compareAndSwapObject(this, HEAD, cmp, val); |
545 |
|
} |
546 |
|
|
547 |
|
private boolean casSweepVotes(int cmp, int val) { |
548 |
< |
return UNSAFE.compareAndSwapInt(this, sweepVotesOffset, cmp, val); |
548 |
> |
return U.compareAndSwapInt(this, SWEEPVOTES, cmp, val); |
549 |
|
} |
550 |
|
|
551 |
|
/* |
1422 |
|
|
1423 |
|
// Unsafe mechanics |
1424 |
|
|
1425 |
< |
private static final sun.misc.Unsafe UNSAFE; |
1426 |
< |
private static final long headOffset; |
1427 |
< |
private static final long tailOffset; |
1428 |
< |
private static final long sweepVotesOffset; |
1425 |
> |
private static final sun.misc.Unsafe U = sun.misc.Unsafe.getUnsafe(); |
1426 |
> |
private static final long HEAD; |
1427 |
> |
private static final long TAIL; |
1428 |
> |
private static final long SWEEPVOTES; |
1429 |
|
static { |
1430 |
|
try { |
1431 |
< |
UNSAFE = sun.misc.Unsafe.getUnsafe(); |
1432 |
< |
Class<?> k = LinkedTransferQueue.class; |
1433 |
< |
headOffset = UNSAFE.objectFieldOffset |
1434 |
< |
(k.getDeclaredField("head")); |
1435 |
< |
tailOffset = UNSAFE.objectFieldOffset |
1436 |
< |
(k.getDeclaredField("tail")); |
1439 |
< |
sweepVotesOffset = UNSAFE.objectFieldOffset |
1440 |
< |
(k.getDeclaredField("sweepVotes")); |
1431 |
> |
HEAD = U.objectFieldOffset |
1432 |
> |
(LinkedTransferQueue.class.getDeclaredField("head")); |
1433 |
> |
TAIL = U.objectFieldOffset |
1434 |
> |
(LinkedTransferQueue.class.getDeclaredField("tail")); |
1435 |
> |
SWEEPVOTES = U.objectFieldOffset |
1436 |
> |
(LinkedTransferQueue.class.getDeclaredField("sweepVotes")); |
1437 |
|
} catch (ReflectiveOperationException e) { |
1438 |
|
throw new Error(e); |
1439 |
|
} |