--- /dev/null
+package org.simantics.db.common;\r
+\r
+import java.util.concurrent.atomic.AtomicInteger;\r
+\r
+import org.simantics.db.AsyncReadGraph;\r
+import org.simantics.db.procedure.AsyncProcedure;\r
+\r
+final public class ProcedureBarrier<T> extends AtomicInteger {\r
+\r
+ private static final long serialVersionUID = -2699547741948233067L;\r
+ \r
+ private volatile Throwable throwable;\r
+ \r
+ public ProcedureBarrier(int initial) {\r
+ super(initial);\r
+ }\r
+ \r
+ final synchronized public void except(Throwable throwable) {\r
+ this.throwable = throwable;\r
+ }\r
+ \r
+ final public Throwable getThrowable() {\r
+ return throwable;\r
+ }\r
+ \r
+ final public void dec(AsyncReadGraph graph, AsyncProcedure<T> procedure, Throwable throwable) {\r
+ synchronized(this) {\r
+ this.throwable = throwable;\r
+ }\r
+ if(decrementAndGet() == 0) {\r
+ procedure.exception(graph, throwable);\r
+ }\r
+ }\r
+\r
+ final public void dec(AsyncReadGraph graph, AsyncProcedure<T> procedure, T result) {\r
+ if(decrementAndGet() == 0) {\r
+ if(throwable != null) procedure.exception(graph, throwable);\r
+ else procedure.execute(graph, result);\r
+ }\r
+ }\r
+ \r
+}\r