Mercurial > hg > blitz_condensed
comparison src/EDU/oswego/cs/dl/util/concurrent/LayeredSync.java @ 0:3dc0c5604566
Initial checkin of blitz 2.0 fcs - no installer yet.
author | Dan Creswell <dan.creswell@gmail.com> |
---|---|
date | Sat, 21 Mar 2009 11:00:06 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:3dc0c5604566 |
---|---|
1 /* | |
2 File: LayeredSync.java | |
3 | |
4 Originally written by Doug Lea and released into the public domain. | |
5 This may be used for any purposes whatsoever without acknowledgment. | |
6 Thanks for the assistance and support of Sun Microsystems Labs, | |
7 and everyone contributing, testing, and using this code. | |
8 | |
9 History: | |
10 Date Who What | |
11 1Aug1998 dl Create public version | |
12 */ | |
13 | |
14 package EDU.oswego.cs.dl.util.concurrent; | |
15 | |
16 /** | |
17 * A class that can be used to compose Syncs. | |
18 * A LayeredSync object manages two other Sync objects, | |
19 * <em>outer</em> and <em>inner</em>. The acquire operation | |
20 * invokes <em>outer</em>.acquire() followed by <em>inner</em>.acquire(), | |
21 * but backing out of outer (via release) upon an exception in inner. | |
22 * The other methods work similarly. | |
23 * <p> | |
24 * LayeredSyncs can be used to compose arbitrary chains | |
25 * by arranging that either of the managed Syncs be another | |
26 * LayeredSync. | |
27 * | |
28 * <p>[<a href="http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html"> Introduction to this package. </a>] | |
29 **/ | |
30 | |
31 | |
32 public class LayeredSync implements Sync { | |
33 | |
34 protected final Sync outer_; | |
35 protected final Sync inner_; | |
36 | |
37 /** | |
38 * Create a LayeredSync managing the given outer and inner Sync | |
39 * objects | |
40 **/ | |
41 | |
42 public LayeredSync(Sync outer, Sync inner) { | |
43 outer_ = outer; | |
44 inner_ = inner; | |
45 } | |
46 | |
47 public void acquire() throws InterruptedException { | |
48 outer_.acquire(); | |
49 try { | |
50 inner_.acquire(); | |
51 } | |
52 catch (InterruptedException ex) { | |
53 outer_.release(); | |
54 throw ex; | |
55 } | |
56 } | |
57 | |
58 public boolean attempt(long msecs) throws InterruptedException { | |
59 | |
60 long start = (msecs <= 0)? 0 : System.currentTimeMillis(); | |
61 long waitTime = msecs; | |
62 | |
63 if (outer_.attempt(waitTime)) { | |
64 try { | |
65 if (msecs > 0) | |
66 waitTime = msecs - (System.currentTimeMillis() - start); | |
67 if (inner_.attempt(waitTime)) | |
68 return true; | |
69 else { | |
70 outer_.release(); | |
71 return false; | |
72 } | |
73 } | |
74 catch (InterruptedException ex) { | |
75 outer_.release(); | |
76 throw ex; | |
77 } | |
78 } | |
79 else | |
80 return false; | |
81 } | |
82 | |
83 public void release() { | |
84 inner_.release(); | |
85 outer_.release(); | |
86 } | |
87 | |
88 } | |
89 | |
90 |