private synchronized void deref() throws E { --refs; if (refs > 0) { return; } R delegateLocal = delegate; delegate = null; // close under lock in case underlying is crappy enough to not // handle multiple concurrent co-existing. type.close(delegateLocal); }
public static <R, E extends Exception> R wrap(final ResourceType<R, E> type, final R delegate) { if (!log.isErrorEnabled()) { // We leave this check in in case this goes haywire in the field. // This way setting the log level for CloseTracking to OFF can // still disable it entirely. return delegate; } final Tracking tracking = new Tracking(type.name()); R wrapped = type.closeWrapper(delegate, () -> { tracking.close(); type.close(delegate); }); destructorReferences.add(new MyReference(wrapped, tracking)); return wrapped; }
public static <R, E extends Exception> R wrap(final ResourceType<R, E> type, final R delegate) { if (!log.isErrorEnabled()) { // We leave this check in in case this goes haywire in the field. // This way setting the log level for CloseTracking to OFF can // still disable it entirely. return delegate; } final Tracking tracking = new Tracking(type.name()); R wrapped = type.closeWrapper(delegate, () -> { tracking.close(); type.close(delegate); }); destructorReferences.add(new MyReference(wrapped, tracking)); return wrapped; }
private synchronized void deref() throws E { --refs; if (refs > 0) { return; } R delegateLocal = delegate; delegate = null; // close under lock in case underlying is crappy enough to not // handle multiple concurrent co-existing. type.close(delegateLocal); }