package org.postgresql.util;
import java.util.Timer;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Level;
import java.util.logging.Logger;
public class SharedTimer {
private static final AtomicInteger timerCount = new AtomicInteger(0);
private static final Logger LOGGER = Logger.getLogger(SharedTimer.class.getName());
private volatile Timer timer = null;
private final AtomicInteger refCount = new AtomicInteger(0);
public SharedTimer() {
}
public int getRefCount() {
return refCount.get();
}
public synchronized Timer getTimer() {
if (timer == null) {
int index = timerCount.incrementAndGet();
final ClassLoader prevContextCL = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(null);
timer = new Timer("PostgreSQL-JDBC-SharedTimer-" + index, true);
} finally {
Thread.currentThread().setContextClassLoader(prevContextCL);
}
}
refCount.incrementAndGet();
return timer;
}
public synchronized void releaseTimer() {
int count = refCount.decrementAndGet();
if (count > 0) {
LOGGER.log(Level.FINEST, "Outstanding references still exist so not closing shared Timer");
} else if (count == 0) {
LOGGER.log(Level.FINEST, "No outstanding references to shared Timer, will cancel and close it");
if (timer != null) {
timer.cancel();
timer = null;
}
} else {
LOGGER.log(Level.WARNING,
"releaseTimer() called too many times; there is probably a bug in the calling code");
refCount.set(0);
}
}
}