1 package org.simantics.db.common;
\r
3 import java.util.concurrent.atomic.AtomicInteger;
\r
5 import org.simantics.db.AsyncReadGraph;
\r
6 import org.simantics.db.procedure.AsyncProcedure;
\r
8 final public class ProcedureBarrier<T> extends AtomicInteger {
\r
10 private static final long serialVersionUID = -2699547741948233067L;
\r
12 private volatile Throwable throwable;
\r
14 public ProcedureBarrier(int initial) {
\r
18 final synchronized public void except(Throwable throwable) {
\r
19 this.throwable = throwable;
\r
22 final public Throwable getThrowable() {
\r
26 final public void dec(AsyncReadGraph graph, AsyncProcedure<T> procedure, Throwable throwable) {
\r
27 synchronized(this) {
\r
28 this.throwable = throwable;
\r
30 if(decrementAndGet() == 0) {
\r
31 procedure.exception(graph, throwable);
\r
35 final public void dec(AsyncReadGraph graph, AsyncProcedure<T> procedure, T result) {
\r
36 if(decrementAndGet() == 0) {
\r
37 if(throwable != null) procedure.exception(graph, throwable);
\r
38 else procedure.execute(graph, result);
\r