Skip to content

Commit cb7a6fd

Browse files
author
Bytekeeper
committed
Added resource locking basics.
1 parent a3444a9 commit cb7a6fd

File tree

7 files changed

+104
-8
lines changed

7 files changed

+104
-8
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
/.idea
22
/build
33
/out
4-
4+
/.gradle

src/main/java/org/bk/ass/FastArrayFill.java renamed to src/main/java/org/bk/ass/collection/FastArrayFill.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.bk.ass;
1+
package org.bk.ass.collection;
22

33
public class FastArrayFill {
44

src/main/java/org/bk/ass/collection/UnorderedCollection.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package org.bk.ass.collection;
22

3-
import org.bk.ass.FastArrayFill;
4-
53
import java.util.AbstractCollection;
64
import java.util.Collection;
75
import java.util.Iterator;

src/main/java/org/bk/ass/GMS.java renamed to src/main/java/org/bk/ass/manage/GMS.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.bk.ass;
1+
package org.bk.ass.manage;
22

33
import bwapi.TechType;
44
import bwapi.UnitType;
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package org.bk.ass.manage;
2+
3+
import java.util.function.Predicate;
4+
import java.util.function.Supplier;
5+
6+
/**
7+
* Holds a lock on a resource. Ie. a unit or {@link GMS}.
8+
*
9+
* @param <T> the type of resource
10+
*/
11+
public class Lock<T> {
12+
private boolean satisfied;
13+
private boolean satisfiedLater;
14+
private boolean changed;
15+
private T item;
16+
private Predicate<T> criteria = unused -> true;
17+
private final Reservation<T> reservation;
18+
private final Supplier<T> selector;
19+
private int futureFrame;
20+
21+
public Lock(Reservation<T> reservation, Supplier<T> selector) {
22+
this.reservation = reservation;
23+
this.selector = selector;
24+
}
25+
26+
public void setFutureFrame(int futureFrame) {
27+
this.futureFrame = futureFrame;
28+
}
29+
30+
public T getItem() {
31+
return item;
32+
}
33+
34+
public boolean isSatisfied() {
35+
return satisfied;
36+
}
37+
38+
public boolean isSatisfiedLater() {
39+
return satisfiedLater;
40+
}
41+
42+
public boolean isChanged() {
43+
return changed;
44+
}
45+
46+
public void reacquire() {
47+
reset();
48+
acquire();
49+
}
50+
51+
public void release() {
52+
if (item != null) reservation.release(item);
53+
item = null;
54+
changed = true;
55+
}
56+
57+
public void reset() {
58+
item = null;
59+
changed = false;
60+
satisfied = false;
61+
}
62+
63+
public void acquire() {
64+
changed = false;
65+
if (item != null && criteria.test(item) && reservation.tryReserve(item)) {
66+
satisfied = true;
67+
satisfiedLater = true;
68+
return;
69+
}
70+
item = selector.get();
71+
satisfied = item != null && criteria.test(item);
72+
if (satisfied) {
73+
changed = true;
74+
satisfiedLater = true;
75+
boolean reserved = reservation.tryReserve(item);
76+
if (!reserved) throw new IllegalStateException("Could not reserve item that was selected!");
77+
} else satisfiedLater = reservation.canBeReservedLater(item, futureFrame);
78+
}
79+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.bk.ass.manage;
2+
3+
/**
4+
* Should be implemented by clients to be able to use {@link Lock}.
5+
*
6+
* @param <T> the type of resource
7+
*/
8+
public interface Reservation<T> {
9+
/** Returns true if the given item could be reserved, false otherwise. */
10+
boolean tryReserve(T item);
11+
12+
default boolean canBeReservedLater(T item, int futureFrames) {
13+
return false;
14+
}
15+
16+
/** Releases the given item. */
17+
void release(T item);
18+
}

src/test/java/org/bk/ass/FastArrayFillTest.java renamed to src/test/java/org/bk/ass/collection/FastArrayFillTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
package org.bk.ass;
1+
package org.bk.ass.collection;
22

3-
import static org.assertj.core.api.Assertions.assertThat;
3+
import org.junit.jupiter.api.Test;
44

55
import java.util.Arrays;
6-
import org.junit.jupiter.api.Test;
6+
7+
import static org.assertj.core.api.Assertions.assertThat;
78

89
class FastArrayFillTest {
910

0 commit comments

Comments
 (0)