107 |
|
try { |
108 |
|
q.offer(e); |
109 |
|
if (q.peek() == e) { |
110 |
< |
leader = null; |
110 |
> |
leader = null; |
111 |
|
available.signal(); |
112 |
< |
} |
112 |
> |
} |
113 |
|
return true; |
114 |
|
} finally { |
115 |
|
lock.unlock(); |
177 |
|
E first = q.peek(); |
178 |
|
if (first == null) |
179 |
|
available.await(); |
180 |
< |
else { |
180 |
> |
else { |
181 |
|
long delay = first.getDelay(TimeUnit.NANOSECONDS); |
182 |
< |
if (delay <= 0) |
183 |
< |
return q.poll(); |
184 |
< |
else if (leader != null) |
185 |
< |
available.await(); |
186 |
< |
else { |
187 |
< |
Thread thisThread = Thread.currentThread(); |
188 |
< |
leader = thisThread; |
189 |
< |
try { |
190 |
< |
available.awaitNanos(delay); |
191 |
< |
} finally { |
192 |
< |
if (leader == thisThread) |
193 |
< |
leader = null; |
194 |
< |
} |
182 |
> |
if (delay <= 0) |
183 |
> |
return q.poll(); |
184 |
> |
else if (leader != null) |
185 |
> |
available.await(); |
186 |
> |
else { |
187 |
> |
Thread thisThread = Thread.currentThread(); |
188 |
> |
leader = thisThread; |
189 |
> |
try { |
190 |
> |
available.awaitNanos(delay); |
191 |
> |
} finally { |
192 |
> |
if (leader == thisThread) |
193 |
> |
leader = null; |
194 |
> |
} |
195 |
|
} |
196 |
|
} |
197 |
|
} |
198 |
|
} finally { |
199 |
< |
if (leader == null && q.peek() != null) |
200 |
< |
available.signal(); |
199 |
> |
if (leader == null && q.peek() != null) |
200 |
> |
available.signal(); |
201 |
|
lock.unlock(); |
202 |
|
} |
203 |
|
} |
226 |
|
nanos = available.awaitNanos(nanos); |
227 |
|
} else { |
228 |
|
long delay = first.getDelay(TimeUnit.NANOSECONDS); |
229 |
< |
if (delay <= 0) |
230 |
< |
return q.poll(); |
231 |
< |
if (nanos <= 0) |
232 |
< |
return null; |
233 |
< |
if (nanos < delay || leader != null) |
234 |
< |
nanos = available.awaitNanos(nanos); |
235 |
< |
else { |
236 |
< |
Thread thisThread = Thread.currentThread(); |
237 |
< |
leader = thisThread; |
238 |
< |
try { |
239 |
< |
long timeLeft = available.awaitNanos(delay); |
240 |
< |
nanos -= delay - timeLeft; |
241 |
< |
} finally { |
242 |
< |
if (leader == thisThread) |
243 |
< |
leader = null; |
244 |
< |
} |
245 |
< |
} |
229 |
> |
if (delay <= 0) |
230 |
> |
return q.poll(); |
231 |
> |
if (nanos <= 0) |
232 |
> |
return null; |
233 |
> |
if (nanos < delay || leader != null) |
234 |
> |
nanos = available.awaitNanos(nanos); |
235 |
> |
else { |
236 |
> |
Thread thisThread = Thread.currentThread(); |
237 |
> |
leader = thisThread; |
238 |
> |
try { |
239 |
> |
long timeLeft = available.awaitNanos(delay); |
240 |
> |
nanos -= delay - timeLeft; |
241 |
> |
} finally { |
242 |
> |
if (leader == thisThread) |
243 |
> |
leader = null; |
244 |
> |
} |
245 |
> |
} |
246 |
|
} |
247 |
|
} |
248 |
|
} finally { |
249 |
< |
if (leader == null && q.peek() != null) |
250 |
< |
available.signal(); |
249 |
> |
if (leader == null && q.peek() != null) |
250 |
> |
available.signal(); |
251 |
|
lock.unlock(); |
252 |
|
} |
253 |
|
} |
470 |
|
*/ |
471 |
|
private class Itr implements Iterator<E> { |
472 |
|
final Object[] array; // Array of all elements |
473 |
< |
int cursor; // index of next element to return; |
474 |
< |
int lastRet; // index of last element, or -1 if no such |
473 |
> |
int cursor; // index of next element to return; |
474 |
> |
int lastRet; // index of last element, or -1 if no such |
475 |
|
|
476 |
|
Itr(Object[] array) { |
477 |
|
lastRet = -1; |
482 |
|
return cursor < array.length; |
483 |
|
} |
484 |
|
|
485 |
< |
@SuppressWarnings("unchecked") |
485 |
> |
@SuppressWarnings("unchecked") |
486 |
|
public E next() { |
487 |
|
if (cursor >= array.length) |
488 |
|
throw new NoSuchElementException(); |
492 |
|
|
493 |
|
public void remove() { |
494 |
|
if (lastRet < 0) |
495 |
< |
throw new IllegalStateException(); |
495 |
> |
throw new IllegalStateException(); |
496 |
|
Object x = array[lastRet]; |
497 |
|
lastRet = -1; |
498 |
|
// Traverse underlying queue to find == element, |