diff options
author | Mark Spruiell <mes@zeroc.com> | 2001-11-29 20:30:32 +0000 |
---|---|---|
committer | Mark Spruiell <mes@zeroc.com> | 2001-11-29 20:30:32 +0000 |
commit | 84bf6b61e5535aba4687c67956eec9bffb89c265 (patch) | |
tree | cd7623ffb2f22b52a960c7519195a069e24c9b6c /java/src | |
parent | minor edits (diff) | |
download | ice-84bf6b61e5535aba4687c67956eec9bffb89c265.tar.bz2 ice-84bf6b61e5535aba4687c67956eec9bffb89c265.tar.xz ice-84bf6b61e5535aba4687c67956eec9bffb89c265.zip |
initial check-in
Diffstat (limited to 'java/src')
-rw-r--r-- | java/src/IceInternal/BufferManager.java | 113 | ||||
-rw-r--r-- | java/src/IceInternal/TcpConnector.java | 58 | ||||
-rw-r--r-- | java/src/IceInternal/TcpTransceiver.java | 176 |
3 files changed, 347 insertions, 0 deletions
diff --git a/java/src/IceInternal/BufferManager.java b/java/src/IceInternal/BufferManager.java new file mode 100644 index 00000000000..5b5539881d3 --- /dev/null +++ b/java/src/IceInternal/BufferManager.java @@ -0,0 +1,113 @@ +// ********************************************************************** +// +// Copyright (c) 2001 +// MutableRealms, Inc. +// Huntsville, AL, USA +// +// All Rights Reserved +// +// ********************************************************************** + +package IceInternal; + +final class BufferManager +{ + BufferManager() + { + _head = null; + } + + void + destroy() + { + } + + java.nio.ByteBuffer + allocate(int size) + { + java.nio.ByteBuffer buf = getBuffer(size); + if (buf == null) + { + buf = java.nio.ByteBuffer.allocateDirect(size); + buf.order(java.nio.ByteOrder.LITTLE_ENDIAN); + } + return buf; + } + + java.nio.ByteBuffer + reallocate(java.nio.ByteBuffer old, int size) + { + java.nio.ByteBuffer buf = getBuffer(size); + if (buf == null) + { + buf = java.nio.ByteBuffer.allocateDirect(size); + buf.order(java.nio.ByteOrder.LITTLE_ENDIAN); + } + buf.put(old); + return buf; + } + + synchronized void + reclaim(java.nio.ByteBuffer buf) + { + BufferNode node; + if (_nodeCache == null) + { + node = new BufferNode(); + } + else + { + node = _nodeCache; + _nodeCache = _nodeCache.next; + } + node.buf = buf; + node.size = buf.capacity(); + node.next = _head; + _head = node; + } + + private synchronized java.nio.ByteBuffer + getBuffer(int size) + { + BufferNode node = _head; + BufferNode prev = null; + while (node != null) + { + if (size <= node.size) + { + break; + } + prev = node; + node = node.next; + } + if (node != null) + { + if (prev != null) + { + prev.next = node.next; + } + else + { + _head = node.next; + } + node.next = _nodeCache; + _nodeCache = node; + node.buf.clear(); + return node.buf; + } + else + { + return null; + } + } + + private static class BufferNode + { + java.nio.ByteBuffer buf; + int capacity; + BufferNode next; + } + + private BufferNode _head; + private BufferNode _nodeCache; +} diff --git a/java/src/IceInternal/TcpConnector.java b/java/src/IceInternal/TcpConnector.java new file mode 100644 index 00000000000..91ef1c2c75c --- /dev/null +++ b/java/src/IceInternal/TcpConnector.java @@ -0,0 +1,58 @@ +// ********************************************************************** +// +// Copyright (c) 2001 +// MutableRealms, Inc. +// Huntsville, AL, USA +// +// All Rights Reserved +// +// ********************************************************************** + +package IceInternal; + +final class TcpConnector implements Connector +{ + public Transceiver + connect(int timeout) + { + if (_traceLevels.network >= 2) + { + String s = "trying to establish tcp connection to " + toString(); + _logger.trace(_traceLevels.networkCat, s); + } + + java.nio.channels.SocketChannel fd = Network.createTcpSocket(); + Network.doConnect(fd, _addr, timeout); + + if (_traceLevels.network >= 1) + { + String s = "tcp connection established\n" + Network.fdToString(fd); + _logger.trace(_traceLevels.networkCat, s); + } + + return new TcpTransceiver(_instance, fd); + } + + public String + toString() + { + return Network.addrToString(_addr); + } + + // + // Only for use by TcpEndpoint + // + TcpConnector(Instance instance, String host, int port) + { + _instance = instance; + _traceLevels = instance.traceLevels(); + _logger = instance.logger(); + + _addr = Network.getAddress(host, port); + } + + private Instance _instance; + private TraceLevels _traceLevels; + private Ice.Logger _logger; + private java.net.InetSocketAddress _addr; +} diff --git a/java/src/IceInternal/TcpTransceiver.java b/java/src/IceInternal/TcpTransceiver.java new file mode 100644 index 00000000000..2c9ca64964a --- /dev/null +++ b/java/src/IceInternal/TcpTransceiver.java @@ -0,0 +1,176 @@ +// ********************************************************************** +// +// Copyright (c) 2001 +// MutableRealms, Inc. +// Huntsville, AL, USA +// +// All Rights Reserved +// +// ********************************************************************** + +package IceInternal; + +final class TcpTransceiver implements Transceiver +{ + public java.nio.channels.SelectableChannel + fd() + { + return _fd; + } + + public void + close() + { + if (_traceLevels.network >= 1) + { + String s = "closing tcp connection\n" + toString(); + _logger.trace(_traceLevels.networkCat, s); + } + + java.nio.channels.SocketChannel fd = _fd; + _fd = null; + java.net.Socket socket = fd.socket(); + try + { + socket.shutdownInput(); // helps to unblock threads in recv() + } + catch (java.io.IOException ex) + { + } + try + { + socket.shutdownOutput(); + } + catch (java.io.IOException ex) + { + } + try + { + fd.close(); + } + catch (java.io.IOException ex) + { + } + } + + public void + shutdown() + { + if (_traceLevels.network >= 1) + { + String s = "shutting down tcp connection\n" + toString(); + _logger.trace(_traceLevels.networkCat, s); + } + + java.net.Socket socket = _fd.socket(); + try + { + socket.shutdownOutput(); // Shutdown socket for writing + } + catch (java.io.IOException ex) + { + } + } + + public void + write(java.nio.ByteBuffer buf, int timeout) + { + while (buf.hasRemaining()) + { + try + { + int ret = _fd.write(buf); + + /* TODO: Review + if (ret == 0) + { + throw new Ice.ConnectionLostException(); + } + */ + + if (_traceLevels.network >= 3) + { + String s = "sent " + ret + " of " + buf.limit() + + " bytes via tcp\n" + toString(); + _logger.trace(_traceLevels.networkCat, s); + } + } + catch (java.io.InterruptedIOException ex) + { + continue; + } + catch (java.io.IOException ex) + { + Ice.SocketException se = new Ice.SocketException(); + se.initCause(ex); + throw se; + } + } + } + + public void + read(java.nio.ByteBuffer buf, int timeout) + { + while (buf.hasRemaining()) + { + try + { + int ret = _fd.read(buf); + + /* TODO: Review + if (ret == 0) + { + throw new Ice.ConnectionLostException(); + } + */ + + if (_traceLevels.network >= 3) + { + String s = "received " + ret + " of " + buf.limit() + + " bytes via tcp\n" + toString(); + _logger.trace(_traceLevels.networkCat, s); + } + } + catch (java.io.InterruptedIOException ex) + { + continue; + } + catch (java.io.IOException ex) + { + Ice.SocketException se = new Ice.SocketException(); + se.initCause(ex); + throw se; + } + } + } + + public String + toString() + { + return fdToString(_fd); + } + + // + // Only for use by TcpConnector, TcpAcceptor + // + TcpTransceiver(Instance instance, java.nio.channels.SocketChannel fd) + { + _instance = instance; + _fd = fd; + _traceLevels = instance.traceLevels(); + _logger = instance.logger(); + } + + protected void + finalize() + throws Throwable + { + assert(_fd == null); + super.finalize(); + } + + private Instance _instance; + private java.nio.channels.SocketChannel _fd; + private TraceLevels _traceLevels; + private Ice.Logger _logger; +} |