summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
authorMark Spruiell <mes@zeroc.com>2001-11-29 20:30:32 +0000
committerMark Spruiell <mes@zeroc.com>2001-11-29 20:30:32 +0000
commit84bf6b61e5535aba4687c67956eec9bffb89c265 (patch)
treecd7623ffb2f22b52a960c7519195a069e24c9b6c /java/src
parentminor edits (diff)
downloadice-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.java113
-rw-r--r--java/src/IceInternal/TcpConnector.java58
-rw-r--r--java/src/IceInternal/TcpTransceiver.java176
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;
+}