diff --git a/history.txt b/history.txt index 3192107ef5..bedfd72674 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,8 @@ +2014-01-27 zab + * Move message serialization later in the SSU sending pipeline + (Ticket #1183) + * Up version to -5 + 2014-01-27 zzz * i2ptunnel HTTP Proxy: Fix default enable for outproxy plugin @@ -13,7 +18,7 @@ 2014-01-25 zab * Move OutNetMessage buffer preparation to the Writer threads - (Ticket #1184) + (Ticket #1183) * Up version to -1 * 2014-01-22 0.9.10 released diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index f6e6df3a5c..4e28a2c8d2 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 4; + public final static long BUILD = 5; /** for example "-test" */ public final static String EXTRA = ""; diff --git a/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java b/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java index 98898e21c3..39746e737f 100644 --- a/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java +++ b/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java @@ -20,6 +20,7 @@ class OutboundMessageState implements CDPQEntry { private final Log _log; /** may be null if we are part of the establishment */ private final OutNetMessage _message; + private final I2NPMessage _i2npMessage; private final long _messageId; /** will be null, unless we are part of the establishment */ private final PeerState _peer; @@ -28,7 +29,7 @@ class OutboundMessageState implements CDPQEntry { /** fixed fragment size across the message */ private int _fragmentSize; /** size of the I2NP message */ - private final int _totalSize; + private int _totalSize; /** sends[i] is how many times the fragment has been sent, or -1 if ACKed */ private short _fragmentSends[]; private final long _startedOn; @@ -89,13 +90,9 @@ class OutboundMessageState implements CDPQEntry { _context = context; _log = _context.logManager().getLog(OutboundMessageState.class); _message = m; + _i2npMessage = msg; _peer = peer; - int size = msg.getRawMessageSize(); - acquireBuf(size); - _totalSize = msg.toRawByteArray(_messageBuf.getData()); - _messageBuf.setValid(_totalSize); _messageId = msg.getUniqueId(); - _startedOn = _context.clock().now(); _nextSendTime = _startedOn; _expiration = _startedOn + EXPIRATION; @@ -105,6 +102,18 @@ class OutboundMessageState implements CDPQEntry { // _log.debug("Raw byte array for " + _messageId + ": " + Base64.encode(_messageBuf.getData(), 0, len)); } + /** + * lazily inits the message buffer unless already inited + */ + private synchronized void initBuf() { + if (_messageBuf != null) + return; + final int size = _i2npMessage.getRawMessageSize(); + acquireBuf(size); + _totalSize = _i2npMessage.toRawByteArray(_messageBuf.getData()); + _messageBuf.setValid(_totalSize); + } + /** * @throws IAE if too big * @since 0.9.3 @@ -175,7 +184,7 @@ class OutboundMessageState implements CDPQEntry { return true; } - public int getUnackedSize() { + public synchronized int getUnackedSize() { short fragmentSends[] = _fragmentSends; ByteArray messageBuf = _messageBuf; int rv = 0; @@ -288,6 +297,7 @@ class OutboundMessageState implements CDPQEntry { public void fragment(int fragmentSize) { if (_fragmentSends != null) throw new IllegalStateException(); + initBuf(); int numFragments = _totalSize / fragmentSize; if (numFragments * fragmentSize < _totalSize) numFragments++; @@ -335,6 +345,11 @@ class OutboundMessageState implements CDPQEntry { */ public boolean shouldSend(int fragmentNum) { return _fragmentSends[fragmentNum] >= (short)0; } + /** + * This assumes fragment(int size) has been called + * @param fragmentNum the number of the fragment + * @return the size of the fragment specified by the number + */ public int fragmentSize(int fragmentNum) { if (_messageBuf == null) return -1; if (fragmentNum + 1 == _fragmentSends.length) { @@ -351,7 +366,8 @@ class OutboundMessageState implements CDPQEntry { /** * Write a part of the the message onto the specified buffer. - * See releaseResources() above for synchhronization information. + * See releaseResources() above for synchronization information. + * This assumes fragment(int size) has been called. * * @param out target to write * @param outOffset into outOffset to begin writing