Class LinkedTransferQueue.Node
- java.lang.Object
-
- org.glassfish.jersey.internal.util.collection.LinkedTransferQueue.Node
-
- Enclosing class:
- LinkedTransferQueue<E>
static final class LinkedTransferQueue.Node extends java.lang.Object
Queue nodes. Uses Object, not E, for items to allow forgetting them after use. Relies heavily on Unsafe mechanics to minimize unnecessary ordering constraints: Writes that are intrinsically ordered wrt other accesses or CASes use simple relaxed forms.
-
-
Field Summary
Fields Modifier and Type Field Description (package private) boolean
isData
(package private) java.lang.Object
item
private static long
itemOffset
(package private) LinkedTransferQueue.Node
next
private static long
nextOffset
private static long
serialVersionUID
private static sun.misc.Unsafe
UNSAFE
(package private) java.lang.Thread
waiter
private static long
waiterOffset
-
Constructor Summary
Constructors Constructor Description Node(java.lang.Object item, boolean isData)
Constructs a new node.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description (package private) boolean
cannotPrecede(boolean haveData)
Returns true if a node with the given mode cannot be appended to this node because this node is unmatched and has opposite data mode.(package private) boolean
casItem(java.lang.Object cmp, java.lang.Object val)
(package private) boolean
casNext(LinkedTransferQueue.Node cmp, LinkedTransferQueue.Node val)
(package private) void
forgetContents()
Sets item to self and waiter to null, to avoid garbage retention after matching or cancelling.(package private) void
forgetNext()
Links node to itself to avoid garbage retention.(package private) boolean
isMatched()
Returns true if this node has been matched, including the case of artificial matches due to cancellation.(package private) boolean
isUnmatchedRequest()
Returns true if this is an unmatched request node.(package private) boolean
tryMatchData()
Tries to artificially match a data node -- used by remove.
-
-
-
Field Detail
-
isData
final boolean isData
-
item
volatile java.lang.Object item
-
next
volatile LinkedTransferQueue.Node next
-
waiter
volatile java.lang.Thread waiter
-
serialVersionUID
private static final long serialVersionUID
- See Also:
- Constant Field Values
-
UNSAFE
private static final sun.misc.Unsafe UNSAFE
-
itemOffset
private static final long itemOffset
-
nextOffset
private static final long nextOffset
-
waiterOffset
private static final long waiterOffset
-
-
Method Detail
-
casNext
final boolean casNext(LinkedTransferQueue.Node cmp, LinkedTransferQueue.Node val)
-
casItem
final boolean casItem(java.lang.Object cmp, java.lang.Object val)
-
forgetNext
final void forgetNext()
Links node to itself to avoid garbage retention. Called only after CASing head field, so uses relaxed write.
-
forgetContents
final void forgetContents()
Sets item to self and waiter to null, to avoid garbage retention after matching or cancelling. Uses relaxed writes because order is already constrained in the only calling contexts: item is forgotten only after volatile/atomic mechanics that extract items. Similarly, clearing waiter follows either CAS or return from park (if ever parked; else we don't care).
-
isMatched
final boolean isMatched()
Returns true if this node has been matched, including the case of artificial matches due to cancellation.
-
isUnmatchedRequest
final boolean isUnmatchedRequest()
Returns true if this is an unmatched request node.
-
cannotPrecede
final boolean cannotPrecede(boolean haveData)
Returns true if a node with the given mode cannot be appended to this node because this node is unmatched and has opposite data mode.
-
tryMatchData
final boolean tryMatchData()
Tries to artificially match a data node -- used by remove.
-
-