Protect deflation with a simple semaphore. Should close #336

This commit is contained in:
Christian 2012-12-25 22:06:20 -05:00
parent 58dc621fb7
commit 7553f98367
2 changed files with 53 additions and 13 deletions

View file

@ -1,6 +1,23 @@
--- ../src_base/minecraft/net/minecraft/network/packet/Packet51MapChunk.java --- ../src_base/minecraft/net/minecraft/network/packet/Packet51MapChunk.java
+++ ../src_work/minecraft/net/minecraft/network/packet/Packet51MapChunk.java +++ ../src_work/minecraft/net/minecraft/network/packet/Packet51MapChunk.java
@@ -57,16 +57,19 @@ @@ -5,6 +5,7 @@
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
+import java.util.concurrent.Semaphore;
import java.util.zip.DataFormatException;
import java.util.zip.Deflater;
import java.util.zip.Inflater;
@@ -45,6 +46,8 @@
/** A temporary storage for the compressed chunk data byte array. */
private static byte[] temp = new byte[196864];
+ private Semaphore deflateGate;
+
public Packet51MapChunk()
{
this.isChunkDataPacket = true;
@@ -57,16 +60,20 @@
this.zCh = par1Chunk.zPosition; this.zCh = par1Chunk.zPosition;
this.includeInitialize = par2; this.includeInitialize = par2;
Packet51MapChunkData var4 = getMapChunkData(par1Chunk, par2, par3); Packet51MapChunkData var4 = getMapChunkData(par1Chunk, par2, par3);
@ -9,6 +26,7 @@
this.yChMin = var4.field_74580_b; this.yChMin = var4.field_74580_b;
- -
+ this.field_73596_g = var4.field_74582_a; + this.field_73596_g = var4.field_74582_a;
+ this.deflateGate = new Semaphore(1);
+ } + }
+ +
+ private void deflate() + private void deflate()
@ -25,7 +43,7 @@
this.tempLength = var5.deflate(this.chunkData); this.tempLength = var5.deflate(this.chunkData);
} }
finally finally
@@ -95,13 +98,16 @@ @@ -95,13 +102,16 @@
par1DataInputStream.readFully(temp, 0, this.tempLength); par1DataInputStream.readFully(temp, 0, this.tempLength);
int var2 = 0; int var2 = 0;
int var3; int var3;
@ -42,14 +60,19 @@
if (this.includeInitialize) if (this.includeInitialize)
{ {
@@ -131,6 +137,11 @@ @@ -131,6 +141,16 @@
*/ */
public void writePacketData(DataOutputStream par1DataOutputStream) throws IOException public void writePacketData(DataOutputStream par1DataOutputStream) throws IOException
{ {
+ if (chunkData == null) + if (chunkData == null)
+ { + {
+ deflateGate.acquireUninterruptibly();
+ if (chunkData == null)
+ {
+ deflate(); + deflate();
+ } + }
+ deflateGate.release();
+ }
+ +
par1DataOutputStream.writeInt(this.xCh); par1DataOutputStream.writeInt(this.xCh);
par1DataOutputStream.writeInt(this.zCh); par1DataOutputStream.writeInt(this.zCh);

View file

@ -1,14 +1,24 @@
--- ../src_base/minecraft/net/minecraft/network/packet/Packet56MapChunks.java --- ../src_base/minecraft/net/minecraft/network/packet/Packet56MapChunks.java
+++ ../src_work/minecraft/net/minecraft/network/packet/Packet56MapChunks.java +++ ../src_work/minecraft/net/minecraft/network/packet/Packet56MapChunks.java
@@ -22,6 +22,7 @@ @@ -6,6 +6,7 @@
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.List;
+import java.util.concurrent.Semaphore;
import java.util.zip.DataFormatException;
import java.util.zip.Deflater;
import java.util.zip.Inflater;
@@ -22,6 +23,9 @@
private int field_73585_g; private int field_73585_g;
private boolean field_92024_h; private boolean field_92024_h;
private static byte[] field_73591_h = new byte[0]; private static byte[] field_73591_h = new byte[0];
+ private int maxLen = 0; + private int maxLen = 0;
+
+ private Semaphore deflateGate;
public Packet56MapChunks() {} public Packet56MapChunks() {}
@@ -40,15 +41,6 @@ @@ -40,30 +44,35 @@
{ {
Chunk var5 = (Chunk)par1List.get(var4); Chunk var5 = (Chunk)par1List.get(var4);
Packet51MapChunkData var6 = Packet51MapChunk.getMapChunkData(var5, true, 65535); Packet51MapChunkData var6 = Packet51MapChunk.getMapChunkData(var5, true, 65535);
@ -24,10 +34,12 @@
var3 += var6.field_74582_a.length; var3 += var6.field_74582_a.length;
this.field_73589_c[var4] = var5.xPosition; this.field_73589_c[var4] = var5.xPosition;
this.field_73586_d[var4] = var5.zPosition; this.field_73586_d[var4] = var5.zPosition;
@@ -57,13 +49,26 @@ this.field_73590_a[var4] = var6.field_74580_b;
this.field_73588_b[var4] = var6.field_74581_c;
this.field_73584_f[var4] = var6.field_74582_a; this.field_73584_f[var4] = var6.field_74582_a;
} + deflateGate = new Semaphore(1);
+ }
+
+ maxLen = var3; + maxLen = var3;
+ } + }
+ +
@ -39,8 +51,8 @@
+ { + {
+ System.arraycopy(field_73584_f[x], 0, data, offset, field_73584_f[x].length); + System.arraycopy(field_73584_f[x], 0, data, offset, field_73584_f[x].length);
+ offset += field_73584_f[x].length; + offset += field_73584_f[x].length;
+ } }
+
Deflater var11 = new Deflater(-1); Deflater var11 = new Deflater(-1);
try try
@ -53,14 +65,19 @@
this.field_73585_g = var11.deflate(this.field_73587_e); this.field_73585_g = var11.deflate(this.field_73587_e);
} }
finally finally
@@ -146,6 +151,11 @@ @@ -146,6 +155,16 @@
*/ */
public void writePacketData(DataOutputStream par1DataOutputStream) throws IOException public void writePacketData(DataOutputStream par1DataOutputStream) throws IOException
{ {
+ if (field_73587_e == null) + if (field_73587_e == null)
+ { + {
+ deflateGate.acquireUninterruptibly();
+ if (field_73587_e == null)
+ {
+ deflate(); + deflate();
+ } + }
+ deflateGate.release();
+ }
+ +
par1DataOutputStream.writeShort(this.field_73589_c.length); par1DataOutputStream.writeShort(this.field_73589_c.length);
par1DataOutputStream.writeInt(this.field_73585_g); par1DataOutputStream.writeInt(this.field_73585_g);