OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libjava/] [classpath/] [external/] [jsr166/] [java/] [util/] [concurrent/] [locks/] [AbstractQueuedLongSynchronizer.java] - Blame information for rev 768

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 768 jeremybenn
/*
2
 * Written by Doug Lea with assistance from members of JCP JSR-166
3
 * Expert Group and released to the public domain, as explained at
4
 * http://creativecommons.org/licenses/publicdomain
5
 */
6
 
7
package java.util.concurrent.locks;
8
import java.util.*;
9
import java.util.concurrent.*;
10
import java.util.concurrent.atomic.*;
11
import sun.misc.Unsafe;
12
 
13
/**
14
 * A version of {@link AbstractQueuedSynchronizer} in
15
 * which synchronization state is maintained as a <tt>long</tt>.
16
 * This class has exactly the same structure, properties, and methods
17
 * as <tt>AbstractQueuedSynchronizer</tt> with the exception
18
 * that all state-related parameters and results are defined
19
 * as <tt>long</tt> rather than <tt>int</tt>. This class
20
 * may be useful when creating synchronizers such as
21
 * multilevel locks and barriers that require
22
 * 64 bits of state.
23
 *
24
 * <p>See {@link AbstractQueuedSynchronizer} for usage
25
 * notes and examples.
26
 *
27
 * @since 1.6
28
 * @author Doug Lea
29
 */
30
public abstract class AbstractQueuedLongSynchronizer
31
    extends AbstractOwnableSynchronizer
32
    implements java.io.Serializable {
33
 
34
    private static final long serialVersionUID = 7373984972572414692L;
35
 
36
    /*
37
      To keep sources in sync, the remainder of this source file is
38
      exactly cloned from AbstractQueuedSynchronizer, replacing class
39
      name and changing ints related with sync state to longs. Please
40
      keep it that way.
41
    */
42
 
43
    /**
44
     * Creates a new <tt>AbstractQueuedLongSynchronizer</tt> instance
45
     * with initial synchronization state of zero.
46
     */
47
    protected AbstractQueuedLongSynchronizer() { }
48
 
49
    /**
50
     * Wait queue node class.
51
     *
52
     * <p>The wait queue is a variant of a "CLH" (Craig, Landin, and
53
     * Hagersten) lock queue. CLH locks are normally used for
54
     * spinlocks.  We instead use them for blocking synchronizers, but
55
     * use the same basic tactic of holding some of the control
56
     * information about a thread in the predecessor of its node.  A
57
     * "status" field in each node keeps track of whether a thread
58
     * should block.  A node is signalled when its predecessor
59
     * releases.  Each node of the queue otherwise serves as a
60
     * specific-notification-style monitor holding a single waiting
61
     * thread. The status field does NOT control whether threads are
62
     * granted locks etc though.  A thread may try to acquire if it is
63
     * first in the queue. But being first does not guarantee success;
64
     * it only gives the right to contend.  So the currently released
65
     * contender thread may need to rewait.
66
     *
67
     * <p>To enqueue into a CLH lock, you atomically splice it in as new
68
     * tail. To dequeue, you just set the head field.
69
     * <pre>
70
     *      +------+  prev +-----+       +-----+
71
     * head |      | <---- |     | <---- |     |  tail
72
     *      +------+       +-----+       +-----+
73
     * </pre>
74
     *
75
     * <p>Insertion into a CLH queue requires only a single atomic
76
     * operation on "tail", so there is a simple atomic point of
77
     * demarcation from unqueued to queued. Similarly, dequeing
78
     * involves only updating the "head". However, it takes a bit
79
     * more work for nodes to determine who their successors are,
80
     * in part to deal with possible cancellation due to timeouts
81
     * and interrupts.
82
     *
83
     * <p>The "prev" links (not used in original CLH locks), are mainly
84
     * needed to handle cancellation. If a node is cancelled, its
85
     * successor is (normally) relinked to a non-cancelled
86
     * predecessor. For explanation of similar mechanics in the case
87
     * of spin locks, see the papers by Scott and Scherer at
88
     * http://www.cs.rochester.edu/u/scott/synchronization/
89
     *
90
     * <p>We also use "next" links to implement blocking mechanics.
91
     * The thread id for each node is kept in its own node, so a
92
     * predecessor signals the next node to wake up by traversing
93
     * next link to determine which thread it is.  Determination of
94
     * successor must avoid races with newly queued nodes to set
95
     * the "next" fields of their predecessors.  This is solved
96
     * when necessary by checking backwards from the atomically
97
     * updated "tail" when a node's successor appears to be null.
98
     * (Or, said differently, the next-links are an optimization
99
     * so that we don't usually need a backward scan.)
100
     *
101
     * <p>Cancellation introduces some conservatism to the basic
102
     * algorithms.  Since we must poll for cancellation of other
103
     * nodes, we can miss noticing whether a cancelled node is
104
     * ahead or behind us. This is dealt with by always unparking
105
     * successors upon cancellation, allowing them to stabilize on
106
     * a new predecessor.
107
     *
108
     * <p>CLH queues need a dummy header node to get started. But
109
     * we don't create them on construction, because it would be wasted
110
     * effort if there is never contention. Instead, the node
111
     * is constructed and head and tail pointers are set upon first
112
     * contention.
113
     *
114
     * <p>Threads waiting on Conditions use the same nodes, but
115
     * use an additional link. Conditions only need to link nodes
116
     * in simple (non-concurrent) linked queues because they are
117
     * only accessed when exclusively held.  Upon await, a node is
118
     * inserted into a condition queue.  Upon signal, the node is
119
     * transferred to the main queue.  A special value of status
120
     * field is used to mark which queue a node is on.
121
     *
122
     * <p>Thanks go to Dave Dice, Mark Moir, Victor Luchangco, Bill
123
     * Scherer and Michael Scott, along with members of JSR-166
124
     * expert group, for helpful ideas, discussions, and critiques
125
     * on the design of this class.
126
     */
127
    static final class Node {
128
        /** waitStatus value to indicate thread has cancelled */
129
        static final int CANCELLED =  1;
130
        /** waitStatus value to indicate successor's thread needs unparking */
131
        static final int SIGNAL    = -1;
132
        /** waitStatus value to indicate thread is waiting on condition */
133
        static final int CONDITION = -2;
134
        /** Marker to indicate a node is waiting in shared mode */
135
        static final Node SHARED = new Node();
136
        /** Marker to indicate a node is waiting in exclusive mode */
137
        static final Node EXCLUSIVE = null;
138
 
139
        /**
140
         * Status field, taking on only the values:
141
         *   SIGNAL:     The successor of this node is (or will soon be)
142
         *               blocked (via park), so the current node must
143
         *               unpark its successor when it releases or
144
         *               cancels. To avoid races, acquire methods must
145
         *               first indicate they need a signal,
146
         *               then retry the atomic acquire, and then,
147
         *               on failure, block.
148
         *   CANCELLED:  This node is cancelled due to timeout or interrupt.
149
         *               Nodes never leave this state. In particular,
150
         *               a thread with cancelled node never again blocks.
151
         *   CONDITION:  This node is currently on a condition queue.
152
         *               It will not be used as a sync queue node until
153
         *               transferred. (Use of this value here
154
         *               has nothing to do with the other uses
155
         *               of the field, but simplifies mechanics.)
156
         *   0:          None of the above
157
         *
158
         * The values are arranged numerically to simplify use.
159
         * Non-negative values mean that a node doesn't need to
160
         * signal. So, most code doesn't need to check for particular
161
         * values, just for sign.
162
         *
163
         * The field is initialized to 0 for normal sync nodes, and
164
         * CONDITION for condition nodes.  It is modified only using
165
         * CAS.
166
         */
167
        volatile int waitStatus;
168
 
169
        /**
170
         * Link to predecessor node that current node/thread relies on
171
         * for checking waitStatus. Assigned during enqueing, and nulled
172
         * out (for sake of GC) only upon dequeuing.  Also, upon
173
         * cancellation of a predecessor, we short-circuit while
174
         * finding a non-cancelled one, which will always exist
175
         * because the head node is never cancelled: A node becomes
176
         * head only as a result of successful acquire. A
177
         * cancelled thread never succeeds in acquiring, and a thread only
178
         * cancels itself, not any other node.
179
         */
180
        volatile Node prev;
181
 
182
        /**
183
         * Link to the successor node that the current node/thread
184
         * unparks upon release. Assigned once during enqueuing, and
185
         * nulled out (for sake of GC) when no longer needed.  Upon
186
         * cancellation, we cannot adjust this field, but can notice
187
         * status and bypass the node if cancelled.  The enq operation
188
         * does not assign next field of a predecessor until after
189
         * attachment, so seeing a null next field does not
190
         * necessarily mean that node is at end of queue. However, if
191
         * a next field appears to be null, we can scan prev's from
192
         * the tail to double-check.
193
         */
194
        volatile Node next;
195
 
196
        /**
197
         * The thread that enqueued this node.  Initialized on
198
         * construction and nulled out after use.
199
         */
200
        volatile Thread thread;
201
 
202
        /**
203
         * Link to next node waiting on condition, or the special
204
         * value SHARED.  Because condition queues are accessed only
205
         * when holding in exclusive mode, we just need a simple
206
         * linked queue to hold nodes while they are waiting on
207
         * conditions. They are then transferred to the queue to
208
         * re-acquire. And because conditions can only be exclusive,
209
         * we save a field by using special value to indicate shared
210
         * mode.
211
         */
212
        Node nextWaiter;
213
 
214
        /**
215
         * Returns true if node is waiting in shared mode
216
         */
217
        final boolean isShared() {
218
            return nextWaiter == SHARED;
219
        }
220
 
221
        /**
222
         * Returns previous node, or throws NullPointerException if
223
         * null.  Use when predecessor cannot be null.
224
         * @return the predecessor of this node
225
         */
226
        final Node predecessor() throws NullPointerException {
227
            Node p = prev;
228
            if (p == null)
229
                throw new NullPointerException();
230
            else
231
                return p;
232
        }
233
 
234
        Node() {    // Used to establish initial head or SHARED marker
235
        }
236
 
237
        Node(Thread thread, Node mode) {     // Used by addWaiter
238
            this.nextWaiter = mode;
239
            this.thread = thread;
240
        }
241
 
242
        Node(Thread thread, int waitStatus) { // Used by Condition
243
            this.waitStatus = waitStatus;
244
            this.thread = thread;
245
        }
246
    }
247
 
248
    /**
249
     * Head of the wait queue, lazily initialized.  Except for
250
     * initialization, it is modified only via method setHead.  Note:
251
     * If head exists, its waitStatus is guaranteed not to be
252
     * CANCELLED.
253
     */
254
    private transient volatile Node head;
255
 
256
    /**
257
     * Tail of the wait queue, lazily initialized.  Modified only via
258
     * method enq to add new wait node.
259
     */
260
    private transient volatile Node tail;
261
 
262
    /**
263
     * The synchronization state.
264
     */
265
    private volatile long state;
266
 
267
    /**
268
     * Returns the current value of synchronization state.
269
     * This operation has memory semantics of a <tt>volatile</tt> read.
270
     * @return current state value
271
     */
272
    protected final long getState() {
273
        return state;
274
    }
275
 
276
    /**
277
     * Sets the value of synchronization state.
278
     * This operation has memory semantics of a <tt>volatile</tt> write.
279
     * @param newState the new state value
280
     */
281
    protected final void setState(long newState) {
282
        state = newState;
283
    }
284
 
285
    /**
286
     * Atomically sets synchronization state to the given updated
287
     * value if the current state value equals the expected value.
288
     * This operation has memory semantics of a <tt>volatile</tt> read
289
     * and write.
290
     *
291
     * @param expect the expected value
292
     * @param update the new value
293
     * @return true if successful. False return indicates that the actual
294
     *         value was not equal to the expected value.
295
     */
296
    protected final boolean compareAndSetState(long expect, long update) {
297
        // See below for intrinsics setup to support this
298
        return unsafe.compareAndSwapLong(this, stateOffset, expect, update);
299
    }
300
 
301
    // Queuing utilities
302
 
303
    /**
304
     * The number of nanoseconds for which it is faster to spin
305
     * rather than to use timed park. A rough estimate suffices
306
     * to improve responsiveness with very short timeouts.
307
     */
308
    static final long spinForTimeoutThreshold = 1000L;
309
 
310
    /**
311
     * Inserts node into queue, initializing if necessary. See picture above.
312
     * @param node the node to insert
313
     * @return node's predecessor
314
     */
315
    private Node enq(final Node node) {
316
        for (;;) {
317
            Node t = tail;
318
            if (t == null) { // Must initialize
319
                Node h = new Node(); // Dummy header
320
                h.next = node;
321
                node.prev = h;
322
                if (compareAndSetHead(h)) {
323
                    tail = node;
324
                    return h;
325
                }
326
            }
327
            else {
328
                node.prev = t;
329
                if (compareAndSetTail(t, node)) {
330
                    t.next = node;
331
                    return t;
332
                }
333
            }
334
        }
335
    }
336
 
337
    /**
338
     * Creates and enqueues node for given thread and mode.
339
     *
340
     * @param current the thread
341
     * @param mode Node.EXCLUSIVE for exclusive, Node.SHARED for shared
342
     * @return the new node
343
     */
344
    private Node addWaiter(Node mode) {
345
        Node node = new Node(Thread.currentThread(), mode);
346
        // Try the fast path of enq; backup to full enq on failure
347
        Node pred = tail;
348
        if (pred != null) {
349
            node.prev = pred;
350
            if (compareAndSetTail(pred, node)) {
351
                pred.next = node;
352
                return node;
353
            }
354
        }
355
        enq(node);
356
        return node;
357
    }
358
 
359
    /**
360
     * Sets head of queue to be node, thus dequeuing. Called only by
361
     * acquire methods.  Also nulls out unused fields for sake of GC
362
     * and to suppress unnecessary signals and traversals.
363
     *
364
     * @param node the node
365
     */
366
    private void setHead(Node node) {
367
        head = node;
368
        node.thread = null;
369
        node.prev = null;
370
    }
371
 
372
    /**
373
     * Wakes up node's successor, if one exists.
374
     *
375
     * @param node the node
376
     */
377
    private void unparkSuccessor(Node node) {
378
        /*
379
         * Try to clear status in anticipation of signalling.  It is
380
         * OK if this fails or if status is changed by waiting thread.
381
         */
382
        compareAndSetWaitStatus(node, Node.SIGNAL, 0);
383
 
384
        /*
385
         * Thread to unpark is held in successor, which is normally
386
         * just the next node.  But if cancelled or apparently null,
387
         * traverse backwards from tail to find the actual
388
         * non-cancelled successor.
389
         */
390
        Node s = node.next;
391
        if (s == null || s.waitStatus > 0) {
392
            s = null;
393
            for (Node t = tail; t != null && t != node; t = t.prev)
394
                if (t.waitStatus <= 0)
395
                    s = t;
396
        }
397
        if (s != null)
398
            LockSupport.unpark(s.thread);
399
    }
400
 
401
    /**
402
     * Sets head of queue, and checks if successor may be waiting
403
     * in shared mode, if so propagating if propagate > 0.
404
     *
405
     * @param pred the node holding waitStatus for node
406
     * @param node the node
407
     * @param propagate the return value from a tryAcquireShared
408
     */
409
    private void setHeadAndPropagate(Node node, long propagate) {
410
        setHead(node);
411
        if (propagate > 0 && node.waitStatus != 0) {
412
            /*
413
             * Don't bother fully figuring out successor.  If it
414
             * looks null, call unparkSuccessor anyway to be safe.
415
             */
416
            Node s = node.next;
417
            if (s == null || s.isShared())
418
                unparkSuccessor(node);
419
        }
420
    }
421
 
422
    // Utilities for various versions of acquire
423
 
424
    /**
425
     * Cancels an ongoing attempt to acquire.
426
     *
427
     * @param node the node
428
     */
429
    private void cancelAcquire(Node node) {
430
        if (node != null) { // Ignore if node doesn't exist
431
            node.thread = null;
432
            // Can use unconditional write instead of CAS here
433
            node.waitStatus = Node.CANCELLED;
434
            unparkSuccessor(node);
435
        }
436
    }
437
 
438
    /**
439
     * Checks and updates status for a node that failed to acquire.
440
     * Returns true if thread should block. This is the main signal
441
     * control in all acquire loops.  Requires that pred == node.prev
442
     *
443
     * @param pred node's predecessor holding status
444
     * @param node the node
445
     * @return {@code true} if thread should block
446
     */
447
    private static boolean shouldParkAfterFailedAcquire(Node pred, Node node) {
448
        int s = pred.waitStatus;
449
        if (s < 0)
450
            /*
451
             * This node has already set status asking a release
452
             * to signal it, so it can safely park
453
             */
454
            return true;
455
        if (s > 0)
456
            /*
457
             * Predecessor was cancelled. Move up to its predecessor
458
             * and indicate retry.
459
             */
460
            node.prev = pred.prev;
461
        else
462
            /*
463
             * Indicate that we need a signal, but don't park yet. Caller
464
             * will need to retry to make sure it cannot acquire before
465
             * parking.
466
             */
467
            compareAndSetWaitStatus(pred, 0, Node.SIGNAL);
468
        return false;
469
    }
470
 
471
    /**
472
     * Convenience method to interrupt current thread.
473
     */
474
    private static void selfInterrupt() {
475
        Thread.currentThread().interrupt();
476
    }
477
 
478
    /**
479
     * Convenience method to park and then check if interrupted
480
     *
481
     * @return {@code true} if interrupted
482
     */
483
    private final boolean parkAndCheckInterrupt() {
484
        LockSupport.park(this);
485
        return Thread.interrupted();
486
    }
487
 
488
    /*
489
     * Various flavors of acquire, varying in exclusive/shared and
490
     * control modes.  Each is mostly the same, but annoyingly
491
     * different.  Only a little bit of factoring is possible due to
492
     * interactions of exception mechanics (including ensuring that we
493
     * cancel if tryAcquire throws exception) and other control, at
494
     * least not without hurting performance too much.
495
     */
496
 
497
    /**
498
     * Acquires in exclusive uninterruptible mode for thread already in
499
     * queue. Used by condition wait methods as well as acquire.
500
     *
501
     * @param node the node
502
     * @param arg the acquire argument
503
     * @return {@code true} if interrupted while waiting
504
     */
505
    final boolean acquireQueued(final Node node, long arg) {
506
        try {
507
            boolean interrupted = false;
508
            for (;;) {
509
                final Node p = node.predecessor();
510
                if (p == head && tryAcquire(arg)) {
511
                    setHead(node);
512
                    p.next = null; // help GC
513
                    return interrupted;
514
                }
515
                if (shouldParkAfterFailedAcquire(p, node) &&
516
                    parkAndCheckInterrupt())
517
                    interrupted = true;
518
            }
519
        } catch (RuntimeException ex) {
520
            cancelAcquire(node);
521
            throw ex;
522
        }
523
    }
524
 
525
    /**
526
     * Acquires in exclusive interruptible mode.
527
     * @param arg the acquire argument
528
     */
529
    private void doAcquireInterruptibly(long arg)
530
        throws InterruptedException {
531
        final Node node = addWaiter(Node.EXCLUSIVE);
532
        try {
533
            for (;;) {
534
                final Node p = node.predecessor();
535
                if (p == head && tryAcquire(arg)) {
536
                    setHead(node);
537
                    p.next = null; // help GC
538
                    return;
539
                }
540
                if (shouldParkAfterFailedAcquire(p, node) &&
541
                    parkAndCheckInterrupt())
542
                    break;
543
            }
544
        } catch (RuntimeException ex) {
545
            cancelAcquire(node);
546
            throw ex;
547
        }
548
        // Arrive here only if interrupted
549
        cancelAcquire(node);
550
        throw new InterruptedException();
551
    }
552
 
553
    /**
554
     * Acquires in exclusive timed mode.
555
     *
556
     * @param arg the acquire argument
557
     * @param nanosTimeout max wait time
558
     * @return {@code true} if acquired
559
     */
560
    private boolean doAcquireNanos(long arg, long nanosTimeout)
561
        throws InterruptedException {
562
        long lastTime = System.nanoTime();
563
        final Node node = addWaiter(Node.EXCLUSIVE);
564
        try {
565
            for (;;) {
566
                final Node p = node.predecessor();
567
                if (p == head && tryAcquire(arg)) {
568
                    setHead(node);
569
                    p.next = null; // help GC
570
                    return true;
571
                }
572
                if (nanosTimeout <= 0) {
573
                    cancelAcquire(node);
574
                    return false;
575
                }
576
                if (nanosTimeout > spinForTimeoutThreshold &&
577
                    shouldParkAfterFailedAcquire(p, node))
578
                    LockSupport.parkNanos(this, nanosTimeout);
579
                long now = System.nanoTime();
580
                nanosTimeout -= now - lastTime;
581
                lastTime = now;
582
                if (Thread.interrupted())
583
                    break;
584
            }
585
        } catch (RuntimeException ex) {
586
            cancelAcquire(node);
587
            throw ex;
588
        }
589
        // Arrive here only if interrupted
590
        cancelAcquire(node);
591
        throw new InterruptedException();
592
    }
593
 
594
    /**
595
     * Acquires in shared uninterruptible mode.
596
     * @param arg the acquire argument
597
     */
598
    private void doAcquireShared(long arg) {
599
        final Node node = addWaiter(Node.SHARED);
600
        try {
601
            boolean interrupted = false;
602
            for (;;) {
603
                final Node p = node.predecessor();
604
                if (p == head) {
605
                    long r = tryAcquireShared(arg);
606
                    if (r >= 0) {
607
                        setHeadAndPropagate(node, r);
608
                        p.next = null; // help GC
609
                        if (interrupted)
610
                            selfInterrupt();
611
                        return;
612
                    }
613
                }
614
                if (shouldParkAfterFailedAcquire(p, node) &&
615
                    parkAndCheckInterrupt())
616
                    interrupted = true;
617
            }
618
        } catch (RuntimeException ex) {
619
            cancelAcquire(node);
620
            throw ex;
621
        }
622
    }
623
 
624
    /**
625
     * Acquires in shared interruptible mode.
626
     * @param arg the acquire argument
627
     */
628
    private void doAcquireSharedInterruptibly(long arg)
629
        throws InterruptedException {
630
        final Node node = addWaiter(Node.SHARED);
631
        try {
632
            for (;;) {
633
                final Node p = node.predecessor();
634
                if (p == head) {
635
                    long r = tryAcquireShared(arg);
636
                    if (r >= 0) {
637
                        setHeadAndPropagate(node, r);
638
                        p.next = null; // help GC
639
                        return;
640
                    }
641
                }
642
                if (shouldParkAfterFailedAcquire(p, node) &&
643
                    parkAndCheckInterrupt())
644
                    break;
645
            }
646
        } catch (RuntimeException ex) {
647
            cancelAcquire(node);
648
            throw ex;
649
        }
650
        // Arrive here only if interrupted
651
        cancelAcquire(node);
652
        throw new InterruptedException();
653
    }
654
 
655
    /**
656
     * Acquires in shared timed mode.
657
     *
658
     * @param arg the acquire argument
659
     * @param nanosTimeout max wait time
660
     * @return {@code true} if acquired
661
     */
662
    private boolean doAcquireSharedNanos(long arg, long nanosTimeout)
663
        throws InterruptedException {
664
 
665
        long lastTime = System.nanoTime();
666
        final Node node = addWaiter(Node.SHARED);
667
        try {
668
            for (;;) {
669
                final Node p = node.predecessor();
670
                if (p == head) {
671
                    long r = tryAcquireShared(arg);
672
                    if (r >= 0) {
673
                        setHeadAndPropagate(node, r);
674
                        p.next = null; // help GC
675
                        return true;
676
                    }
677
                }
678
                if (nanosTimeout <= 0) {
679
                    cancelAcquire(node);
680
                    return false;
681
                }
682
                if (nanosTimeout > spinForTimeoutThreshold &&
683
                    shouldParkAfterFailedAcquire(p, node))
684
                    LockSupport.parkNanos(this, nanosTimeout);
685
                long now = System.nanoTime();
686
                nanosTimeout -= now - lastTime;
687
                lastTime = now;
688
                if (Thread.interrupted())
689
                    break;
690
            }
691
        } catch (RuntimeException ex) {
692
            cancelAcquire(node);
693
            throw ex;
694
        }
695
        // Arrive here only if interrupted
696
        cancelAcquire(node);
697
        throw new InterruptedException();
698
    }
699
 
700
    // Main exported methods
701
 
702
    /**
703
     * Attempts to acquire in exclusive mode. This method should query
704
     * if the state of the object permits it to be acquired in the
705
     * exclusive mode, and if so to acquire it.
706
     *
707
     * <p>This method is always invoked by the thread performing
708
     * acquire.  If this method reports failure, the acquire method
709
     * may queue the thread, if it is not already queued, until it is
710
     * signalled by a release from some other thread. This can be used
711
     * to implement method {@link Lock#tryLock()}.
712
     *
713
     * <p>The default
714
     * implementation throws {@link UnsupportedOperationException}.
715
     *
716
     * @param arg the acquire argument. This value is always the one
717
     *        passed to an acquire method, or is the value saved on entry
718
     *        to a condition wait.  The value is otherwise uninterpreted
719
     *        and can represent anything you like.
720
     * @return {@code true} if successful. Upon success, this object has
721
     *         been acquired.
722
     * @throws IllegalMonitorStateException if acquiring would place this
723
     *         synchronizer in an illegal state. This exception must be
724
     *         thrown in a consistent fashion for synchronization to work
725
     *         correctly.
726
     * @throws UnsupportedOperationException if exclusive mode is not supported
727
     */
728
    protected boolean tryAcquire(long arg) {
729
        throw new UnsupportedOperationException();
730
    }
731
 
732
    /**
733
     * Attempts to set the state to reflect a release in exclusive
734
     * mode.
735
     *
736
     * <p>This method is always invoked by the thread performing release.
737
     *
738
     * <p>The default implementation throws
739
     * {@link UnsupportedOperationException}.
740
     *
741
     * @param arg the release argument. This value is always the one
742
     *        passed to a release method, or the current state value upon
743
     *        entry to a condition wait.  The value is otherwise
744
     *        uninterpreted and can represent anything you like.
745
     * @return {@code true} if this object is now in a fully released
746
     *         state, so that any waiting threads may attempt to acquire;
747
     *         and {@code false} otherwise.
748
     * @throws IllegalMonitorStateException if releasing would place this
749
     *         synchronizer in an illegal state. This exception must be
750
     *         thrown in a consistent fashion for synchronization to work
751
     *         correctly.
752
     * @throws UnsupportedOperationException if exclusive mode is not supported
753
     */
754
    protected boolean tryRelease(long arg) {
755
        throw new UnsupportedOperationException();
756
    }
757
 
758
    /**
759
     * Attempts to acquire in shared mode. This method should query if
760
     * the state of the object permits it to be acquired in the shared
761
     * mode, and if so to acquire it.
762
     *
763
     * <p>This method is always invoked by the thread performing
764
     * acquire.  If this method reports failure, the acquire method
765
     * may queue the thread, if it is not already queued, until it is
766
     * signalled by a release from some other thread.
767
     *
768
     * <p>The default implementation throws {@link
769
     * UnsupportedOperationException}.
770
     *
771
     * @param arg the acquire argument. This value is always the one
772
     *        passed to an acquire method, or is the value saved on entry
773
     *        to a condition wait.  The value is otherwise uninterpreted
774
     *        and can represent anything you like.
775
     * @return a negative value on failure; zero if acquisition in shared
776
     *         mode succeeded but no subsequent shared-mode acquire can
777
     *         succeed; and a positive value if acquisition in shared
778
     *         mode succeeded and subsequent shared-mode acquires might
779
     *         also succeed, in which case a subsequent waiting thread
780
     *         must check availability. (Support for three different
781
     *         return values enables this method to be used in contexts
782
     *         where acquires only sometimes act exclusively.)  Upon
783
     *         success, this object has been acquired.
784
     * @throws IllegalMonitorStateException if acquiring would place this
785
     *         synchronizer in an illegal state. This exception must be
786
     *         thrown in a consistent fashion for synchronization to work
787
     *         correctly.
788
     * @throws UnsupportedOperationException if shared mode is not supported
789
     */
790
    protected long tryAcquireShared(long arg) {
791
        throw new UnsupportedOperationException();
792
    }
793
 
794
    /**
795
     * Attempts to set the state to reflect a release in shared mode.
796
     *
797
     * <p>This method is always invoked by the thread performing release.
798
     *
799
     * <p>The default implementation throws
800
     * {@link UnsupportedOperationException}.
801
     *
802
     * @param arg the release argument. This value is always the one
803
     *        passed to a release method, or the current state value upon
804
     *        entry to a condition wait.  The value is otherwise
805
     *        uninterpreted and can represent anything you like.
806
     * @return {@code true} if this release of shared mode may permit a
807
     *         waiting acquire (shared or exclusive) to succeed; and
808
     *         {@code false} otherwise
809
     * @throws IllegalMonitorStateException if releasing would place this
810
     *         synchronizer in an illegal state. This exception must be
811
     *         thrown in a consistent fashion for synchronization to work
812
     *         correctly.
813
     * @throws UnsupportedOperationException if shared mode is not supported
814
     */
815
    protected boolean tryReleaseShared(long arg) {
816
        throw new UnsupportedOperationException();
817
    }
818
 
819
    /**
820
     * Returns {@code true} if synchronization is held exclusively with
821
     * respect to the current (calling) thread.  This method is invoked
822
     * upon each call to a non-waiting {@link ConditionObject} method.
823
     * (Waiting methods instead invoke {@link #release}.)
824
     *
825
     * <p>The default implementation throws {@link
826
     * UnsupportedOperationException}. This method is invoked
827
     * internally only within {@link ConditionObject} methods, so need
828
     * not be defined if conditions are not used.
829
     *
830
     * @return {@code true} if synchronization is held exclusively;
831
     *         {@code false} otherwise
832
     * @throws UnsupportedOperationException if conditions are not supported
833
     */
834
    protected boolean isHeldExclusively() {
835
        throw new UnsupportedOperationException();
836
    }
837
 
838
    /**
839
     * Acquires in exclusive mode, ignoring interrupts.  Implemented
840
     * by invoking at least once {@link #tryAcquire},
841
     * returning on success.  Otherwise the thread is queued, possibly
842
     * repeatedly blocking and unblocking, invoking {@link
843
     * #tryAcquire} until success.  This method can be used
844
     * to implement method {@link Lock#lock}.
845
     *
846
     * @param arg the acquire argument.  This value is conveyed to
847
     *        {@link #tryAcquire} but is otherwise uninterpreted and
848
     *        can represent anything you like.
849
     */
850
    public final void acquire(long arg) {
851
        if (!tryAcquire(arg) &&
852
            acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
853
            selfInterrupt();
854
    }
855
 
856
    /**
857
     * Acquires in exclusive mode, aborting if interrupted.
858
     * Implemented by first checking interrupt status, then invoking
859
     * at least once {@link #tryAcquire}, returning on
860
     * success.  Otherwise the thread is queued, possibly repeatedly
861
     * blocking and unblocking, invoking {@link #tryAcquire}
862
     * until success or the thread is interrupted.  This method can be
863
     * used to implement method {@link Lock#lockInterruptibly}.
864
     *
865
     * @param arg the acquire argument.  This value is conveyed to
866
     *        {@link #tryAcquire} but is otherwise uninterpreted and
867
     *        can represent anything you like.
868
     * @throws InterruptedException if the current thread is interrupted
869
     */
870
    public final void acquireInterruptibly(long arg) throws InterruptedException {
871
        if (Thread.interrupted())
872
            throw new InterruptedException();
873
        if (!tryAcquire(arg))
874
            doAcquireInterruptibly(arg);
875
    }
876
 
877
    /**
878
     * Attempts to acquire in exclusive mode, aborting if interrupted,
879
     * and failing if the given timeout elapses.  Implemented by first
880
     * checking interrupt status, then invoking at least once {@link
881
     * #tryAcquire}, returning on success.  Otherwise, the thread is
882
     * queued, possibly repeatedly blocking and unblocking, invoking
883
     * {@link #tryAcquire} until success or the thread is interrupted
884
     * or the timeout elapses.  This method can be used to implement
885
     * method {@link Lock#tryLock(long, TimeUnit)}.
886
     *
887
     * @param arg the acquire argument.  This value is conveyed to
888
     *        {@link #tryAcquire} but is otherwise uninterpreted and
889
     *        can represent anything you like.
890
     * @param nanosTimeout the maximum number of nanoseconds to wait
891
     * @return {@code true} if acquired; {@code false} if timed out
892
     * @throws InterruptedException if the current thread is interrupted
893
     */
894
    public final boolean tryAcquireNanos(long arg, long nanosTimeout) throws InterruptedException {
895
        if (Thread.interrupted())
896
            throw new InterruptedException();
897
        return tryAcquire(arg) ||
898
            doAcquireNanos(arg, nanosTimeout);
899
    }
900
 
901
    /**
902
     * Releases in exclusive mode.  Implemented by unblocking one or
903
     * more threads if {@link #tryRelease} returns true.
904
     * This method can be used to implement method {@link Lock#unlock}.
905
     *
906
     * @param arg the release argument.  This value is conveyed to
907
     *        {@link #tryRelease} but is otherwise uninterpreted and
908
     *        can represent anything you like.
909
     * @return the value returned from {@link #tryRelease}
910
     */
911
    public final boolean release(long arg) {
912
        if (tryRelease(arg)) {
913
            Node h = head;
914
            if (h != null && h.waitStatus != 0)
915
                unparkSuccessor(h);
916
            return true;
917
        }
918
        return false;
919
    }
920
 
921
    /**
922
     * Acquires in shared mode, ignoring interrupts.  Implemented by
923
     * first invoking at least once {@link #tryAcquireShared},
924
     * returning on success.  Otherwise the thread is queued, possibly
925
     * repeatedly blocking and unblocking, invoking {@link
926
     * #tryAcquireShared} until success.
927
     *
928
     * @param arg the acquire argument.  This value is conveyed to
929
     *        {@link #tryAcquireShared} but is otherwise uninterpreted
930
     *        and can represent anything you like.
931
     */
932
    public final void acquireShared(long arg) {
933
        if (tryAcquireShared(arg) < 0)
934
            doAcquireShared(arg);
935
    }
936
 
937
    /**
938
     * Acquires in shared mode, aborting if interrupted.  Implemented
939
     * by first checking interrupt status, then invoking at least once
940
     * {@link #tryAcquireShared}, returning on success.  Otherwise the
941
     * thread is queued, possibly repeatedly blocking and unblocking,
942
     * invoking {@link #tryAcquireShared} until success or the thread
943
     * is interrupted.
944
     * @param arg the acquire argument.
945
     * This value is conveyed to {@link #tryAcquireShared} but is
946
     * otherwise uninterpreted and can represent anything
947
     * you like.
948
     * @throws InterruptedException if the current thread is interrupted
949
     */
950
    public final void acquireSharedInterruptibly(long arg) throws InterruptedException {
951
        if (Thread.interrupted())
952
            throw new InterruptedException();
953
        if (tryAcquireShared(arg) < 0)
954
            doAcquireSharedInterruptibly(arg);
955
    }
956
 
957
    /**
958
     * Attempts to acquire in shared mode, aborting if interrupted, and
959
     * failing if the given timeout elapses.  Implemented by first
960
     * checking interrupt status, then invoking at least once {@link
961
     * #tryAcquireShared}, returning on success.  Otherwise, the
962
     * thread is queued, possibly repeatedly blocking and unblocking,
963
     * invoking {@link #tryAcquireShared} until success or the thread
964
     * is interrupted or the timeout elapses.
965
     *
966
     * @param arg the acquire argument.  This value is conveyed to
967
     *        {@link #tryAcquireShared} but is otherwise uninterpreted
968
     *        and can represent anything you like.
969
     * @param nanosTimeout the maximum number of nanoseconds to wait
970
     * @return {@code true} if acquired; {@code false} if timed out
971
     * @throws InterruptedException if the current thread is interrupted
972
     */
973
    public final boolean tryAcquireSharedNanos(long arg, long nanosTimeout) throws InterruptedException {
974
        if (Thread.interrupted())
975
            throw new InterruptedException();
976
        return tryAcquireShared(arg) >= 0 ||
977
            doAcquireSharedNanos(arg, nanosTimeout);
978
    }
979
 
980
    /**
981
     * Releases in shared mode.  Implemented by unblocking one or more
982
     * threads if {@link #tryReleaseShared} returns true.
983
     *
984
     * @param arg the release argument.  This value is conveyed to
985
     *        {@link #tryReleaseShared} but is otherwise uninterpreted
986
     *        and can represent anything you like.
987
     * @return the value returned from {@link #tryReleaseShared}
988
     */
989
    public final boolean releaseShared(long arg) {
990
        if (tryReleaseShared(arg)) {
991
            Node h = head;
992
            if (h != null && h.waitStatus != 0)
993
                unparkSuccessor(h);
994
            return true;
995
        }
996
        return false;
997
    }
998
 
999
    // Queue inspection methods
1000
 
1001
    /**
1002
     * Queries whether any threads are waiting to acquire. Note that
1003
     * because cancellations due to interrupts and timeouts may occur
1004
     * at any time, a {@code true} return does not guarantee that any
1005
     * other thread will ever acquire.
1006
     *
1007
     * <p>In this implementation, this operation returns in
1008
     * constant time.
1009
     *
1010
     * @return {@code true} if there may be other threads waiting to acquire
1011
     */
1012
    public final boolean hasQueuedThreads() {
1013
        return head != tail;
1014
    }
1015
 
1016
    /**
1017
     * Queries whether any threads have ever contended to acquire this
1018
     * synchronizer; that is if an acquire method has ever blocked.
1019
     *
1020
     * <p>In this implementation, this operation returns in
1021
     * constant time.
1022
     *
1023
     * @return {@code true} if there has ever been contention
1024
     */
1025
    public final boolean hasContended() {
1026
        return head != null;
1027
    }
1028
 
1029
    /**
1030
     * Returns the first (longest-waiting) thread in the queue, or
1031
     * {@code null} if no threads are currently queued.
1032
     *
1033
     * <p>In this implementation, this operation normally returns in
1034
     * constant time, but may iterate upon contention if other threads are
1035
     * concurrently modifying the queue.
1036
     *
1037
     * @return the first (longest-waiting) thread in the queue, or
1038
     *         {@code null} if no threads are currently queued
1039
     */
1040
    public final Thread getFirstQueuedThread() {
1041
        // handle only fast path, else relay
1042
        return (head == tail)? null : fullGetFirstQueuedThread();
1043
    }
1044
 
1045
    /**
1046
     * Version of getFirstQueuedThread called when fastpath fails
1047
     */
1048
    private Thread fullGetFirstQueuedThread() {
1049
        /*
1050
         * The first node is normally h.next. Try to get its
1051
         * thread field, ensuring consistent reads: If thread
1052
         * field is nulled out or s.prev is no longer head, then
1053
         * some other thread(s) concurrently performed setHead in
1054
         * between some of our reads. We try this twice before
1055
         * resorting to traversal.
1056
         */
1057
        Node h, s;
1058
        Thread st;
1059
        if (((h = head) != null && (s = h.next) != null &&
1060
             s.prev == head && (st = s.thread) != null) ||
1061
            ((h = head) != null && (s = h.next) != null &&
1062
             s.prev == head && (st = s.thread) != null))
1063
            return st;
1064
 
1065
        /*
1066
         * Head's next field might not have been set yet, or may have
1067
         * been unset after setHead. So we must check to see if tail
1068
         * is actually first node. If not, we continue on, safely
1069
         * traversing from tail back to head to find first,
1070
         * guaranteeing termination.
1071
         */
1072
 
1073
        Node t = tail;
1074
        Thread firstThread = null;
1075
        while (t != null && t != head) {
1076
            Thread tt = t.thread;
1077
            if (tt != null)
1078
                firstThread = tt;
1079
            t = t.prev;
1080
        }
1081
        return firstThread;
1082
    }
1083
 
1084
    /**
1085
     * Returns true if the given thread is currently queued.
1086
     *
1087
     * <p>This implementation traverses the queue to determine
1088
     * presence of the given thread.
1089
     *
1090
     * @param thread the thread
1091
     * @return {@code true} if the given thread is on the queue
1092
     * @throws NullPointerException if the thread is null
1093
     */
1094
    public final boolean isQueued(Thread thread) {
1095
        if (thread == null)
1096
            throw new NullPointerException();
1097
        for (Node p = tail; p != null; p = p.prev)
1098
            if (p.thread == thread)
1099
                return true;
1100
        return false;
1101
    }
1102
 
1103
    /**
1104
     * Return {@code true} if the apparent first queued thread, if one
1105
     * exists, is not waiting in exclusive mode. Used only as a heuristic
1106
     * in ReentrantReadWriteLock.
1107
     */
1108
    final boolean apparentlyFirstQueuedIsExclusive() {
1109
        Node h, s;
1110
        return ((h = head) != null && (s = h.next) != null &&
1111
                s.nextWaiter != Node.SHARED);
1112
    }
1113
 
1114
    /**
1115
     * Return {@code true} if the queue is empty or if the given thread
1116
     * is at the head of the queue. This is reliable only if
1117
     * <tt>current</tt> is actually Thread.currentThread() of caller.
1118
     */
1119
    final boolean isFirst(Thread current) {
1120
        Node h, s;
1121
        return ((h = head) == null ||
1122
                ((s = h.next) != null && s.thread == current) ||
1123
                fullIsFirst(current));
1124
    }
1125
 
1126
    final boolean fullIsFirst(Thread current) {
1127
        // same idea as fullGetFirstQueuedThread
1128
        Node h, s;
1129
        Thread firstThread = null;
1130
        if (((h = head) != null && (s = h.next) != null &&
1131
             s.prev == head && (firstThread = s.thread) != null))
1132
            return firstThread == current;
1133
        Node t = tail;
1134
        while (t != null && t != head) {
1135
            Thread tt = t.thread;
1136
            if (tt != null)
1137
                firstThread = tt;
1138
            t = t.prev;
1139
        }
1140
        return firstThread == current || firstThread == null;
1141
    }
1142
 
1143
 
1144
    // Instrumentation and monitoring methods
1145
 
1146
    /**
1147
     * Returns an estimate of the number of threads waiting to
1148
     * acquire.  The value is only an estimate because the number of
1149
     * threads may change dynamically while this method traverses
1150
     * internal data structures.  This method is designed for use in
1151
     * monitoring system state, not for synchronization
1152
     * control.
1153
     *
1154
     * @return the estimated number of threads waiting to acquire
1155
     */
1156
    public final int getQueueLength() {
1157
        int n = 0;
1158
        for (Node p = tail; p != null; p = p.prev) {
1159
            if (p.thread != null)
1160
                ++n;
1161
        }
1162
        return n;
1163
    }
1164
 
1165
    /**
1166
     * Returns a collection containing threads that may be waiting to
1167
     * acquire.  Because the actual set of threads may change
1168
     * dynamically while constructing this result, the returned
1169
     * collection is only a best-effort estimate.  The elements of the
1170
     * returned collection are in no particular order.  This method is
1171
     * designed to facilitate construction of subclasses that provide
1172
     * more extensive monitoring facilities.
1173
     *
1174
     * @return the collection of threads
1175
     */
1176
    public final Collection<Thread> getQueuedThreads() {
1177
        ArrayList<Thread> list = new ArrayList<Thread>();
1178
        for (Node p = tail; p != null; p = p.prev) {
1179
            Thread t = p.thread;
1180
            if (t != null)
1181
                list.add(t);
1182
        }
1183
        return list;
1184
    }
1185
 
1186
    /**
1187
     * Returns a collection containing threads that may be waiting to
1188
     * acquire in exclusive mode. This has the same properties
1189
     * as {@link #getQueuedThreads} except that it only returns
1190
     * those threads waiting due to an exclusive acquire.
1191
     *
1192
     * @return the collection of threads
1193
     */
1194
    public final Collection<Thread> getExclusiveQueuedThreads() {
1195
        ArrayList<Thread> list = new ArrayList<Thread>();
1196
        for (Node p = tail; p != null; p = p.prev) {
1197
            if (!p.isShared()) {
1198
                Thread t = p.thread;
1199
                if (t != null)
1200
                    list.add(t);
1201
            }
1202
        }
1203
        return list;
1204
    }
1205
 
1206
    /**
1207
     * Returns a collection containing threads that may be waiting to
1208
     * acquire in shared mode. This has the same properties
1209
     * as {@link #getQueuedThreads} except that it only returns
1210
     * those threads waiting due to a shared acquire.
1211
     *
1212
     * @return the collection of threads
1213
     */
1214
    public final Collection<Thread> getSharedQueuedThreads() {
1215
        ArrayList<Thread> list = new ArrayList<Thread>();
1216
        for (Node p = tail; p != null; p = p.prev) {
1217
            if (p.isShared()) {
1218
                Thread t = p.thread;
1219
                if (t != null)
1220
                    list.add(t);
1221
            }
1222
        }
1223
        return list;
1224
    }
1225
 
1226
    /**
1227
     * Returns a string identifying this synchronizer, as well as its state.
1228
     * The state, in brackets, includes the String {@code "State ="}
1229
     * followed by the current value of {@link #getState}, and either
1230
     * {@code "nonempty"} or {@code "empty"} depending on whether the
1231
     * queue is empty.
1232
     *
1233
     * @return a string identifying this synchronizer, as well as its state
1234
     */
1235
    public String toString() {
1236
        long s = getState();
1237
        String q  = hasQueuedThreads()? "non" : "";
1238
        return super.toString() +
1239
            "[State = " + s + ", " + q + "empty queue]";
1240
    }
1241
 
1242
 
1243
    // Internal support methods for Conditions
1244
 
1245
    /**
1246
     * Returns true if a node, always one that was initially placed on
1247
     * a condition queue, is now waiting to reacquire on sync queue.
1248
     * @param node the node
1249
     * @return true if is reacquiring
1250
     */
1251
    final boolean isOnSyncQueue(Node node) {
1252
        if (node.waitStatus == Node.CONDITION || node.prev == null)
1253
            return false;
1254
        if (node.next != null) // If has successor, it must be on queue
1255
            return true;
1256
        /*
1257
         * node.prev can be non-null, but not yet on queue because
1258
         * the CAS to place it on queue can fail. So we have to
1259
         * traverse from tail to make sure it actually made it.  It
1260
         * will always be near the tail in calls to this method, and
1261
         * unless the CAS failed (which is unlikely), it will be
1262
         * there, so we hardly ever traverse much.
1263
         */
1264
        return findNodeFromTail(node);
1265
    }
1266
 
1267
    /**
1268
     * Returns true if node is on sync queue by searching backwards from tail.
1269
     * Called only when needed by isOnSyncQueue.
1270
     * @return true if present
1271
     */
1272
    private boolean findNodeFromTail(Node node) {
1273
        Node t = tail;
1274
        for (;;) {
1275
            if (t == node)
1276
                return true;
1277
            if (t == null)
1278
                return false;
1279
            t = t.prev;
1280
        }
1281
    }
1282
 
1283
    /**
1284
     * Transfers a node from a condition queue onto sync queue.
1285
     * Returns true if successful.
1286
     * @param node the node
1287
     * @return true if successfully transferred (else the node was
1288
     * cancelled before signal).
1289
     */
1290
    final boolean transferForSignal(Node node) {
1291
        /*
1292
         * If cannot change waitStatus, the node has been cancelled.
1293
         */
1294
        if (!compareAndSetWaitStatus(node, Node.CONDITION, 0))
1295
            return false;
1296
 
1297
        /*
1298
         * Splice onto queue and try to set waitStatus of predecessor to
1299
         * indicate that thread is (probably) waiting. If cancelled or
1300
         * attempt to set waitStatus fails, wake up to resync (in which
1301
         * case the waitStatus can be transiently and harmlessly wrong).
1302
         */
1303
        Node p = enq(node);
1304
        int c = p.waitStatus;
1305
        if (c > 0 || !compareAndSetWaitStatus(p, c, Node.SIGNAL))
1306
            LockSupport.unpark(node.thread);
1307
        return true;
1308
    }
1309
 
1310
    /**
1311
     * Transfers node, if necessary, to sync queue after a cancelled
1312
     * wait. Returns true if thread was cancelled before being
1313
     * signalled.
1314
     * @param current the waiting thread
1315
     * @param node its node
1316
     * @return true if cancelled before the node was signalled.
1317
     */
1318
    final boolean transferAfterCancelledWait(Node node) {
1319
        if (compareAndSetWaitStatus(node, Node.CONDITION, 0)) {
1320
            enq(node);
1321
            return true;
1322
        }
1323
        /*
1324
         * If we lost out to a signal(), then we can't proceed
1325
         * until it finishes its enq().  Cancelling during an
1326
         * incomplete transfer is both rare and transient, so just
1327
         * spin.
1328
         */
1329
        while (!isOnSyncQueue(node))
1330
            Thread.yield();
1331
        return false;
1332
    }
1333
 
1334
    /**
1335
     * Invokes release with current state value; returns saved state.
1336
     * Cancels node and throws exception on failure.
1337
     * @param node the condition node for this wait
1338
     * @return previous sync state
1339
     */
1340
    final long fullyRelease(Node node) {
1341
        try {
1342
            long savedState = getState();
1343
            if (release(savedState))
1344
                return savedState;
1345
        } catch (RuntimeException ex) {
1346
            node.waitStatus = Node.CANCELLED;
1347
            throw ex;
1348
        }
1349
        // reach here if release fails
1350
        node.waitStatus = Node.CANCELLED;
1351
        throw new IllegalMonitorStateException();
1352
    }
1353
 
1354
    // Instrumentation methods for conditions
1355
 
1356
    /**
1357
     * Queries whether the given ConditionObject
1358
     * uses this synchronizer as its lock.
1359
     *
1360
     * @param condition the condition
1361
     * @return <tt>true</tt> if owned
1362
     * @throws NullPointerException if the condition is null
1363
     */
1364
    public final boolean owns(ConditionObject condition) {
1365
        if (condition == null)
1366
            throw new NullPointerException();
1367
        return condition.isOwnedBy(this);
1368
    }
1369
 
1370
    /**
1371
     * Queries whether any threads are waiting on the given condition
1372
     * associated with this synchronizer. Note that because timeouts
1373
     * and interrupts may occur at any time, a <tt>true</tt> return
1374
     * does not guarantee that a future <tt>signal</tt> will awaken
1375
     * any threads.  This method is designed primarily for use in
1376
     * monitoring of the system state.
1377
     *
1378
     * @param condition the condition
1379
     * @return <tt>true</tt> if there are any waiting threads
1380
     * @throws IllegalMonitorStateException if exclusive synchronization
1381
     *         is not held
1382
     * @throws IllegalArgumentException if the given condition is
1383
     *         not associated with this synchronizer
1384
     * @throws NullPointerException if the condition is null
1385
     */
1386
    public final boolean hasWaiters(ConditionObject condition) {
1387
        if (!owns(condition))
1388
            throw new IllegalArgumentException("Not owner");
1389
        return condition.hasWaiters();
1390
    }
1391
 
1392
    /**
1393
     * Returns an estimate of the number of threads waiting on the
1394
     * given condition associated with this synchronizer. Note that
1395
     * because timeouts and interrupts may occur at any time, the
1396
     * estimate serves only as an upper bound on the actual number of
1397
     * waiters.  This method is designed for use in monitoring of the
1398
     * system state, not for synchronization control.
1399
     *
1400
     * @param condition the condition
1401
     * @return the estimated number of waiting threads
1402
     * @throws IllegalMonitorStateException if exclusive synchronization
1403
     *         is not held
1404
     * @throws IllegalArgumentException if the given condition is
1405
     *         not associated with this synchronizer
1406
     * @throws NullPointerException if the condition is null
1407
     */
1408
    public final int getWaitQueueLength(ConditionObject condition) {
1409
        if (!owns(condition))
1410
            throw new IllegalArgumentException("Not owner");
1411
        return condition.getWaitQueueLength();
1412
    }
1413
 
1414
    /**
1415
     * Returns a collection containing those threads that may be
1416
     * waiting on the given condition associated with this
1417
     * synchronizer.  Because the actual set of threads may change
1418
     * dynamically while constructing this result, the returned
1419
     * collection is only a best-effort estimate. The elements of the
1420
     * returned collection are in no particular order.
1421
     *
1422
     * @param condition the condition
1423
     * @return the collection of threads
1424
     * @throws IllegalMonitorStateException if exclusive synchronization
1425
     *         is not held
1426
     * @throws IllegalArgumentException if the given condition is
1427
     *         not associated with this synchronizer
1428
     * @throws NullPointerException if the condition is null
1429
     */
1430
    public final Collection<Thread> getWaitingThreads(ConditionObject condition) {
1431
        if (!owns(condition))
1432
            throw new IllegalArgumentException("Not owner");
1433
        return condition.getWaitingThreads();
1434
    }
1435
 
1436
    /**
1437
     * Condition implementation for a {@link
1438
     * AbstractQueuedLongSynchronizer} serving as the basis of a {@link
1439
     * Lock} implementation.
1440
     *
1441
     * <p>Method documentation for this class describes mechanics,
1442
     * not behavioral specifications from the point of view of Lock
1443
     * and Condition users. Exported versions of this class will in
1444
     * general need to be accompanied by documentation describing
1445
     * condition semantics that rely on those of the associated
1446
     * <tt>AbstractQueuedLongSynchronizer</tt>.
1447
     *
1448
     * <p>This class is Serializable, but all fields are transient,
1449
     * so deserialized conditions have no waiters.
1450
     *
1451
     * @since 1.6
1452
     */
1453
    public class ConditionObject implements Condition, java.io.Serializable {
1454
        private static final long serialVersionUID = 1173984872572414699L;
1455
        /** First node of condition queue. */
1456
        private transient Node firstWaiter;
1457
        /** Last node of condition queue. */
1458
        private transient Node lastWaiter;
1459
 
1460
        /**
1461
         * Creates a new <tt>ConditionObject</tt> instance.
1462
         */
1463
        public ConditionObject() { }
1464
 
1465
        // Internal methods
1466
 
1467
        /**
1468
         * Adds a new waiter to wait queue.
1469
         * @return its new wait node
1470
         */
1471
        private Node addConditionWaiter() {
1472
            Node node = new Node(Thread.currentThread(), Node.CONDITION);
1473
            Node t = lastWaiter;
1474
            if (t == null)
1475
                firstWaiter = node;
1476
            else
1477
                t.nextWaiter = node;
1478
            lastWaiter = node;
1479
            return node;
1480
        }
1481
 
1482
        /**
1483
         * Removes and transfers nodes until hit non-cancelled one or
1484
         * null. Split out from signal in part to encourage compilers
1485
         * to inline the case of no waiters.
1486
         * @param first (non-null) the first node on condition queue
1487
         */
1488
        private void doSignal(Node first) {
1489
            do {
1490
                if ( (firstWaiter = first.nextWaiter) == null)
1491
                    lastWaiter = null;
1492
                first.nextWaiter = null;
1493
            } while (!transferForSignal(first) &&
1494
                     (first = firstWaiter) != null);
1495
        }
1496
 
1497
        /**
1498
         * Removes and transfers all nodes.
1499
         * @param first (non-null) the first node on condition queue
1500
         */
1501
        private void doSignalAll(Node first) {
1502
            lastWaiter = firstWaiter  = null;
1503
            do {
1504
                Node next = first.nextWaiter;
1505
                first.nextWaiter = null;
1506
                transferForSignal(first);
1507
                first = next;
1508
            } while (first != null);
1509
        }
1510
 
1511
        /**
1512
         * Returns true if given node is on this condition queue.
1513
         * Call only when holding lock.
1514
         */
1515
        private boolean isOnConditionQueue(Node node) {
1516
            return node.next != null || node == lastWaiter;
1517
        }
1518
 
1519
        /**
1520
         * Unlinks a cancelled waiter node from condition queue.  This
1521
         * is called when cancellation occurred during condition wait,
1522
         * not lock wait, and is called only after lock has been
1523
         * re-acquired by a cancelled waiter and the node is not known
1524
         * to already have been dequeued.  It is needed to avoid
1525
         * garbage retention in the absence of signals. So even though
1526
         * it may require a full traversal, it comes into play only
1527
         * when timeouts or cancellations occur in the absence of
1528
         * signals.
1529
         */
1530
        private void unlinkCancelledWaiter(Node node) {
1531
            Node t = firstWaiter;
1532
            Node trail = null;
1533
            while (t != null) {
1534
                if (t == node) {
1535
                    Node next = t.nextWaiter;
1536
                    if (trail == null)
1537
                        firstWaiter = next;
1538
                    else
1539
                        trail.nextWaiter = next;
1540
                    if (lastWaiter == node)
1541
                        lastWaiter = trail;
1542
                    break;
1543
                }
1544
                trail = t;
1545
                t = t.nextWaiter;
1546
            }
1547
        }
1548
 
1549
        // public methods
1550
 
1551
        /**
1552
         * Moves the longest-waiting thread, if one exists, from the
1553
         * wait queue for this condition to the wait queue for the
1554
         * owning lock.
1555
         *
1556
         * @throws IllegalMonitorStateException if {@link #isHeldExclusively}
1557
         *         returns {@code false}
1558
         */
1559
        public final void signal() {
1560
            if (!isHeldExclusively())
1561
                throw new IllegalMonitorStateException();
1562
            Node first = firstWaiter;
1563
            if (first != null)
1564
                doSignal(first);
1565
        }
1566
 
1567
        /**
1568
         * Moves all threads from the wait queue for this condition to
1569
         * the wait queue for the owning lock.
1570
         *
1571
         * @throws IllegalMonitorStateException if {@link #isHeldExclusively}
1572
         *         returns {@code false}
1573
         */
1574
        public final void signalAll() {
1575
            if (!isHeldExclusively())
1576
                throw new IllegalMonitorStateException();
1577
            Node first = firstWaiter;
1578
            if (first != null)
1579
                doSignalAll(first);
1580
        }
1581
 
1582
        /**
1583
         * Implements uninterruptible condition wait.
1584
         * <ol>
1585
         * <li> Save lock state returned by {@link #getState}
1586
         * <li> Invoke {@link #release} with
1587
         *      saved state as argument, throwing
1588
         *      IllegalMonitorStateException if it fails.
1589
         * <li> Block until signalled
1590
         * <li> Reacquire by invoking specialized version of
1591
         *      {@link #acquire} with saved state as argument.
1592
         * </ol>
1593
         */
1594
        public final void awaitUninterruptibly() {
1595
            Node node = addConditionWaiter();
1596
            long savedState = fullyRelease(node);
1597
            boolean interrupted = false;
1598
            while (!isOnSyncQueue(node)) {
1599
                LockSupport.park(this);
1600
                if (Thread.interrupted())
1601
                    interrupted = true;
1602
            }
1603
            if (acquireQueued(node, savedState) || interrupted)
1604
                selfInterrupt();
1605
        }
1606
 
1607
        /*
1608
         * For interruptible waits, we need to track whether to throw
1609
         * InterruptedException, if interrupted while blocked on
1610
         * condition, versus reinterrupt current thread, if
1611
         * interrupted while blocked waiting to re-acquire.
1612
         */
1613
 
1614
        /** Mode meaning to reinterrupt on exit from wait */
1615
        private static final int REINTERRUPT =  1;
1616
        /** Mode meaning to throw InterruptedException on exit from wait */
1617
        private static final int THROW_IE    = -1;
1618
 
1619
        /**
1620
         * Checks for interrupt, returning THROW_IE if interrupted
1621
         * before signalled, REINTERRUPT if after signalled, or
1622
         * 0 if not interrupted.
1623
         */
1624
        private int checkInterruptWhileWaiting(Node node) {
1625
            return (Thread.interrupted()) ?
1626
                ((transferAfterCancelledWait(node))? THROW_IE : REINTERRUPT) :
1627
                0;
1628
        }
1629
 
1630
        /**
1631
         * Throws InterruptedException, reinterrupts current thread, or
1632
         * does nothing, depending on mode.
1633
         */
1634
        private void reportInterruptAfterWait(int interruptMode)
1635
            throws InterruptedException {
1636
            if (interruptMode == THROW_IE)
1637
                throw new InterruptedException();
1638
            else if (interruptMode == REINTERRUPT)
1639
                selfInterrupt();
1640
        }
1641
 
1642
        /**
1643
         * Implements interruptible condition wait.
1644
         * <ol>
1645
         * <li> If current thread is interrupted, throw InterruptedException
1646
         * <li> Save lock state returned by {@link #getState}
1647
         * <li> Invoke {@link #release} with
1648
         *      saved state as argument, throwing
1649
         *      IllegalMonitorStateException  if it fails.
1650
         * <li> Block until signalled or interrupted
1651
         * <li> Reacquire by invoking specialized version of
1652
         *      {@link #acquire} with saved state as argument.
1653
         * <li> If interrupted while blocked in step 4, throw exception
1654
         * </ol>
1655
         */
1656
        public final void await() throws InterruptedException {
1657
            if (Thread.interrupted())
1658
                throw new InterruptedException();
1659
            Node node = addConditionWaiter();
1660
            long savedState = fullyRelease(node);
1661
            int interruptMode = 0;
1662
            while (!isOnSyncQueue(node)) {
1663
                LockSupport.park(this);
1664
                if ((interruptMode = checkInterruptWhileWaiting(node)) != 0)
1665
                    break;
1666
            }
1667
            if (acquireQueued(node, savedState) && interruptMode != THROW_IE)
1668
                interruptMode = REINTERRUPT;
1669
            if (isOnConditionQueue(node))
1670
                unlinkCancelledWaiter(node);
1671
            if (interruptMode != 0)
1672
                reportInterruptAfterWait(interruptMode);
1673
        }
1674
 
1675
        /**
1676
         * Implements timed condition wait.
1677
         * <ol>
1678
         * <li> If current thread is interrupted, throw InterruptedException
1679
         * <li> Save lock state returned by {@link #getState}
1680
         * <li> Invoke {@link #release} with
1681
         *      saved state as argument, throwing
1682
         *      IllegalMonitorStateException  if it fails.
1683
         * <li> Block until signalled, interrupted, or timed out
1684
         * <li> Reacquire by invoking specialized version of
1685
         *      {@link #acquire} with saved state as argument.
1686
         * <li> If interrupted while blocked in step 4, throw InterruptedException
1687
         * </ol>
1688
         */
1689
        public final long awaitNanos(long nanosTimeout) throws InterruptedException {
1690
            if (Thread.interrupted())
1691
                throw new InterruptedException();
1692
            Node node = addConditionWaiter();
1693
            long savedState = fullyRelease(node);
1694
            long lastTime = System.nanoTime();
1695
            int interruptMode = 0;
1696
            while (!isOnSyncQueue(node)) {
1697
                if (nanosTimeout <= 0L) {
1698
                    transferAfterCancelledWait(node);
1699
                    break;
1700
                }
1701
                LockSupport.parkNanos(this, nanosTimeout);
1702
                if ((interruptMode = checkInterruptWhileWaiting(node)) != 0)
1703
                    break;
1704
 
1705
                long now = System.nanoTime();
1706
                nanosTimeout -= now - lastTime;
1707
                lastTime = now;
1708
            }
1709
            if (acquireQueued(node, savedState) && interruptMode != THROW_IE)
1710
                interruptMode = REINTERRUPT;
1711
            if (isOnConditionQueue(node))
1712
                unlinkCancelledWaiter(node);
1713
            if (interruptMode != 0)
1714
                reportInterruptAfterWait(interruptMode);
1715
            return nanosTimeout - (System.nanoTime() - lastTime);
1716
        }
1717
 
1718
        /**
1719
         * Implements absolute timed condition wait.
1720
         * <ol>
1721
         * <li> If current thread is interrupted, throw InterruptedException
1722
         * <li> Save lock state returned by {@link #getState}
1723
         * <li> Invoke {@link #release} with
1724
         *      saved state as argument, throwing
1725
         *      IllegalMonitorStateException  if it fails.
1726
         * <li> Block until signalled, interrupted, or timed out
1727
         * <li> Reacquire by invoking specialized version of
1728
         *      {@link #acquire} with saved state as argument.
1729
         * <li> If interrupted while blocked in step 4, throw InterruptedException
1730
         * <li> If timed out while blocked in step 4, return false, else true
1731
         * </ol>
1732
         */
1733
        public final boolean awaitUntil(Date deadline) throws InterruptedException {
1734
            if (deadline == null)
1735
                throw new NullPointerException();
1736
            long abstime = deadline.getTime();
1737
            if (Thread.interrupted())
1738
                throw new InterruptedException();
1739
            Node node = addConditionWaiter();
1740
            long savedState = fullyRelease(node);
1741
            boolean timedout = false;
1742
            int interruptMode = 0;
1743
            while (!isOnSyncQueue(node)) {
1744
                if (System.currentTimeMillis() > abstime) {
1745
                    timedout = transferAfterCancelledWait(node);
1746
                    break;
1747
                }
1748
                LockSupport.parkUntil(this, abstime);
1749
                if ((interruptMode = checkInterruptWhileWaiting(node)) != 0)
1750
                    break;
1751
            }
1752
            if (acquireQueued(node, savedState) && interruptMode != THROW_IE)
1753
                interruptMode = REINTERRUPT;
1754
            if (isOnConditionQueue(node))
1755
                unlinkCancelledWaiter(node);
1756
            if (interruptMode != 0)
1757
                reportInterruptAfterWait(interruptMode);
1758
            return !timedout;
1759
        }
1760
 
1761
        /**
1762
         * Implements timed condition wait.
1763
         * <ol>
1764
         * <li> If current thread is interrupted, throw InterruptedException
1765
         * <li> Save lock state returned by {@link #getState}
1766
         * <li> Invoke {@link #release} with
1767
         *      saved state as argument, throwing
1768
         *      IllegalMonitorStateException  if it fails.
1769
         * <li> Block until signalled, interrupted, or timed out
1770
         * <li> Reacquire by invoking specialized version of
1771
         *      {@link #acquire} with saved state as argument.
1772
         * <li> If interrupted while blocked in step 4, throw InterruptedException
1773
         * <li> If timed out while blocked in step 4, return false, else true
1774
         * </ol>
1775
         */
1776
        public final boolean await(long time, TimeUnit unit) throws InterruptedException {
1777
            if (unit == null)
1778
                throw new NullPointerException();
1779
            long nanosTimeout = unit.toNanos(time);
1780
            if (Thread.interrupted())
1781
                throw new InterruptedException();
1782
            Node node = addConditionWaiter();
1783
            long savedState = fullyRelease(node);
1784
            long lastTime = System.nanoTime();
1785
            boolean timedout = false;
1786
            int interruptMode = 0;
1787
            while (!isOnSyncQueue(node)) {
1788
                if (nanosTimeout <= 0L) {
1789
                    timedout = transferAfterCancelledWait(node);
1790
                    break;
1791
                }
1792
                LockSupport.parkNanos(this, nanosTimeout);
1793
                if ((interruptMode = checkInterruptWhileWaiting(node)) != 0)
1794
                    break;
1795
                long now = System.nanoTime();
1796
                nanosTimeout -= now - lastTime;
1797
                lastTime = now;
1798
            }
1799
            if (acquireQueued(node, savedState) && interruptMode != THROW_IE)
1800
                interruptMode = REINTERRUPT;
1801
            if (isOnConditionQueue(node))
1802
                unlinkCancelledWaiter(node);
1803
            if (interruptMode != 0)
1804
                reportInterruptAfterWait(interruptMode);
1805
            return !timedout;
1806
        }
1807
 
1808
        //  support for instrumentation
1809
 
1810
        /**
1811
         * Returns true if this condition was created by the given
1812
         * synchronization object.
1813
         *
1814
         * @return {@code true} if owned
1815
         */
1816
        final boolean isOwnedBy(AbstractQueuedLongSynchronizer sync) {
1817
            return sync == AbstractQueuedLongSynchronizer.this;
1818
        }
1819
 
1820
        /**
1821
         * Queries whether any threads are waiting on this condition.
1822
         * Implements {@link AbstractQueuedLongSynchronizer#hasWaiters}.
1823
         *
1824
         * @return {@code true} if there are any waiting threads
1825
         * @throws IllegalMonitorStateException if {@link #isHeldExclusively}
1826
         *         returns {@code false}
1827
         */
1828
        protected final boolean hasWaiters() {
1829
            if (!isHeldExclusively())
1830
                throw new IllegalMonitorStateException();
1831
            for (Node w = firstWaiter; w != null; w = w.nextWaiter) {
1832
                if (w.waitStatus == Node.CONDITION)
1833
                    return true;
1834
            }
1835
            return false;
1836
        }
1837
 
1838
        /**
1839
         * Returns an estimate of the number of threads waiting on
1840
         * this condition.
1841
         * Implements {@link AbstractQueuedLongSynchronizer#getWaitQueueLength}.
1842
         *
1843
         * @return the estimated number of waiting threads
1844
         * @throws IllegalMonitorStateException if {@link #isHeldExclusively}
1845
         *         returns {@code false}
1846
         */
1847
        protected final int getWaitQueueLength() {
1848
            if (!isHeldExclusively())
1849
                throw new IllegalMonitorStateException();
1850
            int n = 0;
1851
            for (Node w = firstWaiter; w != null; w = w.nextWaiter) {
1852
                if (w.waitStatus == Node.CONDITION)
1853
                    ++n;
1854
            }
1855
            return n;
1856
        }
1857
 
1858
        /**
1859
         * Returns a collection containing those threads that may be
1860
         * waiting on this Condition.
1861
         * Implements {@link AbstractQueuedLongSynchronizer#getWaitingThreads}.
1862
         *
1863
         * @return the collection of threads
1864
         * @throws IllegalMonitorStateException if {@link #isHeldExclusively}
1865
         *         returns {@code false}
1866
         */
1867
        protected final Collection<Thread> getWaitingThreads() {
1868
            if (!isHeldExclusively())
1869
                throw new IllegalMonitorStateException();
1870
            ArrayList<Thread> list = new ArrayList<Thread>();
1871
            for (Node w = firstWaiter; w != null; w = w.nextWaiter) {
1872
                if (w.waitStatus == Node.CONDITION) {
1873
                    Thread t = w.thread;
1874
                    if (t != null)
1875
                        list.add(t);
1876
                }
1877
            }
1878
            return list;
1879
        }
1880
    }
1881
 
1882
    /**
1883
     * Setup to support compareAndSet. We need to natively implement
1884
     * this here: For the sake of permitting future enhancements, we
1885
     * cannot explicitly subclass AtomicLong, which would be
1886
     * efficient and useful otherwise. So, as the lesser of evils, we
1887
     * natively implement using hotspot intrinsics API. And while we
1888
     * are at it, we do the same for other CASable fields (which could
1889
     * otherwise be done with atomic field updaters).
1890
     */
1891
    private static final Unsafe unsafe = Unsafe.getUnsafe();
1892
    private static final long stateOffset;
1893
    private static final long headOffset;
1894
    private static final long tailOffset;
1895
    private static final long waitStatusOffset;
1896
 
1897
    static {
1898
        try {
1899
            stateOffset = unsafe.objectFieldOffset
1900
                (AbstractQueuedLongSynchronizer.class.getDeclaredField("state"));
1901
            headOffset = unsafe.objectFieldOffset
1902
                (AbstractQueuedLongSynchronizer.class.getDeclaredField("head"));
1903
            tailOffset = unsafe.objectFieldOffset
1904
                (AbstractQueuedLongSynchronizer.class.getDeclaredField("tail"));
1905
            waitStatusOffset = unsafe.objectFieldOffset
1906
                (Node.class.getDeclaredField("waitStatus"));
1907
 
1908
        } catch (Exception ex) { throw new Error(ex); }
1909
    }
1910
 
1911
    /**
1912
     * CAS head field. Used only by enq
1913
     */
1914
    private final boolean compareAndSetHead(Node update) {
1915
        return unsafe.compareAndSwapObject(this, headOffset, null, update);
1916
    }
1917
 
1918
    /**
1919
     * CAS tail field. Used only by enq
1920
     */
1921
    private final boolean compareAndSetTail(Node expect, Node update) {
1922
        return unsafe.compareAndSwapObject(this, tailOffset, expect, update);
1923
    }
1924
 
1925
    /**
1926
     * CAS waitStatus field of a node.
1927
     */
1928
    private final static boolean compareAndSetWaitStatus(Node node,
1929
                                                         int expect,
1930
                                                         int update) {
1931
        return unsafe.compareAndSwapInt(node, waitStatusOffset,
1932
                                        expect, update);
1933
    }
1934
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.