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/IceInternal/BufferManager.java | |
parent | minor edits (diff) | |
download | ice-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.java | 113 |
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; +} |