equal
deleted
inserted
replaced
92 |
92 |
93 |
93 |
94 void startIfNeeded() { |
94 void startIfNeeded() { |
95 if (! running) { |
95 if (! running) { |
96 runningLock.lock(); |
96 runningLock.lock(); |
|
97 if (running) { |
|
98 return; |
|
99 } |
97 try { |
100 try { |
98 final ThreadGroup threadGroup = AppContext.getAppContext().getThreadGroup(); |
101 final ThreadGroup threadGroup = AppContext.getAppContext().getThreadGroup(); |
99 AccessController.doPrivileged((PrivilegedAction<Object>) () -> { |
102 AccessController.doPrivileged((PrivilegedAction<Object>) () -> { |
100 String name = "TimerQueue"; |
103 String name = "TimerQueue"; |
101 Thread timerThread = new ManagedLocalsThread(threadGroup, |
104 Thread timerThread = new ManagedLocalsThread(threadGroup, |
164 public void run() { |
167 public void run() { |
165 runningLock.lock(); |
168 runningLock.lock(); |
166 try { |
169 try { |
167 while (running) { |
170 while (running) { |
168 try { |
171 try { |
169 Timer timer = queue.take().getTimer(); |
172 DelayedTimer runningTimer = queue.take(); |
|
173 Timer timer = runningTimer.getTimer(); |
170 timer.getLock().lock(); |
174 timer.getLock().lock(); |
171 try { |
175 try { |
172 DelayedTimer delayedTimer = timer.delayedTimer; |
176 DelayedTimer delayedTimer = timer.delayedTimer; |
173 if (delayedTimer != null) { |
177 if (delayedTimer == runningTimer) { |
174 /* |
178 /* |
175 * Timer is not removed after we get it from |
179 * Timer is not removed (delayedTimer != null) |
176 * the queue and before the lock on the timer is |
180 * or not removed and added (runningTimer == delayedTimer) |
177 * acquired |
181 * after we get it from the queue and before the |
|
182 * lock on the timer is acquired |
178 */ |
183 */ |
179 timer.post(); // have timer post an event |
184 timer.post(); // have timer post an event |
180 timer.delayedTimer = null; |
185 timer.delayedTimer = null; |
181 if (timer.isRepeats()) { |
186 if (timer.isRepeats()) { |
182 delayedTimer.setTime(now() |
187 delayedTimer.setTime(now() |