summaryrefslogtreecommitdiff
path: root/platform/util/src/com/intellij/util/io/storage/HeavyProcessLatch.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/util/src/com/intellij/util/io/storage/HeavyProcessLatch.java')
-rw-r--r--platform/util/src/com/intellij/util/io/storage/HeavyProcessLatch.java46
1 files changed, 37 insertions, 9 deletions
diff --git a/platform/util/src/com/intellij/util/io/storage/HeavyProcessLatch.java b/platform/util/src/com/intellij/util/io/storage/HeavyProcessLatch.java
index e0d349c0c7ad..663cd215cfbe 100644
--- a/platform/util/src/com/intellij/util/io/storage/HeavyProcessLatch.java
+++ b/platform/util/src/com/intellij/util/io/storage/HeavyProcessLatch.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,19 +19,47 @@
*/
package com.intellij.util.io.storage;
+import com.intellij.openapi.Disposable;
+import com.intellij.openapi.util.Disposer;
+import com.intellij.util.EventDispatcher;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.EventListener;
+import java.util.concurrent.atomic.AtomicInteger;
+
public class HeavyProcessLatch {
public static final HeavyProcessLatch INSTANCE = new HeavyProcessLatch();
- private int myHeavyProcessCounter = 0;
-
- public synchronized void processStarted() {
- myHeavyProcessCounter++;
+
+ private final AtomicInteger myHeavyProcessCounter = new AtomicInteger();
+ private final EventDispatcher<HeavyProcessListener> myEventDispatcher = EventDispatcher.create(HeavyProcessListener.class);
+
+ private HeavyProcessLatch() {
+ }
+
+ public void processStarted() {
+ myHeavyProcessCounter.incrementAndGet();
+ myEventDispatcher.getMulticaster().processStarted();
}
- public synchronized void processFinished() {
- myHeavyProcessCounter--;
+ public void processFinished() {
+ myHeavyProcessCounter.decrementAndGet();
+ myEventDispatcher.getMulticaster().processFinished();
+ }
+
+ public boolean isRunning() {
+ return myHeavyProcessCounter.get() != 0;
+ }
+
+ public interface HeavyProcessListener extends EventListener {
+ public void processStarted();
+
+ public void processFinished();
}
- public synchronized boolean isRunning() {
- return myHeavyProcessCounter != 0;
+ @NotNull
+ public Disposable addListener(@NotNull HeavyProcessListener listener) {
+ Disposable disposable = Disposer.newDisposable();
+ myEventDispatcher.addListener(listener, disposable);
+ return disposable;
}
} \ No newline at end of file