make consecutive lock calls not break timing
All checks were successful
/ Build & Publish (push) Successful in 45s
All checks were successful
/ Build & Publish (push) Successful in 45s
This commit is contained in:
parent
bee64f9ee1
commit
70326b2947
1 changed files with 36 additions and 12 deletions
|
@ -7,6 +7,7 @@ public class Lock extends SimpleLock {
|
|||
|
||||
private boolean isTimed = false;
|
||||
private long startTime = 0, lockTime = 0;
|
||||
private boolean relocking = false;
|
||||
|
||||
/**
|
||||
* Creates a Lock without default state
|
||||
|
@ -56,12 +57,14 @@ public class Lock extends SimpleLock {
|
|||
*/
|
||||
public synchronized void waitHere() {
|
||||
if(!isTimed) {
|
||||
while(relocking)
|
||||
super.waitHere();
|
||||
return;
|
||||
}
|
||||
|
||||
if(!super.isLocked())
|
||||
return;
|
||||
while(relocking) {
|
||||
long wt = timeLeft0();
|
||||
if(wt == 0) {
|
||||
unlock();
|
||||
|
@ -69,6 +72,7 @@ public class Lock extends SimpleLock {
|
|||
}
|
||||
super.waitHere(wt);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Wait until unlocked, either by a timer, manually, or when it waited for timeout
|
||||
|
@ -77,25 +81,39 @@ public class Lock extends SimpleLock {
|
|||
public synchronized void waitHere(int timeout) {
|
||||
if(timeout == 0)
|
||||
return;
|
||||
long start = System.currentTimeMillis();
|
||||
if(!isTimed) {
|
||||
super.waitHere(timeout);
|
||||
while(relocking) {
|
||||
long sectionOffset = System.currentTimeMillis() - start;
|
||||
long wt = timeout - sectionOffset;
|
||||
if(wt == 0)
|
||||
break;
|
||||
super.waitHere(wt);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if(!super.isLocked())
|
||||
return;
|
||||
while(relocking) {
|
||||
long wt = timeLeft0();
|
||||
if(wt == 0) {
|
||||
unlock();
|
||||
return;
|
||||
}
|
||||
super.waitHere(Math.min(wt, timeout));
|
||||
long sectionOffset = System.currentTimeMillis() - start;
|
||||
wt = Math.min(wt, timeout - sectionOffset);
|
||||
if(wt == 0)
|
||||
break;
|
||||
super.waitHere(wt);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Unlock manually
|
||||
*/
|
||||
public synchronized void unlock() {
|
||||
relocking = false;
|
||||
super.unlock();
|
||||
startTime = 0;
|
||||
lockTime = 0;
|
||||
|
@ -105,9 +123,12 @@ public class Lock extends SimpleLock {
|
|||
* Lock until manually unlocked
|
||||
*/
|
||||
public synchronized void lock() {
|
||||
relocking = super.isLocked();
|
||||
startTime = System.currentTimeMillis();
|
||||
isTimed = false;
|
||||
super.lock();
|
||||
if(relocking)
|
||||
notifyAll();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -118,10 +139,13 @@ public class Lock extends SimpleLock {
|
|||
if(time == 0)
|
||||
return;
|
||||
|
||||
relocking = super.isLocked();
|
||||
startTime = System.currentTimeMillis();
|
||||
lockTime = time;
|
||||
isTimed = true;
|
||||
super.lock();
|
||||
if(relocking)
|
||||
notifyAll();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Add table
Reference in a new issue