com.yahoo.jdisc.refcount.CloseableOnce Maven / Gradle / Ivy
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.jdisc.refcount;
import com.yahoo.jdisc.ResourceReference;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* Ensures that a ResourceReference can only be closed exactly once.
*
* @author baldersheim
*/
abstract class CloseableOnce implements ResourceReference {
private final AtomicBoolean isReleased = new AtomicBoolean(false);
@Override
public final void close() {
final boolean wasReleasedBefore = isReleased.getAndSet(true);
if (wasReleasedBefore) {
final String message = "Reference is already released and can only be released once."
+ " State={ " + getReferences().currentState() + " }";
throw new IllegalStateException(message);
}
onClose();
}
abstract void onClose();
abstract References getReferences();
}