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;
9 import gnu.trove.map.TObjectIntMap;
10 import gnu.trove.map.hash.TObjectIntHashMap;
12 public class ServiceActivityMonitorImpl implements ServiceActivityMonitor {
14 public static final long REPORTING_PERIOD = 5L;
16 Semaphore sem = new Semaphore(1);
17 AtomicInteger ref = new AtomicInteger();
18 TObjectIntMap<Object> ids = new TObjectIntHashMap<>();
21 public void registerActivity(Object id) {
22 if (ref.getAndIncrement() == 0)
23 sem.acquireUninterruptibly(1);
25 ids.adjustOrPutValue(id, 1, 1);
30 public void unregisterActivity(Object id) {
32 int refs = ids.get(id);
39 if (ref.decrementAndGet() == 0)
44 public void waitForCompletion() throws InterruptedException {
46 if(waitForCompletion(REPORTING_PERIOD, TimeUnit.SECONDS))
49 System.err.println("ServiceActivityMonitorImpl.waitForCompletion: " + ids);
55 public boolean waitForCompletion(long timeout, TimeUnit unit) throws InterruptedException {
56 if(sem.tryAcquire(timeout, unit)) {