annotate dwtx/dwtxhelper/Timer.d @ 200:eb3414669eb0 default tip

fix for dmd 1.041 and tango 0.99.8
author Frank Benoit <benoit@tionex.de>
date Sat, 28 Mar 2009 03:09:57 +0100
parents 987b95661bb9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
100
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1 module dwtx.dwtxhelper.Timer;
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
3 import dwtx.dwtxhelper.TimerTask;
185
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
4 // import tango.util.container.CircularList;
167
862b05e0334a Add a wrapper for Thread
Frank Benoit <benoit@tionex.de>
parents: 100
diff changeset
5 import dwtx.dwtxhelper.JThread;
100
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
6 import tango.core.sync.Mutex;
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
7 import tango.core.sync.Condition;
185
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
8 // import tango.time.Time;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
9 // import tango.time.Clock;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
10 import tango.text.convert.Format;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
11 import dwt.dwthelper.utils;
100
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
12
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
13 class Timer {
185
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
14 private static final class TaskQueue {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
15 private Mutex mutex;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
16 private Condition cond;
100
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
17
185
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
18
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
19 private static const int DEFAULT_SIZE = 32;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
20 private bool nullOnEmpty;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
21 private TimerTask heap[];
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
22 private int elements;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
23 public this() {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
24 mutex = new Mutex();
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
25 cond = new Condition( mutex );
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
26 heap = new TimerTask[DEFAULT_SIZE];
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
27 elements = 0;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
28 nullOnEmpty = false;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
29 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
30
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
31 private void add(TimerTask task) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
32 elements++;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
33 if (elements is heap.length) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
34 TimerTask new_heap[] = new TimerTask[heap.length * 2];
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
35 System.arraycopy(heap, 0, new_heap, 0, heap.length);
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
36 heap = new_heap;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
37 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
38 heap[elements] = task;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
39 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
40
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
41 private void remove() {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
42 // clear the entry first
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
43 heap[elements] = null;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
44 elements--;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
45 if (elements + DEFAULT_SIZE / 2 <= (heap.length / 4)) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
46 TimerTask new_heap[] = new TimerTask[heap.length / 2];
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
47 System.arraycopy(heap, 0, new_heap, 0, elements + 1);
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
48 heap = new_heap;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
49 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
50 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
51
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
52 public void enqueue(TimerTask task) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
53 synchronized( mutex ){
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
54 if (heap is null) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
55 throw new IllegalStateException("cannot enqueue when stop() has been called on queue");
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
56 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
57
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
58 heap[0] = task;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
59 add(task);
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
60 int child = elements;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
61 int parent = child / 2;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
62 while (heap[parent].scheduled > task.scheduled) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
63 heap[child] = heap[parent];
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
64 child = parent;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
65 parent = child / 2;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
66 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
67 heap[child] = task;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
68 heap[0] = null;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
69 cond.notify();
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
70 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
71 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
72
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
73 private TimerTask top() {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
74 if (elements is 0) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
75 return null;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
76 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
77 else {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
78 return heap[1];
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
79 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
80 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
81
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
82 public TimerTask serve() {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
83 synchronized( mutex ){
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
84 TimerTask task = null;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
85 while (task is null) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
86 task = top();
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
87
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
88 if ((heap is null) || (task is null && nullOnEmpty)) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
89 return null;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
90 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
91
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
92 if (task !is null) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
93 // The time to wait until the task should be served
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
94 long time = task.scheduled - System.currentTimeMillis();
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
95 if (time > 0) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
96 // This task should not yet be served
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
97 // So wait until this task is ready
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
98 // or something else happens to the queue
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
99 task = null; // set to null to make sure we call top()
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
100 try {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
101 cond.wait(time);
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
102 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
103 catch (InterruptedException _) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
104 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
105 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
106 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
107 else {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
108 // wait until a task is added
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
109 // or something else happens to the queue
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
110 try {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
111 cond.wait();
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
112 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
113 catch (InterruptedException _) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
114 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
115 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
116 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
117
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
118 TimerTask lastTask = heap[elements];
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
119 remove();
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
120
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
121 int parent = 1;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
122 int child = 2;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
123 heap[1] = lastTask;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
124 while (child <= elements) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
125 if (child < elements) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
126 if (heap[child].scheduled > heap[child + 1].scheduled) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
127 child++;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
128 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
129 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
130
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
131 if (lastTask.scheduled <= heap[child].scheduled)
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
132 break;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
133
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
134 heap[parent] = heap[child];
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
135 parent = child;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
136 child = parent * 2;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
137 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
138
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
139 heap[parent] = lastTask;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
140 return task;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
141 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
142 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
143
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
144 public void setNullOnEmpty(bool nullOnEmpty) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
145 synchronized( mutex ){
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
146 this.nullOnEmpty = nullOnEmpty;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
147 cond.notify();
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
148 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
149 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
150
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
151 public void stop() {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
152 synchronized( mutex ){
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
153 this.heap = null;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
154 this.elements = 0;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
155 cond.notify();
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
156 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
157 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
158
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
159 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
160
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
161 private static final class Scheduler : Runnable {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
162 private TaskQueue queue;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
163
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
164 public this(TaskQueue queue) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
165 this.queue = queue;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
166 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
167
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
168 public void run() {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
169 TimerTask task;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
170 while ((task = queue.serve()) !is null) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
171 if (task.scheduled >= 0) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
172 task.lastExecutionTime = task.scheduled;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
173 if (task.period < 0) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
174 task.scheduled = -1;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
175 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
176 try {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
177 task.run();
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
178 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
179 // catch (ThreadDeath death) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
180 // // If an exception escapes, the Timer becomes invalid.
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
181 // queue.stop();
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
182 // throw death;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
183 // }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
184 catch (Exception t) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
185 queue.stop();
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
186 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
187 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
188 if (task.scheduled >= 0) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
189 if (task.fixed) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
190 task.scheduled += task.period;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
191 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
192 else {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
193 task.scheduled = task.period + System.currentTimeMillis();
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
194 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
195
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
196 try {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
197 queue.enqueue(task);
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
198 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
199 catch (IllegalStateException ise) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
200 // Ignore. Apparently the Timer queue has been stopped.
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
201 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
202 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
203 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
204 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
205 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
206
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
207 private static int nr;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
208 private TaskQueue queue;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
209 private Scheduler scheduler;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
210 private JThread thread;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
211 private bool canceled;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
212
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
213 public this() {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
214 this(false);
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
215 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
216
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
217 public this(bool daemon) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
218 this(daemon, JThread.NORM_PRIORITY);
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
219 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
220
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
221 private this(bool daemon, int priority) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
222 this(daemon, priority, Format( "Timer-{}", ++nr));
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
223 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
224
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
225 private this(bool daemon, int priority, String name) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
226 canceled = false;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
227 queue = new TaskQueue();
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
228 scheduler = new Scheduler(queue);
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
229 thread = new JThread(scheduler, name);
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
230 thread.setDaemon(daemon);
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
231 thread.setPriority(priority);
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
232 thread.start();
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
233 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
234
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
235 public void cancel() {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
236 canceled = true;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
237 queue.stop();
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
238 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
239
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
240 private void schedule(TimerTask task, long time, long period, bool fixed) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
241 if (time < 0)
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
242 throw new IllegalArgumentException("negative time");
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
243
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
244 if (task.scheduled is 0 && task.lastExecutionTime is -1) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
245 task.scheduled = time;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
246 task.period = period;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
247 task.fixed = fixed;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
248 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
249 else {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
250 throw new IllegalStateException("task was already scheduled or canceled");
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
251 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
252
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
253 if (!this.canceled && this.thread !is null) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
254 queue.enqueue(task);
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
255 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
256 else {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
257 throw new IllegalStateException("timer was canceled or scheduler thread has died");
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
258 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
259 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
260
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
261 private static void positiveDelay(long delay) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
262 if (delay < 0) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
263 throw new IllegalArgumentException("delay is negative");
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
264 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
265 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
266
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
267 private static void positivePeriod(long period) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
268 if (period < 0) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
269 throw new IllegalArgumentException("period is negative");
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
270 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
271 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
272
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
273 // public void schedule(TimerTask task, Date date) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
274 // long time = date.getTime();
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
275 // schedule(task, time, -1, false);
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
276 // }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
277
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
278 // public void schedule(TimerTask task, Date date, long period) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
279 // positivePeriod(period);
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
280 // long time = date.getTime();
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
281 // schedule(task, time, period, false);
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
282 // }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
283
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
284 public void schedule(TimerTask task, long delay) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
285 positiveDelay(delay);
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
286 long time = System.currentTimeMillis() + delay;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
287 schedule(task, time, -1, false);
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
288 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
289
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
290 public void schedule(TimerTask task, long delay, long period) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
291 positiveDelay(delay);
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
292 positivePeriod(period);
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
293 long time = System.currentTimeMillis() + delay;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
294 schedule(task, time, period, false);
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
295 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
296
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
297 // public void scheduleAtFixedRate(TimerTask task, Date date, long period) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
298 // positivePeriod(period);
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
299 // long time = date.getTime();
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
300 // schedule(task, time, period, true);
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
301 // }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
302
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
303 public void scheduleAtFixedRate(TimerTask task, long delay, long period) {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
304 positiveDelay(delay);
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
305 positivePeriod(period);
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
306 long time = System.currentTimeMillis() + delay;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
307 schedule(task, time, period, true);
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
308 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
309
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
310 protected void finalize() {
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
311 queue.setNullOnEmpty(true);
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
312 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
313
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
314
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
315 ///////////////////////////////////////////////////
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
316 /+ alias CircularList!( TimerTask ) ListType;
100
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
317
167
862b05e0334a Add a wrapper for Thread
Frank Benoit <benoit@tionex.de>
parents: 100
diff changeset
318 private JThread thread;
100
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
319 private ListType schedules;
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
320 private Mutex mutex;
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
321 private Condition cond;
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
322 private bool isCanceled = false;
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
323
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
324 this(){
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
325 this(false);
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
326 }
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
327 this(bool isDaemon){
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
328 mutex = new Mutex();
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
329 cond = new Condition( mutex );
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
330
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
331 schedules = new ListType();
167
862b05e0334a Add a wrapper for Thread
Frank Benoit <benoit@tionex.de>
parents: 100
diff changeset
332 thread = new JThread( &run );
862b05e0334a Add a wrapper for Thread
Frank Benoit <benoit@tionex.de>
parents: 100
diff changeset
333 thread.setDaemon( isDaemon );
100
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
334 thread.start();
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
335 }
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
336 private void run(){
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
337
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
338 while( !isCanceled ){
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
339 TimerTask timerTask = null;
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
340 synchronized(mutex){
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
341 bool isReady = false;
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
342 do{
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
343 if( isCanceled ){
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
344 return;
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
345 }
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
346
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
347 if( schedules.size() is 0 ){
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
348 cond.wait();
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
349 }
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
350 else{
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
351 timerTask = schedules.head();
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
352 TimeSpan toWait = timerTask.executionTime - Clock.now();
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
353 if( toWait.interval() > 0 ){
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
354 cond.wait( toWait.interval() );
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
355 }
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
356 else{
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
357 schedules.removeHead();
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
358 isReady = true;
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
359 }
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
360 }
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
361 }while( !isReady );
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
362 }
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
363 if( timerTask ){
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
364 timerTask.run();
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
365 if( timerTask.period.millis > 0 ){
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
366 timerTask.executionTime += timerTask.period;
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
367 synchronized(mutex){
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
368 int index = 0;
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
369 foreach( tt; schedules ){
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
370 if( tt.executionTime > timerTask.executionTime ){
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
371 break;
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
372 }
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
373 index++;
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
374 }
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
375 schedules.addAt( index, timerTask );
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
376 }
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
377 }
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
378 }
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
379 }
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
380 }
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
381 void cancel(){
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
382 synchronized(mutex){
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
383 isCanceled = true;
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
384 cond.notifyAll();
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
385 }
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
386 }
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
387 void schedule(TimerTask task, long delay){
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
388 scheduleAtFixedRate( task, delay, 0 );
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
389 }
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
390 void scheduleAtFixedRate(TimerTask task, long delay, long period){
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
391 assert( task );
200
eb3414669eb0 fix for dmd 1.041 and tango 0.99.8
Frank Benoit <benoit@tionex.de>
parents: 185
diff changeset
392 task.executionTime = Clock.now + TimeSpan.fromMillis(delay);
100
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
393 task.timer = this;
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
394 synchronized(mutex){
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
395 int index = 0;
185
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
396 if( schedules.size() > 0 )
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
397 foreach( tt; schedules ){
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
398 if( tt.executionTime > task.executionTime ){
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
399 break;
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
400 }
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
401 index++;
100
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
402 }
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
403 schedules.addAt( index, task );
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
404 cond.notifyAll();
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
405 }
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
406 }
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
407
185
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
408 // void schedule(TimerTask task, Date time){}
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
409 // void schedule(TimerTask task, Date firstTime, long period){}
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
410 // void schedule(TimerTask task, long delay, long period){}
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
411 // void scheduleAtFixedRate(TimerTask task, Date firstTime, long period){}
987b95661bb9 Added impl for Timer/TimerTask
Frank Benoit <benoit@tionex.de>
parents: 178
diff changeset
412 +/
100
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
413 }
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
414
86617aa6b5dd More helper classes, needed by draw2d
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
415