1 package org.simantics.db.common.service;
\r
3 import java.util.concurrent.Semaphore;
\r
4 import java.util.concurrent.TimeUnit;
\r
5 import java.util.concurrent.atomic.AtomicInteger;
\r
7 import org.simantics.db.service.ServiceActivityMonitor;
\r
9 import gnu.trove.map.TObjectIntMap;
\r
10 import gnu.trove.map.hash.TObjectIntHashMap;
\r
12 public class ServiceActivityMonitorImpl implements ServiceActivityMonitor {
\r
14 public static final long REPORTING_PERIOD = 5L;
\r
16 Semaphore sem = new Semaphore(1);
\r
17 AtomicInteger ref = new AtomicInteger();
\r
18 TObjectIntMap<Object> ids = new TObjectIntHashMap<>();
\r
21 public void registerActivity(Object id) {
\r
22 if (ref.getAndIncrement() == 0)
\r
23 sem.acquireUninterruptibly(1);
\r
24 synchronized (ids) {
\r
25 ids.adjustOrPutValue(id, 1, 1);
\r
30 public void unregisterActivity(Object id) {
\r
31 synchronized (ids) {
\r
32 int refs = ids.get(id);
\r
36 ids.put(id, refs-1);
\r
39 if (ref.decrementAndGet() == 0)
\r
44 public void waitForCompletion() throws InterruptedException {
\r
46 if(waitForCompletion(REPORTING_PERIOD, TimeUnit.SECONDS))
\r
48 synchronized (ids) {
\r
49 System.err.println("ServiceActivityMonitorImpl.waitForCompletion: " + ids);
\r
55 public boolean waitForCompletion(long timeout, TimeUnit unit) throws InterruptedException {
\r
56 if(sem.tryAcquire(timeout, unit)) {
\r