Skip to content

Commit 034ce6a

Browse files
committed
Adding atomic double and switching lastDeath to said double
1 parent 5a5efc2 commit 034ce6a

File tree

2 files changed

+36
-5
lines changed

2 files changed

+36
-5
lines changed

src/main/java/dev/koifysh/archipelago/bounce/DeathLinkHandler.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import dev.koifysh.archipelago.events.DeathLinkEvent;
55
import dev.koifysh.archipelago.network.client.BouncePacket;
66
import dev.koifysh.archipelago.network.server.BouncedPacket;
7+
import dev.koifysh.archipelago.utils.AtomicDouble;
78

89
import java.util.HashMap;
910
import java.util.Map;
@@ -13,7 +14,7 @@ public class DeathLinkHandler implements BouncedPacketHandler {
1314

1415
private final Client client;
1516

16-
private double lastDeath = 0d;
17+
private final AtomicDouble lastDeath = new AtomicDouble(0d);
1718

1819
public DeathLinkHandler(Client client) {
1920
this.client = client;
@@ -30,19 +31,18 @@ public void handle(BouncedPacket packet) {
3031
DeathLinkEvent event = new DeathLinkEvent((String) data.get("source"),
3132
(String) data.get("cause"),
3233
(Double) data.getOrDefault("time", 0d));
33-
34-
if(Math.abs(lastDeath - event.time) <= 1e-6)
34+
double recentDeath = lastDeath.getAndUpdate(d -> Math.max(d, event.time));
35+
if(Math.abs(recentDeath - event.time) <= 1e-6)
3536
{
3637
// We already died, go away!
3738
return;
3839
}
39-
lastDeath = Math.max(event.time, lastDeath);
4040
client.getEventManager().callEvent(event);
4141
}
4242

4343
public void sendDeathLink(String source, String cause)
4444
{
45-
lastDeath = (double)System.currentTimeMillis() / 1000D;
45+
lastDeath.set((double)System.currentTimeMillis() / 1000D);
4646

4747
BouncePacket deathLinkPacket = new BouncePacket();
4848
deathLinkPacket.tags = new String[]{DEATHLINK_TAG};
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package dev.koifysh.archipelago.utils;
2+
3+
import java.util.concurrent.atomic.AtomicLong;
4+
import java.util.function.DoubleUnaryOperator;
5+
6+
public class AtomicDouble {
7+
// Cause Java hates us, and doesn't want to give us doubles
8+
9+
private final AtomicLong bits = new AtomicLong();
10+
11+
public AtomicDouble(double initialValue)
12+
{
13+
bits.set(Double.doubleToLongBits(initialValue));
14+
}
15+
16+
public double get()
17+
{
18+
return Double.longBitsToDouble(bits.get());
19+
}
20+
21+
public void set(double value)
22+
{
23+
bits.set(Double.doubleToLongBits(value));
24+
}
25+
26+
public double getAndUpdate(DoubleUnaryOperator func)
27+
{
28+
return Double.longBitsToDouble(bits.getAndUpdate(l -> Double.doubleToLongBits(func.applyAsDouble(Double.longBitsToDouble(l)))));
29+
}
30+
31+
}

0 commit comments

Comments
 (0)