make Application#getIdleTime thread-safe, finer-grained and more concise

needed for delaying auto-make when user is active (IDEA-141128)
This commit is contained in:
peter
2018-04-11 17:02:17 +02:00
parent 97bd01a484
commit dbd3dcc60c
2 changed files with 3 additions and 30 deletions
@@ -88,8 +88,6 @@ public class IdeEventQueue extends EventQueue {
private final List<Runnable> myIdleListeners = ContainerUtil.createLockFreeCopyOnWriteList();
private final List<Runnable> myActivityListeners = ContainerUtil.createLockFreeCopyOnWriteList();
private final Alarm myIdleRequestsAlarm = new Alarm();
private final Alarm myIdleTimeCounterAlarm = new Alarm();
private long myIdleTime;
private final Map<Runnable, MyFireIdleRequest> 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<EventDispatcher> 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.
* <p/>
* 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;
@@ -706,7 +706,6 @@ public class ApplicationImpl extends PlatformComponentManagerImpl implements App
@Override
public long getIdleTime() {
assertIsDispatchThread();
return IdeEventQueue.getInstance().getIdleTime();
}