comparison src/EDU/oswego/cs/dl/util/concurrent/SyncList.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: SyncList.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 import java.util.*;
16
17 /**
18 * SyncLists wrap Sync-based control around java.util.Lists.
19 * They support the following additional reader operations over
20 * SyncCollection: hashCode, equals, get, indexOf, lastIndexOf,
21 * subList. They support additional writer operations remove(int),
22 * set(int), add(int), addAll(int). The corresponding listIterators
23 * and are similarly extended.
24 * <p>[<a href="http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html"> Introduction to this package. </a>]
25 * @see SyncCollection
26 **/
27
28
29 public class SyncList extends SyncCollection implements List {
30
31 /**
32 * Create a new SyncList protecting the given collection,
33 * and using the given sync to control both reader and writer methods.
34 * Common, reasonable choices for the sync argument include
35 * Mutex, ReentrantLock, and Semaphores initialized to 1.
36 **/
37 public SyncList(List list, Sync sync) {
38 super (list, sync);
39 }
40
41 /**
42 * Create a new SyncList protecting the given list,
43 * and using the given ReadWriteLock to control reader and writer methods.
44 **/
45 public SyncList(List list, ReadWriteLock rwl) {
46 super (list, rwl.readLock(), rwl.writeLock());
47 }
48
49 /**
50 * Create a new SyncList protecting the given list,
51 * and using the given pair of locks to control reader and writer methods.
52 **/
53 public SyncList(List list, Sync readLock, Sync writeLock) {
54 super(list, readLock, writeLock);
55 }
56
57
58 protected List baseList() {
59 return (List)c_;
60 }
61
62
63 public int hashCode() {
64 boolean wasInterrupted = beforeRead();
65 try {
66 return c_.hashCode();
67 }
68 finally {
69 afterRead(wasInterrupted);
70 }
71 }
72
73 public boolean equals(Object o) {
74 boolean wasInterrupted = beforeRead();
75 try {
76 return c_.equals(o);
77 }
78 finally {
79 afterRead(wasInterrupted);
80 }
81 }
82
83 public Object get(int index) {
84 boolean wasInterrupted = beforeRead();
85 try {
86 return baseList().get(index);
87 }
88 finally {
89 afterRead(wasInterrupted);
90 }
91 }
92
93 public int indexOf(Object o) {
94 boolean wasInterrupted = beforeRead();
95 try {
96 return baseList().indexOf(o);
97 }
98 finally {
99 afterRead(wasInterrupted);
100 }
101 }
102
103
104 public int lastIndexOf(Object o) {
105 boolean wasInterrupted = beforeRead();
106 try {
107 return baseList().lastIndexOf(o);
108 }
109 finally {
110 afterRead(wasInterrupted);
111 }
112 }
113
114
115
116 public List subList(int fromIndex, int toIndex) {
117 boolean wasInterrupted = beforeRead();
118 try {
119 return new SyncList(baseList().subList(fromIndex, toIndex), rd_, wr_);
120 }
121 finally {
122 afterRead(wasInterrupted);
123 }
124 }
125
126 public Object set(int index, Object o) {
127 try {
128 wr_.acquire();
129 try {
130 return baseList().set(index, o);
131 }
132 finally {
133 wr_.release();
134 }
135 }
136 catch (InterruptedException ex) {
137 Thread.currentThread().interrupt();
138 throw new UnsupportedOperationException();
139 }
140 }
141
142
143 public Object remove(int index) {
144 try {
145 wr_.acquire();
146 try {
147 return baseList().remove(index);
148 }
149 finally {
150 wr_.release();
151 }
152 }
153 catch (InterruptedException ex) {
154 Thread.currentThread().interrupt();
155 throw new UnsupportedOperationException();
156 }
157 }
158
159 public void add(int index, Object o) {
160 try {
161 wr_.acquire();
162 try {
163 baseList().add(index, o);
164 }
165 finally {
166 wr_.release();
167 }
168 }
169 catch (InterruptedException ex) {
170 Thread.currentThread().interrupt();
171 throw new UnsupportedOperationException();
172 }
173 }
174
175 public boolean addAll(int index, Collection coll) {
176 try {
177 wr_.acquire();
178 try {
179 return baseList().addAll(index, coll);
180 }
181 finally {
182 wr_.release();
183 }
184 }
185 catch (InterruptedException ex) {
186 Thread.currentThread().interrupt();
187 throw new UnsupportedOperationException();
188 }
189 }
190
191 public ListIterator unprotectedListIterator() {
192 boolean wasInterrupted = beforeRead();
193 try {
194 return baseList().listIterator();
195 }
196 finally {
197 afterRead(wasInterrupted);
198 }
199 }
200
201 public ListIterator listIterator() {
202 boolean wasInterrupted = beforeRead();
203 try {
204 return new SyncCollectionListIterator(baseList().listIterator());
205 }
206 finally {
207 afterRead(wasInterrupted);
208 }
209 }
210
211 public ListIterator unprotectedListIterator(int index) {
212 boolean wasInterrupted = beforeRead();
213 try {
214 return baseList().listIterator(index);
215 }
216 finally {
217 afterRead(wasInterrupted);
218 }
219 }
220
221 public ListIterator listIterator(int index) {
222 boolean wasInterrupted = beforeRead();
223 try {
224 return new SyncCollectionListIterator(baseList().listIterator(index));
225 }
226 finally {
227 afterRead(wasInterrupted);
228 }
229 }
230
231
232 public class SyncCollectionListIterator extends SyncCollectionIterator implements ListIterator {
233
234 SyncCollectionListIterator(Iterator baseIterator) {
235 super(baseIterator);
236 }
237
238 protected ListIterator baseListIterator() {
239 return (ListIterator)(baseIterator_);
240 }
241
242 public boolean hasPrevious() {
243 boolean wasInterrupted = beforeRead();
244 try {
245 return baseListIterator().hasPrevious();
246 }
247 finally {
248 afterRead(wasInterrupted);
249 }
250 }
251
252 public Object previous() {
253 boolean wasInterrupted = beforeRead();
254 try {
255 return baseListIterator().previous();
256 }
257 finally {
258 afterRead(wasInterrupted);
259 }
260 }
261
262 public int nextIndex() {
263 boolean wasInterrupted = beforeRead();
264 try {
265 return baseListIterator().nextIndex();
266 }
267 finally {
268 afterRead(wasInterrupted);
269 }
270 }
271
272
273 public int previousIndex() {
274 boolean wasInterrupted = beforeRead();
275 try {
276 return baseListIterator().previousIndex();
277 }
278 finally {
279 afterRead(wasInterrupted);
280 }
281 }
282
283
284 public void set(Object o) {
285 try {
286 wr_.acquire();
287 try {
288 baseListIterator().set(o);
289 }
290 finally {
291 wr_.release();
292 }
293 }
294 catch (InterruptedException ex) {
295 Thread.currentThread().interrupt();
296 throw new UnsupportedOperationException();
297 }
298 }
299
300 public void add(Object o) {
301 try {
302 wr_.acquire();
303 try {
304 baseListIterator().add(o);
305 }
306 finally {
307 wr_.release();
308 }
309 }
310 catch (InterruptedException ex) {
311 Thread.currentThread().interrupt();
312 throw new UnsupportedOperationException();
313 }
314 }
315
316
317 }
318
319 }
320
321