1 package org.simantics.db.common.service;
3 import java.util.concurrent.Semaphore;
4 import java.util.concurrent.TimeUnit;
5 import java.util.concurrent.atomic.AtomicInteger;
7 import org.simantics.db.service.ServiceActivityMonitor;
8 import org.slf4j.Logger;
9 import org.slf4j.LoggerFactory;
11 import gnu.trove.map.TObjectIntMap;
12 import gnu.trove.map.hash.TObjectIntHashMap;
14 public class ServiceActivityMonitorImpl implements ServiceActivityMonitor {
16 private static final Logger LOGGER = LoggerFactory.getLogger(ServiceActivityMonitorImpl.class);
18 public static final long REPORTING_PERIOD = 5L;
20 Semaphore sem = new Semaphore(1);
21 AtomicInteger ref = new AtomicInteger();
22 TObjectIntMap<Object> ids = new TObjectIntHashMap<>();
25 public void registerActivity(Object id) {
26 if (ref.getAndIncrement() == 0)
27 sem.acquireUninterruptibly(1);
29 ids.adjustOrPutValue(id, 1, 1);
34 public void unregisterActivity(Object id) {
36 int refs = ids.get(id);
43 if (ref.decrementAndGet() == 0)
48 public void waitForCompletion() throws InterruptedException {
50 if(waitForCompletion(REPORTING_PERIOD, TimeUnit.SECONDS))
53 LOGGER.info("waitForCompletion: " + ids);
59 public boolean waitForCompletion(long timeout, TimeUnit unit) throws InterruptedException {
60 if(sem.tryAcquire(timeout, unit)) {