summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
Diffstat (limited to 'java/src')
-rw-r--r--java/src/IceInternal/BasicStream.java42
-rw-r--r--java/src/IceInternal/Connection.java40
-rw-r--r--java/src/IceInternal/DispatchStatus.java7
-rw-r--r--java/src/IceInternal/Incoming.java12
-rw-r--r--java/src/IceInternal/Instance.java7
-rw-r--r--java/src/IceInternal/Network.java11
-rw-r--r--java/src/IceInternal/ThreadPool.java82
-rw-r--r--java/src/IceInternal/TraceUtil.java54
-rw-r--r--java/src/IceInternal/UdpTransceiver.java5
9 files changed, 156 insertions, 104 deletions
diff --git a/java/src/IceInternal/BasicStream.java b/java/src/IceInternal/BasicStream.java
index 56d397471c9..75afbd7fdf7 100644
--- a/java/src/IceInternal/BasicStream.java
+++ b/java/src/IceInternal/BasicStream.java
@@ -24,6 +24,7 @@ public class BasicStream
_currentReadEncaps = null;
_currentWriteEncaps = null;
+ _updateStringReadTable = true;
}
protected void
@@ -69,7 +70,7 @@ public class BasicStream
private static final int MAX = 1024 * 1024; // TODO: Configurable
public void
- resize(int total)
+ resize(int total, boolean reading)
{
if (total > MAX)
{
@@ -82,21 +83,23 @@ public class BasicStream
_buf = _bufferManager.reallocate(_buf, newCapacity);
_capacity = _buf.capacity();
}
- _buf.limit(total);
- _limit = total;
- }
-
- /* TODO - Remove?
- public void
- reserve(int total)
- {
- if (total > MAX)
+ //
+ // If this stream is used for reading, then we want to set
+ // the buffer's limit to the new total size. If this buffer
+ // is used for writing, then we must set the buffer's limit
+ // to the buffer's capacity.
+ //
+ if (reading)
{
- throw new Ice.MemoryLimitException();
+ _buf.limit(total);
+ }
+ else
+ {
+ _buf.limit(_capacity);
}
- _buf.reserve(total);
+ _buf.position(total);
+ _limit = total;
}
- */
java.nio.ByteBuffer
prepareRead()
@@ -1002,6 +1005,18 @@ public class BasicStream
throw new Ice.NoUserExceptionFactoryException();
}
+ public void
+ disableStringReadTableUpdates()
+ {
+ _updateStringReadTable = false;
+ }
+
+ public void
+ enableStringReadTableUpdates()
+ {
+ _updateStringReadTable = true;
+ }
+
int
pos()
{
@@ -1064,4 +1079,5 @@ public class BasicStream
private java.util.LinkedList _writeEncapsStack = new java.util.LinkedList();
private ReadEncaps _currentReadEncaps;
private WriteEncaps _currentWriteEncaps;
+ private boolean _updateStringReadTable;
}
diff --git a/java/src/IceInternal/Connection.java b/java/src/IceInternal/Connection.java
index 065c5a03a2d..45ae6ecfcf5 100644
--- a/java/src/IceInternal/Connection.java
+++ b/java/src/IceInternal/Connection.java
@@ -368,18 +368,19 @@ public final class Connection extends EventHandler
{
if (_state == StateClosing)
{
- TraceUtil.traceRequest("received batch request " +
- "during closing\n" +
- "(ignored by server, " +
- "client will retry)",
- stream, _logger,
- _traceLevels);
+ TraceUtil.traceBatchRequest("received batch " +
+ "request during " +
+ "closing\n" +
+ "(ignored by server, " +
+ "client will retry)",
+ stream, _logger,
+ _traceLevels);
}
else
{
- TraceUtil.traceRequest("received batch request",
- stream, _logger,
- _traceLevels);
+ TraceUtil.traceBatchRequest("received batch " +
+ "request", stream,
+ _logger, _traceLevels);
invoke = true;
batch = true;
}
@@ -523,6 +524,9 @@ public final class Connection extends EventHandler
return;
}
+ //
+ // Fill in the message size
+ //
os.pos(3);
final int sz = os.size();
os.writeInt(sz);
@@ -541,16 +545,8 @@ public final class Connection extends EventHandler
}
catch (Ice.LocalException ex)
{
- _mutex.lock();
- try
- {
- setState(StateClosed, ex);
- return;
- }
- finally
- {
- _mutex.unlock();
- }
+ setState(StateClosed, ex);
+ return;
}
}
finally
@@ -760,7 +756,11 @@ public final class Connection extends EventHandler
{
if (_warn)
{
- String s = "connection exception:\n" + ex + '\n' +
+ java.io.StringWriter sw = new java.io.StringWriter();
+ java.io.PrintWriter pw = new java.io.PrintWriter(sw);
+ ex.printStackTrace(pw);
+ pw.flush();
+ String s = "connection exception:\n" + sw.toString() + '\n' +
_transceiver.toString();
_logger.warning(s);
}
diff --git a/java/src/IceInternal/DispatchStatus.java b/java/src/IceInternal/DispatchStatus.java
index 6bd186cb4f6..74f53c7099a 100644
--- a/java/src/IceInternal/DispatchStatus.java
+++ b/java/src/IceInternal/DispatchStatus.java
@@ -12,6 +12,9 @@ package IceInternal;
public final class DispatchStatus
{
+ private static DispatchStatus[] __values = new DispatchStatus[10];
+ private int __value;
+
public static final int _DispatchOK = 0;
public static final DispatchStatus DispatchOK = new DispatchStatus(_DispatchOK);
public static final int _DispatchUserException = 1;
@@ -52,8 +55,4 @@ public final class DispatchStatus
__value = val;
__values[val] = this;
}
-
- private static DispatchStatus[] __values = new DispatchStatus[10];
-
- private int __value;
}
diff --git a/java/src/IceInternal/Incoming.java b/java/src/IceInternal/Incoming.java
index 2a9802d54f0..0ca9f066e39 100644
--- a/java/src/IceInternal/Incoming.java
+++ b/java/src/IceInternal/Incoming.java
@@ -131,7 +131,7 @@ public class Incoming
if (status != DispatchStatus.DispatchOK &&
status != DispatchStatus.DispatchUserException)
{
- _os.resize(statusPos);
+ _os.resize(statusPos, false);
_os.writeByte((byte)status.value());
}
else
@@ -153,7 +153,7 @@ public class Incoming
_is.endReadEncaps();
_os.endWriteEncaps();
- _os.resize(statusPos);
+ _os.resize(statusPos, false);
_os.writeByte((byte)DispatchStatus._DispatchLocationForward);
_os.writeProxy(ex._prx);
}
@@ -169,7 +169,7 @@ public class Incoming
_is.endReadEncaps();
_os.endWriteEncaps();
- _os.resize(statusPos);
+ _os.resize(statusPos, false);
_os.writeByte((byte)DispatchStatus._DispatchProxyRequested);
}
*/
@@ -184,7 +184,7 @@ public class Incoming
_is.endReadEncaps();
_os.endWriteEncaps();
- _os.resize(statusPos);
+ _os.resize(statusPos, false);
_os.writeByte((byte)DispatchStatus._DispatchUnknownLocalException);
throw ex;
@@ -201,7 +201,7 @@ public class Incoming
_is.endReadEncaps();
_os.endWriteEncaps();
- _os.resize(statusPos);
+ _os.resize(statusPos, false);
_os.writeByte((byte)DispatchStatus._DispatchUnknownUserException);
throw ex;
@@ -218,7 +218,7 @@ public class Incoming
_is.endReadEncaps();
_os.endWriteEncaps();
- _os.resize(statusPos);
+ _os.resize(statusPos, false);
_os.writeByte((byte)DispatchStatus._DispatchUnknownException);
Ice.UnknownException ue = new Ice.UnknownException();
diff --git a/java/src/IceInternal/Instance.java b/java/src/IceInternal/Instance.java
index c67bfc95bfd..b63a1451af7 100644
--- a/java/src/IceInternal/Instance.java
+++ b/java/src/IceInternal/Instance.java
@@ -92,7 +92,12 @@ public class Instance
return _defaultHost;
}
- public synchronized BufferManager
+ //
+ // TODO: This should be synchronized, but it causes a deadlock
+ // on shutdown if a BasicStream is created while the Instance
+ // is already locked (e.g., in ThreadPool)
+ //
+ public /*synchronized*/ BufferManager
bufferManager()
{
return _bufferManager;
diff --git a/java/src/IceInternal/Network.java b/java/src/IceInternal/Network.java
index 1ff51473233..d971a4117d0 100644
--- a/java/src/IceInternal/Network.java
+++ b/java/src/IceInternal/Network.java
@@ -63,7 +63,10 @@ public final class Network
{
try
{
- return java.nio.channels.DatagramChannel.open();
+ java.nio.channels.DatagramChannel fd =
+ java.nio.channels.DatagramChannel.open();
+ fd.configureBlocking(false);
+ return fd;
}
catch (java.io.IOException ex)
{
@@ -310,8 +313,12 @@ public final class Network
java.net.Socket socket = result.socket();
socket.setTcpNoDelay(true);
socket.setKeepAlive(true);
+ //
+ // Need to set non-blocking in order to use Selector
+ //
+ result.configureBlocking(false);
}
- catch (java.net.SocketException ex)
+ catch (java.io.IOException ex)
{
Ice.SocketException se = new Ice.SocketException();
se.initCause(ex);
diff --git a/java/src/IceInternal/ThreadPool.java b/java/src/IceInternal/ThreadPool.java
index ab546184359..e73e01b84b4 100644
--- a/java/src/IceInternal/ThreadPool.java
+++ b/java/src/IceInternal/ThreadPool.java
@@ -343,13 +343,22 @@ public final class ThreadPool
HandlerInfo info = _adds;
while (info != null)
{
+ int op;
+ if ((info.fd.validOps() &
+ java.nio.channels.SelectionKey.OP_READ) > 0)
+ {
+ op = java.nio.channels.SelectionKey.OP_READ;
+ }
+ else
+ {
+ op = java.nio.channels.SelectionKey.OP_ACCEPT;
+ }
+
_handlers++;
try
{
- info.key = info.fd.register(
- _selector,
- java.nio.channels.SelectionKey.OP_READ,
- info);
+ info.key =
+ info.fd.register(_selector, op, info);
}
catch (java.nio.channels.ClosedChannelException ex)
{
@@ -469,7 +478,7 @@ public final class ThreadPool
{
if (stream.size() == 0)
{
- stream.resize(Protocol.headerSize);
+ stream.resize(Protocol.headerSize, true);
stream.pos(0);
}
@@ -504,7 +513,7 @@ public final class ThreadPool
{
throw new Ice.MemoryLimitException();
}
- stream.resize(size);
+ stream.resize(size, true);
stream.pos(pos);
}
@@ -515,52 +524,6 @@ public final class ThreadPool
}
}
- private static void
- dumpBuffer(java.nio.ByteBuffer buf)
- {
- final int inc = 8;
-
- byte[] data = new byte[buf.remaining()];
- int pos = buf.position();
- buf.get(data);
- buf.position(pos);
-
- for(int i = 0; i < data.length; i += inc)
- {
- for(int j = i ; j - i < inc ; j++)
- {
- if(j < data.length)
- {
- int n = (int)data[j];
- if(n < 0)
- n += 256;
- String s;
- if(n < 10)
- s = " " + n;
- else if(n < 100)
- s = " " + n;
- else
- s = "" + n;
- System.out.print(s + " ");
- }
- else
- System.out.print(" ");
- }
-
- System.out.print('"');
-
- for(int j = i; j < data.length && j - i < inc; j++)
- {
- if(data[j] >= (byte)32 && data[j] < (byte)127)
- System.out.print((char)data[j]);
- else
- System.out.print('.');
- }
-
- System.out.println('"');
- }
- }
-
private static final class HandlerInfo
{
java.nio.channels.SelectableChannel fd;
@@ -605,14 +568,21 @@ public final class ThreadPool
}
catch (Ice.LocalException ex)
{
- String s = "exception in thread pool:\n" + ex;
- // TODO: Stack trace?
+ java.io.StringWriter sw = new java.io.StringWriter();
+ java.io.PrintWriter pw = new java.io.PrintWriter(sw);
+ ex.printStackTrace(pw);
+ pw.flush();
+ String s = "exception in thread pool:\n" + sw.toString();
_pool._instance.logger().error(s);
}
catch (RuntimeException ex)
{
- String s = "unknown exception in thread pool:\n" + ex;
- // TODO: Stack trace?
+ java.io.StringWriter sw = new java.io.StringWriter();
+ java.io.PrintWriter pw = new java.io.PrintWriter(sw);
+ ex.printStackTrace(pw);
+ pw.flush();
+ String s = "unknown exception in thread pool:\n" +
+ sw.toString();
_pool._instance.logger().error(s);
}
diff --git a/java/src/IceInternal/TraceUtil.java b/java/src/IceInternal/TraceUtil.java
index 2ca8b5402ce..479ceaf7cd5 100644
--- a/java/src/IceInternal/TraceUtil.java
+++ b/java/src/IceInternal/TraceUtil.java
@@ -18,6 +18,7 @@ final class TraceUtil
{
if (tl.protocol >= 1)
{
+ stream.disableStringReadTableUpdates();
int pos = stream.pos();
stream.pos(0);
java.io.StringWriter s = new java.io.StringWriter();
@@ -25,6 +26,7 @@ final class TraceUtil
printHeader(s, stream);
logger.trace(tl.protocolCat, s.toString());
stream.pos(pos);
+ stream.enableStringReadTableUpdates();
}
}
@@ -34,6 +36,7 @@ final class TraceUtil
{
if (tl.protocol >= 1)
{
+ stream.disableStringReadTableUpdates();
int pos = stream.pos();
stream.pos(0);
java.io.StringWriter s = new java.io.StringWriter();
@@ -48,6 +51,7 @@ final class TraceUtil
printRequestHeader(s, stream);
logger.trace(tl.protocolCat, s.toString());
stream.pos(pos);
+ stream.enableStringReadTableUpdates();
}
}
@@ -57,6 +61,7 @@ final class TraceUtil
{
if (tl.protocol >= 1)
{
+ stream.disableStringReadTableUpdates();
int pos = stream.pos();
stream.pos(0);
java.io.StringWriter s = new java.io.StringWriter();
@@ -72,6 +77,7 @@ final class TraceUtil
}
logger.trace(tl.protocolCat, s.toString());
stream.pos(pos);
+ stream.enableStringReadTableUpdates();
}
}
@@ -81,6 +87,7 @@ final class TraceUtil
{
if (tl.protocol >= 1)
{
+ stream.disableStringReadTableUpdates();
int pos = stream.pos();
stream.pos(0);
java.io.StringWriter s = new java.io.StringWriter();
@@ -135,6 +142,53 @@ final class TraceUtil
}
logger.trace(tl.protocolCat, s.toString());
stream.pos(pos);
+ stream.enableStringReadTableUpdates();
+ }
+ }
+
+ public static void
+ dumpStream(BasicStream stream)
+ {
+ final int inc = 8;
+
+ int pos = stream.pos();
+ stream.pos(0);
+
+ byte[] data = stream.readBlob(stream.size());
+
+ for(int i = 0; i < data.length; i += inc)
+ {
+ for(int j = i ; j - i < inc ; j++)
+ {
+ if(j < data.length)
+ {
+ int n = (int)data[j];
+ if(n < 0)
+ n += 256;
+ String s;
+ if(n < 10)
+ s = " " + n;
+ else if(n < 100)
+ s = " " + n;
+ else
+ s = "" + n;
+ System.out.print(s + " ");
+ }
+ else
+ System.out.print(" ");
+ }
+
+ System.out.print('"');
+
+ for(int j = i; j < data.length && j - i < inc; j++)
+ {
+ if(data[j] >= (byte)32 && data[j] < (byte)127)
+ System.out.print((char)data[j]);
+ else
+ System.out.print('.');
+ }
+
+ System.out.println('"');
}
}
diff --git a/java/src/IceInternal/UdpTransceiver.java b/java/src/IceInternal/UdpTransceiver.java
index b872ec69a2d..e451b7b9bb1 100644
--- a/java/src/IceInternal/UdpTransceiver.java
+++ b/java/src/IceInternal/UdpTransceiver.java
@@ -97,9 +97,10 @@ final class UdpTransceiver implements Transceiver
assert(!_sender);
assert(stream.pos() == 0);
final int packetSize = 64 * 1024; // TODO: configurable
- stream.resize(packetSize);
+ stream.resize(packetSize, true);
java.nio.ByteBuffer buf = stream.prepareRead();
+ buf.position(0);
while (true)
{
try
@@ -114,7 +115,7 @@ final class UdpTransceiver implements Transceiver
_logger.trace(_traceLevels.networkCat, s);
}
- stream.resize(tot);
+ stream.resize(tot, true);
stream.pos(tot);
break;
}