Fix race condition causing timestamps to be written in reverse order
This commit is contained in:
@@ -150,8 +150,13 @@ public abstract class DataListener extends ChannelInboundHandlerAdapter {
|
|||||||
outputThread.start();
|
outputThread.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void writeData(PacketData data) {
|
public synchronized void writePacket(byte[] bytes) {
|
||||||
queue.add(data);
|
if(startTime == null) {
|
||||||
|
startTime = System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
int timestamp = (int) (System.currentTimeMillis() - startTime);
|
||||||
|
lastSentPacket = timestamp;
|
||||||
|
queue.add(new PacketData(bytes, timestamp));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void requestFinish(Set<String> players, Set<MarkerKeyframe> markers) {
|
public void requestFinish(Set<String> players, Set<MarkerKeyframe> markers) {
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import com.google.common.util.concurrent.ListenableFuture;
|
|||||||
import eu.crushedpixel.replaymod.ReplayMod;
|
import eu.crushedpixel.replaymod.ReplayMod;
|
||||||
import eu.crushedpixel.replaymod.chat.ChatMessageHandler;
|
import eu.crushedpixel.replaymod.chat.ChatMessageHandler;
|
||||||
import eu.crushedpixel.replaymod.holders.MarkerKeyframe;
|
import eu.crushedpixel.replaymod.holders.MarkerKeyframe;
|
||||||
import eu.crushedpixel.replaymod.holders.PacketData;
|
|
||||||
import eu.crushedpixel.replaymod.holders.Position;
|
import eu.crushedpixel.replaymod.holders.Position;
|
||||||
import eu.crushedpixel.replaymod.utils.ReplayFileIO;
|
import eu.crushedpixel.replaymod.utils.ReplayFileIO;
|
||||||
import io.netty.channel.ChannelHandlerContext;
|
import io.netty.channel.ChannelHandlerContext;
|
||||||
@@ -61,8 +60,7 @@ public class PacketListener extends DataListener {
|
|||||||
players.add(uuid.toString());
|
players.add(uuid.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
PacketData pd = getPacketData(packet);
|
dataWriter.writePacket(getPacketData(packet));
|
||||||
writeData(pd);
|
|
||||||
} catch(Exception e) {
|
} catch(Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
@@ -106,8 +104,7 @@ public class PacketListener extends DataListener {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
PacketData pd = getPacketData(packet);
|
dataWriter.writePacket(getPacketData(packet));
|
||||||
writeData(pd);
|
|
||||||
} catch(Exception e) {
|
} catch(Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
@@ -117,19 +114,8 @@ public class PacketListener extends DataListener {
|
|||||||
super.channelRead(ctx, msg);
|
super.channelRead(ctx, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void writeData(PacketData pd) {
|
|
||||||
dataWriter.writeData(pd);
|
|
||||||
lastSentPacket = pd.getTimestamp();
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private PacketData getPacketData(Packet packet) throws IOException {
|
private byte[] getPacketData(Packet packet) throws IOException {
|
||||||
|
|
||||||
if(startTime == null) startTime = System.currentTimeMillis();
|
|
||||||
|
|
||||||
int timestamp = (int) (System.currentTimeMillis() - startTime);
|
|
||||||
|
|
||||||
|
|
||||||
if(packet instanceof S0FPacketSpawnMob) {
|
if(packet instanceof S0FPacketSpawnMob) {
|
||||||
S0FPacketSpawnMob p = (S0FPacketSpawnMob) packet;
|
S0FPacketSpawnMob p = (S0FPacketSpawnMob) packet;
|
||||||
if (p.field_149043_l == null) {
|
if (p.field_149043_l == null) {
|
||||||
@@ -154,9 +140,7 @@ public class PacketListener extends DataListener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
byte[] array = ReplayFileIO.serializePacket(packet);
|
return ReplayFileIO.serializePacket(packet);
|
||||||
|
|
||||||
return new PacketData(array, timestamp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized int handleResourcePack(S48PacketResourcePackSend packet) {
|
public synchronized int handleResourcePack(S48PacketResourcePackSend packet) {
|
||||||
|
|||||||
Reference in New Issue
Block a user