180 |
|
* read-locked. The read count is ignored when validating |
181 |
|
* "optimistic" seqlock-reader-style stamps. Because we must use |
182 |
|
* a small finite number of bits (currently 7) for readers, a |
183 |
< |
* supplementary reader overflow word is used when then number of |
183 |
> |
* supplementary reader overflow word is used when the number of |
184 |
|
* readers exceeds the count field. We do this by treating the max |
185 |
|
* reader count value (RBITS) as a spinlock protecting overflow |
186 |
|
* updates. |
261 |
|
private static final int OVERFLOW_YIELD_RATE = 7; // must be power 2 - 1 |
262 |
|
|
263 |
|
/** The number of bits to use for reader count before overflowing */ |
264 |
< |
private static final int LG_READERS = 7; |
264 |
> |
private static final int LG_READERS = 7; |
265 |
|
|
266 |
|
// Values for lock state and stamp operations |
267 |
|
private static final long RUNIT = 1L; |
310 |
|
private transient int readerOverflow; |
311 |
|
|
312 |
|
/** |
313 |
< |
* Creates a new lock initially in unlocked state. |
313 |
> |
* Creates a new lock, initially in unlocked state. |
314 |
|
*/ |
315 |
|
public StampedLock() { |
316 |
|
state = ORIGIN; |
334 |
|
* Exclusively acquires the lock if it is immediately available. |
335 |
|
* |
336 |
|
* @return a stamp that can be used to unlock or convert mode, |
337 |
< |
* or zero if the lock is not available. |
337 |
> |
* or zero if the lock is not available |
338 |
|
*/ |
339 |
|
public long tryWriteLock() { |
340 |
|
long s, next; |
539 |
|
} |
540 |
|
|
541 |
|
/** |
542 |
< |
* If the lock state matches the given stamp, releases |
542 |
> |
* If the lock state matches the given stamp, releases the |
543 |
|
* non-exclusive lock. |
544 |
|
* |
545 |
|
* @param stamp a stamp returned by a read-lock operation |
606 |
|
/** |
607 |
|
* If the lock state matches the given stamp then performs one of |
608 |
|
* the following actions. If the stamp represents holding a write |
609 |
< |
* lock, returns it. Or, if a read lock, if the write lock is |
610 |
< |
* available, releases the read and returns a write stamp. Or, if |
611 |
< |
* an optimistic read, returns a write stamp only if immediately |
612 |
< |
* available. This method returns zero in all other cases. |
609 |
> |
* lock, returns it. Or, if a read lock, if the write lock is |
610 |
> |
* available, releases the read lock and returns a write stamp. |
611 |
> |
* Or, if an optimistic read, returns a write stamp only if |
612 |
> |
* immediately available. This method returns zero in all other |
613 |
> |
* cases. |
614 |
|
* |
615 |
|
* @param stamp a stamp |
616 |
|
* @return a valid write stamp, or zero on failure |
667 |
|
else if (m == WBIT) { |
668 |
|
if (a != m) |
669 |
|
break; |
670 |
< |
next = state = s + (WBIT + RUNIT); |
670 |
> |
state = next = s + (WBIT + RUNIT); |
671 |
|
readerPrefSignal(); |
672 |
|
return next; |
673 |
|
} |
701 |
|
else if (m == WBIT) { |
702 |
|
if (a != m) |
703 |
|
break; |
704 |
< |
next = state = (s += WBIT) == 0L ? ORIGIN : s; |
704 |
> |
state = next = (s += WBIT) == 0L ? ORIGIN : s; |
705 |
|
readerPrefSignal(); |
706 |
|
return next; |
707 |
|
} |