]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.common/src/org/simantics/db/common/ProcedureBarrier.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db.common / src / org / simantics / db / common / ProcedureBarrier.java
1 package org.simantics.db.common;\r
2 \r
3 import java.util.concurrent.atomic.AtomicInteger;\r
4 \r
5 import org.simantics.db.AsyncReadGraph;\r
6 import org.simantics.db.procedure.AsyncProcedure;\r
7 \r
8 final public class ProcedureBarrier<T> extends AtomicInteger {\r
9 \r
10         private static final long serialVersionUID = -2699547741948233067L;\r
11         \r
12         private volatile Throwable throwable;\r
13         \r
14         public ProcedureBarrier(int initial) {\r
15                 super(initial);\r
16         }\r
17         \r
18         final synchronized public void except(Throwable throwable) {\r
19                 this.throwable = throwable;\r
20         }\r
21         \r
22         final public Throwable getThrowable() {\r
23                 return throwable;\r
24         }\r
25         \r
26         final public void dec(AsyncReadGraph graph, AsyncProcedure<T> procedure, Throwable throwable) {\r
27                 synchronized(this) {\r
28                         this.throwable = throwable;\r
29                 }\r
30                 if(decrementAndGet() == 0) {\r
31                         procedure.exception(graph, throwable);\r
32                 }\r
33         }\r
34 \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
39                 }\r
40         }\r
41         \r
42 }\r