< prev index next >

src/java.base/share/classes/java/nio/Direct-X-Buffer.java.template

Print this page

        

*** 28,38 **** package java.nio; import java.io.FileDescriptor; import jdk.internal.misc.Unsafe; import jdk.internal.misc.VM; ! import jdk.internal.ref.Cleaner; import sun.nio.ch.DirectBuffer; class Direct$Type$Buffer$RW$$BO$ #if[rw] --- 28,39 ---- package java.nio; import java.io.FileDescriptor; import jdk.internal.misc.Unsafe; import jdk.internal.misc.VM; ! import java.lang.ref.Cleaner; ! import jdk.internal.ref.CleanerFactory; import sun.nio.ch.DirectBuffer; class Direct$Type$Buffer$RW$$BO$ #if[rw]
*** 67,76 **** --- 68,107 ---- return att; } #if[byte] + private static class Allocator + implements Supplier<Long> + { + private static final Unsafe unsafe = Unsafe.getUnsafe(); + + private final long size; + private final int capacity; + + Allocator(long size, int capacity) { + this.size = size; + this.capacity = capacity; + } + + @Override + public Long get() { + if (!Bits.tryReserveMemory(size, capacity)) { + return null; + } + long address; + try { + address = unsafe.allocateMemory(size); + } catch (OutOfMemoryError x) { + Bits.unreserveMemory(size, capacity); + return null; + } + unsafe.setMemory(address, size, (byte) 0); + return address; + } + } + private static class Deallocator implements Runnable { private static Unsafe unsafe = Unsafe.getUnsafe();
*** 96,112 **** Bits.unreserveMemory(size, capacity); } } ! private final Cleaner cleaner; ! public Cleaner cleaner() { return cleaner; } #else[byte] ! public Cleaner cleaner() { return null; } #end[byte] #end[rw] --- 127,143 ---- Bits.unreserveMemory(size, capacity); } } ! private final Cleaner.Cleanable cleaner; ! public Cleaner.Cleanable cleaner() { return cleaner; } #else[byte] ! public Cleaner.Cleanable cleaner() { return null; } #end[byte] #end[rw]
*** 118,144 **** #if[rw] super(-1, 0, cap, cap); boolean pa = VM.isDirectMemoryPageAligned(); int ps = Bits.pageSize(); long size = Math.max(1L, (long)cap + (pa ? ps : 0)); - Bits.reserveMemory(size, cap); ! long base = 0; ! try { ! base = unsafe.allocateMemory(size); ! } catch (OutOfMemoryError x) { ! Bits.unreserveMemory(size, cap); ! throw x; } ! unsafe.setMemory(base, size, (byte) 0); if (pa && (base % ps != 0)) { // Round up to page boundary address = base + ps - (base & (ps - 1)); } else { address = base; } ! cleaner = Cleaner.create(this, new Deallocator(base, size, cap)); att = null; #else[rw] super(cap); #end[rw] } --- 149,171 ---- #if[rw] super(-1, 0, cap, cap); boolean pa = VM.isDirectMemoryPageAligned(); int ps = Bits.pageSize(); long size = Math.max(1L, (long)cap + (pa ? ps : 0)); ! Long base = CleanerFactory.dbbCleaner().retryWhileHelpingClean(new Allocator(size, cap)); ! if (base == null) { ! throw new OutOfMemoryError("Direct buffer memory"); } ! if (pa && (base % ps != 0)) { // Round up to page boundary address = base + ps - (base & (ps - 1)); } else { address = base; } ! cleaner = CleanerFactory.dbbCleaner().register(this, new Deallocator(base, size, cap)); att = null; #else[rw] super(cap); #end[rw] }
*** 174,184 **** Runnable unmapper) { #if[rw] super(-1, 0, cap, cap, fd); address = addr; ! cleaner = Cleaner.create(this, unmapper); att = null; #else[rw] super(cap, addr, fd, unmapper); #end[rw] } --- 201,213 ---- Runnable unmapper) { #if[rw] super(-1, 0, cap, cap, fd); address = addr; ! cleaner = (unmapper == null) ! ? null ! : CleanerFactory.dbbCleaner().register(this, unmapper); att = null; #else[rw] super(cap, addr, fd, unmapper); #end[rw] }
< prev index next >