src/java.base/share/classes/java/util/zip/ZStreamRef.java

Print this page

        

*** 23,46 **** * questions. */ package java.util.zip; /** ! * A reference to the native zlib's z_stream structure. */ ! class ZStreamRef { ! ! private volatile long address; ! ZStreamRef (long address) { ! this.address = address; } long address() { return address; } ! void clear() { address = 0; } } --- 23,65 ---- * questions. */ package java.util.zip; + import java.util.function.LongConsumer; + import java.util.function.LongSupplier; + import java.lang.ref.Cleaner.Cleanable; + import jdk.internal.ref.CleanerFactory; + /** ! * A reference to the native zlib's z_stream structure. It also ! * serves as the "cleaner" to clean up the native resource when ! * the deflater or infalter is ended, closed or cleaned. */ + class ZStreamRef implements Runnable { ! private LongConsumer end; ! private long address; ! private final Cleanable cleanable; ! ! ZStreamRef (Object owner, LongSupplier addr, LongConsumer end) { ! this.cleanable = CleanerFactory.cleaner().register(owner, this); ! this.end = end; ! this.address = addr.getAsLong(); } long address() { return address; } ! void clean() { ! cleanable.clean(); ! } ! ! public synchronized void run() { ! long addr = address; address = 0; + if (addr != 0) { + end.accept(addr); + } } }