From dbd3dcc60c45486df4051299cebb94046a978f6f Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 11 Apr 2018 16:48:41 +0200 Subject: [PATCH] make Application#getIdleTime thread-safe, finer-grained and more concise needed for delaying auto-make when user is active (IDEA-141128) --- .../src/com/intellij/ide/IdeEventQueue.java | 32 ++----------------- .../application/impl/ApplicationImpl.java | 1 - 2 files changed, 3 insertions(+), 30 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java b/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java index b1d41d70172c..872aff2c2fe5 100644 --- a/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java +++ b/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java @@ -88,8 +88,6 @@ public class IdeEventQueue extends EventQueue { private final List myIdleListeners = ContainerUtil.createLockFreeCopyOnWriteList(); private final List myActivityListeners = ContainerUtil.createLockFreeCopyOnWriteList(); private final Alarm myIdleRequestsAlarm = new Alarm(); - private final Alarm myIdleTimeCounterAlarm = new Alarm(); - private long myIdleTime; private final Map myListener2Request = new HashMap<>(); // IdleListener -> MyFireIdleRequest private final IdeKeyEventDispatcher myKeyEventDispatcher = new IdeKeyEventDispatcher(this); @@ -115,7 +113,7 @@ public class IdeEventQueue extends EventQueue { private boolean myIsInInputEvent; @NotNull private AWTEvent myCurrentEvent = new InvocationEvent(this, EmptyRunnable.getInstance()); - private long myLastActiveTime; + private volatile long myLastActiveTime = System.nanoTime(); private long myLastEventTime = System.currentTimeMillis(); private WindowManagerEx myWindowManager; private final List myDispatchers = ContainerUtil.createLockFreeCopyOnWriteList(); @@ -197,7 +195,6 @@ public class IdeEventQueue extends EventQueue { EventQueue systemEventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue(); assert !(systemEventQueue instanceof IdeEventQueue) : systemEventQueue; systemEventQueue.push(this); - addIdleTimeCounterRequest(); KeyboardFocusManager keyboardFocusManager = IdeKeyboardFocusManager.replaceDefault(); keyboardFocusManager.addPropertyChangeListener("permanentFocusOwner", e -> { @@ -248,28 +245,6 @@ public class IdeEventQueue extends EventQueue { myWindowManager = windowManager; } - - private void addIdleTimeCounterRequest() { - if (isTestMode()) return; - - myIdleTimeCounterAlarm.cancelAllRequests(); - myLastActiveTime = System.currentTimeMillis(); - myIdleTimeCounterAlarm.addRequest(() -> { - myIdleTime += System.currentTimeMillis() - myLastActiveTime; - addIdleTimeCounterRequest(); - }, 20000, ModalityState.NON_MODAL); - } - - /** - * This class performs special processing in order to have {@link #getIdleTime()} return more or less up-to-date data. - *

- * This method allows to stop that processing (convenient in non-intellij environment like upsource). - */ - @SuppressWarnings("unused") // Used in upsource. - public void stopIdleTimeCalculation() { - myIdleTimeCounterAlarm.cancelAllRequests(); - } - public void addIdleListener(@NotNull final Runnable runnable, final int timeoutMillis) { if(timeoutMillis <= 0 || TimeUnit.MILLISECONDS.toHours(timeoutMillis) >= 24) { throw new IllegalArgumentException("This timeout value is unsupported: " + timeoutMillis); @@ -677,7 +652,7 @@ public class IdeEventQueue extends EventQueue { MouseEvent.MOUSE_PRESSED == e.getID() || MouseEvent.MOUSE_RELEASED == e.getID() || MouseEvent.MOUSE_CLICKED == e.getID()) { - addIdleTimeCounterRequest(); + myLastActiveTime = System.nanoTime(); for (Runnable activityListener : myActivityListeners) { activityListener.run(); } @@ -932,10 +907,9 @@ public class IdeEventQueue extends EventQueue { } public long getIdleTime() { - return myIdleTime; + return TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - myLastActiveTime); } - @NotNull public IdePopupManager getPopupManager() { return myPopupManager; diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java b/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java index 1f2a2d8277d5..64dd3cf23030 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java @@ -706,7 +706,6 @@ public class ApplicationImpl extends PlatformComponentManagerImpl implements App @Override public long getIdleTime() { - assertIsDispatchThread(); return IdeEventQueue.getInstance().getIdleTime(); }