-package org.simantics.db.common.service;\r
-\r
-import java.util.concurrent.Semaphore;\r
-import java.util.concurrent.TimeUnit;\r
-import java.util.concurrent.atomic.AtomicInteger;\r
-\r
-import org.simantics.db.service.ServiceActivityMonitor;\r
-\r
-import gnu.trove.map.TObjectIntMap;\r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-\r
-public class ServiceActivityMonitorImpl implements ServiceActivityMonitor {\r
-\r
- public static final long REPORTING_PERIOD = 5L;\r
- \r
- Semaphore sem = new Semaphore(1);\r
- AtomicInteger ref = new AtomicInteger();\r
- TObjectIntMap<Object> ids = new TObjectIntHashMap<>();\r
-\r
- @Override\r
- public void registerActivity(Object id) {\r
- if (ref.getAndIncrement() == 0)\r
- sem.acquireUninterruptibly(1);\r
- synchronized (ids) {\r
- ids.adjustOrPutValue(id, 1, 1);\r
- }\r
- }\r
-\r
- @Override\r
- public void unregisterActivity(Object id) {\r
- synchronized (ids) {\r
- int refs = ids.get(id);\r
- if (refs == 1) {\r
- ids.remove(id);\r
- } else {\r
- ids.put(id, refs-1);\r
- }\r
- }\r
- if (ref.decrementAndGet() == 0)\r
- sem.release();\r
- }\r
-\r
- @Override\r
- public void waitForCompletion() throws InterruptedException {\r
- while(true) {\r
- if(waitForCompletion(REPORTING_PERIOD, TimeUnit.SECONDS))\r
- return;\r
- synchronized (ids) {\r
- System.err.println("ServiceActivityMonitorImpl.waitForCompletion: " + ids);\r
- } \r
- }\r
- }\r
-\r
- @Override\r
- public boolean waitForCompletion(long timeout, TimeUnit unit) throws InterruptedException {\r
- if(sem.tryAcquire(timeout, unit)) {\r
- sem.release();\r
- return true;\r
- }\r
- else\r
- return false;\r
- }\r
-\r
+package org.simantics.db.common.service;
+
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.simantics.db.service.ServiceActivityMonitor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import gnu.trove.map.TObjectIntMap;
+import gnu.trove.map.hash.TObjectIntHashMap;
+
+public class ServiceActivityMonitorImpl implements ServiceActivityMonitor {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ServiceActivityMonitorImpl.class);
+
+ public static final long REPORTING_PERIOD = 5L;
+
+ Semaphore sem = new Semaphore(1);
+ AtomicInteger ref = new AtomicInteger();
+ TObjectIntMap<Object> ids = new TObjectIntHashMap<>();
+
+ @Override
+ public void registerActivity(Object id) {
+ if (ref.getAndIncrement() == 0)
+ sem.acquireUninterruptibly(1);
+ synchronized (ids) {
+ ids.adjustOrPutValue(id, 1, 1);
+ }
+ }
+
+ @Override
+ public void unregisterActivity(Object id) {
+ synchronized (ids) {
+ int refs = ids.get(id);
+ if (refs == 1) {
+ ids.remove(id);
+ } else {
+ ids.put(id, refs-1);
+ }
+ }
+ if (ref.decrementAndGet() == 0)
+ sem.release();
+ }
+
+ @Override
+ public void waitForCompletion() throws InterruptedException {
+ while(true) {
+ if(waitForCompletion(REPORTING_PERIOD, TimeUnit.SECONDS))
+ return;
+ synchronized (ids) {
+ LOGGER.info("waitForCompletion: " + ids);
+ }
+ }
+ }
+
+ @Override
+ public boolean waitForCompletion(long timeout, TimeUnit unit) throws InterruptedException {
+ if(sem.tryAcquire(timeout, unit)) {
+ sem.release();
+ return true;
+ }
+ else
+ return false;
+ }
+