summaryrefslogtreecommitdiff
path: root/java/src/IceInternal/BufferManager.java
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/IceInternal/BufferManager.java
parentminor edits (diff)
downloadice-84bf6b61e5535aba4687c67956eec9bffb89c265.tar.bz2
ice-84bf6b61e5535aba4687c67956eec9bffb89c265.tar.xz
ice-84bf6b61e5535aba4687c67956eec9bffb89c265.zip
initial check-in
Diffstat (limited to 'java/src/IceInternal/BufferManager.java')
-rw-r--r--java/src/IceInternal/BufferManager.java113
1 files changed, 113 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;
+}