< prev index next >

src/java.desktop/share/classes/java/awt/WaitDispatchSupport.java

Print this page

        

*** 44,54 **** * @author Anton Tarasov, Artem Ananiev * * @since 1.7 */ class WaitDispatchSupport implements SecondaryLoop { - private final static PlatformLogger log = PlatformLogger.getLogger("java.awt.event.WaitDispatchSupport"); private EventDispatchThread dispatchThread; private EventFilter filter; --- 44,53 ----
*** 63,72 **** --- 62,72 ---- // shared timer up and running private TimerTask timerTask; private AtomicBoolean keepBlockingEDT = new AtomicBoolean(false); private AtomicBoolean keepBlockingCT = new AtomicBoolean(false); + private AtomicBoolean afterExit = new AtomicBoolean(false); private static synchronized void initializeTimer() { if (timer == null) { timer = new Timer("AWT-WaitDispatchSupport-Timer", true); }
*** 112,122 **** log.finest("evaluate(): blockingEDT=" + keepBlockingEDT.get() + ", blockingCT=" + keepBlockingCT.get()); } boolean extEvaluate = (extCondition != null) ? extCondition.evaluate() : true; ! if (!keepBlockingEDT.get() || !extEvaluate) { if (timerTask != null) { timerTask.cancel(); timerTask = null; } return false; --- 112,122 ---- log.finest("evaluate(): blockingEDT=" + keepBlockingEDT.get() + ", blockingCT=" + keepBlockingCT.get()); } boolean extEvaluate = (extCondition != null) ? extCondition.evaluate() : true; ! if (!keepBlockingEDT.get() || !extEvaluate || afterExit.get()) { if (timerTask != null) { timerTask.cancel(); timerTask = null; } return false;
*** 172,181 **** --- 172,186 ---- if (!keepBlockingEDT.compareAndSet(false, true)) { log.fine("The secondary loop is already running, aborting"); return false; } + try { + if (afterExit.get()) { + log.fine("Exit was called already, aborting"); + return false; + } final Runnable run = new Runnable() { public void run() { log.fine("Starting a new event pump"); if (filter == null) {
*** 232,249 **** }); } else { if (log.isLoggable(PlatformLogger.Level.FINEST)) { log.finest("On non-dispatch thread: " + currentThread); } synchronized (getTreeLock()) { if (filter != null) { dispatchThread.addEventFilter(filter); } try { EventQueue eq = dispatchThread.getEventQueue(); eq.postEvent(new PeerEvent(this, run, PeerEvent.PRIORITY_EVENT)); - keepBlockingCT.set(true); if (interval > 0) { long currTime = System.currentTimeMillis(); while (keepBlockingCT.get() && ((extCondition != null) ? extCondition.evaluate() : true) && (currTime + interval > System.currentTimeMillis())) --- 237,255 ---- }); } else { if (log.isLoggable(PlatformLogger.Level.FINEST)) { log.finest("On non-dispatch thread: " + currentThread); } + keepBlockingCT.set(true); synchronized (getTreeLock()) { + if (afterExit.get()) return false; if (filter != null) { dispatchThread.addEventFilter(filter); } try { EventQueue eq = dispatchThread.getEventQueue(); eq.postEvent(new PeerEvent(this, run, PeerEvent.PRIORITY_EVENT)); if (interval > 0) { long currTime = System.currentTimeMillis(); while (keepBlockingCT.get() && ((extCondition != null) ? extCondition.evaluate() : true) && (currTime + interval > System.currentTimeMillis()))
*** 267,296 **** } finally { if (filter != null) { dispatchThread.removeEventFilter(filter); } } - // If the waiting process has been stopped because of the - // time interval passed or an exception occurred, the state - // should be changed - keepBlockingEDT.set(false); - keepBlockingCT.set(false); } } - return true; } /** * {@inheritDoc} */ public boolean exit() { if (log.isLoggable(PlatformLogger.Level.FINE)) { log.fine("exit(): blockingEDT=" + keepBlockingEDT.get() + ", blockingCT=" + keepBlockingCT.get()); } ! if (keepBlockingEDT.compareAndSet(true, false)) { wakeupEDT(); return true; } return false; } --- 273,303 ---- } finally { if (filter != null) { dispatchThread.removeEventFilter(filter); } } } } return true; } + finally { + keepBlockingEDT.set(false); + keepBlockingCT.set(false); + afterExit.set(false); + } + } /** * {@inheritDoc} */ public boolean exit() { if (log.isLoggable(PlatformLogger.Level.FINE)) { log.fine("exit(): blockingEDT=" + keepBlockingEDT.get() + ", blockingCT=" + keepBlockingCT.get()); } ! afterExit.set(true); ! if (keepBlockingEDT.getAndSet(false)) { wakeupEDT(); return true; } return false; }
< prev index next >