< prev index next >

src/java.base/share/classes/sun/nio/ch/Util.java

Print this page

        

@@ -232,10 +232,36 @@
             return ByteBuffer.allocateDirect(size);
         }
     }
 
     /**
+     * Returns a temporary buffer of at least the given size and
+     * aligned to the alignment
+     */
+    public static ByteBuffer getTemporaryAlignedDirectBuffer(int size, int alignment) {
+        if (isBufferTooLarge(size)) {
+            return ByteBuffer.allocateDirect(size + alignment - 1).alignedSlice(alignment); 
+        }
+
+        BufferCache cache = bufferCache.get();
+        ByteBuffer buf = cache.get(size);
+        if (buf != null) {
+            if (buf instanceof DirectBuffer) {
+                if (buf.alignmentOffset(0, alignment) == 0) {
+                    return buf;
+                }
+            }
+        } else {
+            if (!cache.isEmpty()) {
+                buf = cache.removeFirst();
+                free(buf);
+            }
+        }
+        return ByteBuffer.allocateDirect(size + alignment - 1).alignedSlice(alignment);
+    }
+
+    /**
      * Releases a temporary buffer by returning to the cache or freeing it.
      */
     public static void releaseTemporaryDirectBuffer(ByteBuffer buf) {
         offerFirstTemporaryDirectBuffer(buf);
     }
< prev index next >