static class FSHLog.SafePointZigZagLatch extends Object
Thread A signals Thread B to hold when it gets to a 'safe point'. Thread A wait until Thread B gets there. When the 'safe point' has been attained, Thread B signals Thread A. Thread B then holds at the 'safe point'. Thread A on notification that Thread B is paused, goes ahead and does the work it needs to do while Thread B is holding. When Thread A is done, it flags B and then Thread A and Thread B continue along on their merry way. Pause and signalling 'zigzags' between the two participating threads. We use two latches -- one the inverse of the other -- pausing and signaling when states are achieved.
 To start up the drama, Thread A creates an instance of this class each time it would do this
 zigzag dance and passes it to Thread B (these classes use Latches so it is one shot only).
 Thread B notices the new instance (via reading a volatile reference or how ever) and it starts
 to work toward the 'safe point'. Thread A calls waitSafePoint(SyncFuture) when it cannot proceed
 until the Thread B 'safe point' is attained. Thread A will be held inside in
 waitSafePoint(SyncFuture) until Thread B reaches the 'safe point'. Once there, Thread B frees
 Thread A by calling safePointAttained(). Thread A now knows Thread B is at the 'safe
 point' and that it is holding there (When Thread B calls safePointAttained() it blocks
 here until Thread A calls releaseSafePoint()). Thread A proceeds to do what it needs
 to do while Thread B is paused. When finished, it lets Thread B lose by calling
 releaseSafePoint() and away go both Threads again.
| Modifier and Type | Field and Description | 
|---|---|
| private CountDownLatch | safePointAttainedLatchCount down this latch when safe point attained. | 
| private CountDownLatch | safePointReleasedLatchLatch to wait on. | 
| Constructor and Description | 
|---|
| SafePointZigZagLatch() | 
| Modifier and Type | Method and Description | 
|---|---|
| private void | checkIfSyncFailed(SyncFuture syncFuture) | 
| (package private) boolean | isCocked() | 
| (package private) void | releaseSafePoint()Called by Thread A when it is done with the work it needs to do while Thread B is halted. | 
| (package private) void | safePointAttained()Called by Thread B when it attains the 'safe point'. | 
| (package private) SyncFuture | waitSafePoint(SyncFuture syncFuture)For Thread A to call when it is ready to wait on the 'safe point' to be attained. | 
private volatile CountDownLatch safePointAttainedLatch
private volatile CountDownLatch safePointReleasedLatch
SafePointZigZagLatch()
private void checkIfSyncFailed(SyncFuture syncFuture) throws FailedSyncBeforeLogCloseException
SyncFuture waitSafePoint(SyncFuture syncFuture) throws InterruptedException, FailedSyncBeforeLogCloseException
safePointAttained()syncFuture - We need this as barometer on outstanding syncs. If it comes home with an
          exception, then something is up w/ our syncing.syncFutureInterruptedExceptionFailedSyncBeforeLogCloseExceptionvoid safePointAttained() throws InterruptedException
releaseSafePoint() is called
 by Thread A.InterruptedExceptionvoid releaseSafePoint()
safePointAttained()boolean isCocked()
Copyright © 2007–2020 The Apache Software Foundation. All rights reserved.