On 10/30/17 1:49 PM, Peter Levart wrote:
...above example lends itself as a use case for the following equivalent alternative using internal low-level API where ZStreamRef becomes the Cleanable itself:
class ZStreamRef extends PhantomCleanable<Object> {
private final LongConsumer end; private volatile long address;
ZStreamRef (Object referent, LongSupplier init, LongConsumer end) { // here the registration MUST happen as 1st thing - enforced by javac super(referent, CleanerFactory.cleaner()); this.end = end; this.address = init.getAsLong(); }
long address() { return address; }
@Override protected void performCleanup() { long addr = address; address = 0; if (addr != 0) { end.accept(addr); } } }
I was thinking something along this line what could ensure the "cleanable" object is allocated before allocating the resources that the cleanable is responsible for clean up. I think it'd be a good RFE to improve the Cleaner API to address the OOM case. Mandy