< prev index next >

src/share/classes/javax/swing/TimerQueue.java

Print this page
rev 1412 : 8130735: javax.swing.TimerQueue: timer fires late when another timer starts
Reviewed-by: ssadetsky, alexsch

@@ -87,10 +87,13 @@
 
 
     void startIfNeeded() {
         if (! running) {
             runningLock.lock();
+            if (running) {
+                return;
+            }
             try {
                 final ThreadGroup threadGroup =
                     AppContext.getAppContext().getThreadGroup();
                 java.security.AccessController.doPrivileged(
                     new java.security.PrivilegedAction() {

@@ -162,19 +165,21 @@
     public void run() {
         runningLock.lock();
         try {
             while (running) {
                 try {
-                    Timer timer = queue.take().getTimer();
+                    DelayedTimer runningTimer = queue.take();
+                    Timer timer = runningTimer.getTimer();
                     timer.getLock().lock();
                     try {
                         DelayedTimer delayedTimer = timer.delayedTimer;
-                        if (delayedTimer != null) {
+                        if (delayedTimer == runningTimer) {
                             /*
-                             * Timer is not removed after we get it from
-                             * the queue and before the lock on the timer is
-                             * acquired
+                             * Timer is not removed (delayedTimer != null)
+                             * or not removed and added (runningTimer == delayedTimer)
+                             * after we get it from the queue and before the
+                             * lock on the timer is acquired
                              */
                             timer.post(); // have timer post an event
                             timer.delayedTimer = null;
                             if (timer.isRepeats()) {
                                 delayedTimer.setTime(now()
< prev index next >