# HG changeset patch # User Shinji KONO # Date 1312313218 -32400 # Node ID 0cbe556e2c54b744c903b1cf357597078678ead0 # Parent 9109273b96dc96c94d68cf8e905959a2f2f7496f remove item to reduce memory diff -r 9109273b96dc -r 0cbe556e2c54 src/myVncProxy/MostRecentMultiCast.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/myVncProxy/MostRecentMultiCast.java Wed Aug 03 04:26:58 2011 +0900 @@ -0,0 +1,27 @@ +package myVncProxy; + +import java.util.LinkedList; + + +public class MostRecentMultiCast extends MulticastQueue { + + LinkedList> alive; + int count = 0; + MostRecentMultiCast(int limit) { + count = limit; + this.alive = new LinkedList>(); + } + + @Override + public synchronized void put(T item) + { + Node next = new Node(item); + tail.set(next); + tail = next; + alive.addLast(next); + if (alive.size()>count) { + Node old = alive.getFirst(); + old.clear(); + } + } +} diff -r 9109273b96dc -r 0cbe556e2c54 src/myVncProxy/MulticastQueue.java --- a/src/myVncProxy/MulticastQueue.java Wed Aug 03 03:20:39 2011 +0900 +++ b/src/myVncProxy/MulticastQueue.java Wed Aug 03 04:26:58 2011 +0900 @@ -36,18 +36,21 @@ public T poll() { Node next = null; - - try { - next = node.next(); - }catch(InterruptedException _e){ - _e.printStackTrace(); - } - node = next; - return next.item; + T item; + do { + try { + next = node.next(); + }catch(InterruptedException _e){ + _e.printStackTrace(); + } + item = node.getItem(); + node = next; + } while ( item == null); + return item; } } - private static class Node + static class Node { private T item; private Node next; @@ -60,6 +63,10 @@ latch = new CountDownLatch(1); } + synchronized public T getItem() { + return item; + } + public void set(Node next) { this.next = next; @@ -71,5 +78,9 @@ latch.await(); return next; } + + synchronized public void clear() { + item = null; + } } } diff -r 9109273b96dc -r 0cbe556e2c54 src/myVncProxy/MyRfbProto.java --- a/src/myVncProxy/MyRfbProto.java Wed Aug 03 03:20:39 2011 +0900 +++ b/src/myVncProxy/MyRfbProto.java Wed Aug 03 04:26:58 2011 +0900 @@ -32,7 +32,7 @@ * CheckMillis is one of new msgType for RFB 3.998. */ final static int SpeedCheckMillis = 4; - private static final int INFLATE_BUFSIZE = 1024*1024*16; + private static final int INFLATE_BUFSIZE = 1024*1024; boolean printStatusFlag = false; long startCheckTime; @@ -57,7 +57,7 @@ byte[] pngBytes; - private MulticastQueue multicastqueue = new MulticastQueue(); + private MulticastQueue multicastqueue = new MostRecentMultiCast(10); private int clients = 0; private Inflater inflater = new Inflater(); @@ -378,16 +378,18 @@ if (b[0]==RfbProto.FramebufferUpdate) { int encoding = ((b[12]*256+b[13])*256+b[14])*256+b[15]; if (encoding==RfbProto.EncodingZlib||encoding==RfbProto.EncodingZRLE) { - byte inf[] = new byte[INFLATE_BUFSIZE]; + int len; inflater.setInput(b, 20, b.length-20); - int len = inflater.inflate(inf,20,inf.length-20); - if (len==INFLATE_BUFSIZE) throw new DataFormatException(); // too large - for(int i = 0;i<20;i++) inf[i] = b[i]; - inf[16+0] = (byte) ((len >>> 24) & 0xFF); - inf[16+1] = (byte) ((len >>> 16) & 0xFF); - inf[16+2] = (byte) ((len >>> 8) & 0xFF); - inf[16+3] = (byte) ((len >>> 0) & 0xFF); - multicastqueue.put(inf); + do { + byte inf[] = new byte[INFLATE_BUFSIZE+20]; + len = inflater.inflate(inf,20,inf.length-20); + for(int i = 0;i<20;i++) inf[i] = b[i]; + inf[16+0] = (byte) ((len >>> 24) & 0xFF); + inf[16+1] = (byte) ((len >>> 16) & 0xFF); + inf[16+2] = (byte) ((len >>> 8) & 0xFF); + inf[16+3] = (byte) ((len >>> 0) & 0xFF); + multicastqueue.put(inf); + } while (len ==INFLATE_BUFSIZE); is.reset(); return; } @@ -555,14 +557,19 @@ if (b[0]==RfbProto.FramebufferUpdate) { int encoding = ((b[12]*256+b[13])*256+b[14])*256+b[15]; if (encoding==RfbProto.EncodingZlib||encoding==RfbProto.EncodingZRLE) { - byte[] c = new byte[INFLATE_BUFSIZE]; - int clen = ((b[16]*256+b[17])*256+b[18])*256+b[19]; - deflater.setInput(b,20,clen); - int len = deflater.deflate(c); + byte[] c1 = new byte[INFLATE_BUFSIZE]; + int len=0,len1,clen; + do { + clen = ((b[16]*256+b[17])*256+b[18])*256+b[19]; + deflater.setInput(b,20,clen); + len1 = deflater.deflate(c1); + if (clen==INFLATE_BUFSIZE) b = c.poll(); + len += len1; + } while(clen== INFLATE_BUFSIZE); byte[] blen = castIntByte(len); os.write(b,0,16); os.write(blen,0,4); - os.write(c,0,len); + os.write(c1,0,len); } } else os.write(b, 0, b.length);