comparison src/EDU/oswego/cs/dl/util/concurrent/PrioritySemaphore.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: PrioritySemaphore.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 11Jun1998 dl Create public version
12 */
13
14
15 package EDU.oswego.cs.dl.util.concurrent;
16
17 /**
18 * A Semaphore that grants requests to threads with higher
19 * Thread priority rather than lower priority when there is
20 * contention. Ordering of requests with the same priority
21 * is approximately FIFO.
22 * Priorities are based on Thread.getPriority.
23 * Changing the priority of an already-waiting thread does NOT
24 * change its ordering. This class also does not specially deal with priority
25 * inversion -- when a new high-priority thread enters
26 * while a low-priority thread is currently running, their
27 * priorities are <em>not</em> artificially manipulated.
28 * <p>[<a href="http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html"> Introduction to this package. </a>]
29
30 **/
31
32 public class PrioritySemaphore extends QueuedSemaphore {
33
34 /**
35 * Create a Semaphore with the given initial number of permits.
36 * Using a seed of one makes the semaphore act as a mutual exclusion lock.
37 * Negative seeds are also allowed, in which case no acquires will proceed
38 * until the number of releases has pushed the number of permits past 0.
39 **/
40
41
42 public PrioritySemaphore(long initialPermits) {
43 super(new PriorityWaitQueue(), initialPermits);
44 }
45
46 protected static class PriorityWaitQueue extends WaitQueue {
47
48
49 /** An array of wait queues, one per priority **/
50 protected final FIFOSemaphore.FIFOWaitQueue[] cells_ =
51 new FIFOSemaphore.FIFOWaitQueue[Thread.MAX_PRIORITY -
52 Thread.MIN_PRIORITY + 1];
53
54 /**
55 * The index of the highest priority cell that may need to be signalled,
56 * or -1 if none. Used to minimize array traversal.
57 **/
58
59 protected int maxIndex_ = -1;
60
61 protected PriorityWaitQueue() {
62 for (int i = 0; i < cells_.length; ++i)
63 cells_[i] = new FIFOSemaphore.FIFOWaitQueue();
64 }
65
66 protected void insert(WaitNode w) {
67 int idx = Thread.currentThread().getPriority() - Thread.MIN_PRIORITY;
68 cells_[idx].insert(w);
69 if (idx > maxIndex_) maxIndex_ = idx;
70 }
71
72 protected WaitNode extract() {
73 for (;;) {
74 int idx = maxIndex_;
75 if (idx < 0)
76 return null;
77 WaitNode w = cells_[idx].extract();
78 if (w != null)
79 return w;
80 else
81 --maxIndex_;
82 }
83 }
84 }
85
86
87
88
89
90 }