continue firefox rdp — handle frameUpdate(destroyAll=true) event, init break support...
[idea/community.git] / platform / script-debugger / backend / src / org / jetbrains / debugger / SuspendContextManagerBase.java
1 package org.jetbrains.debugger;
2
3 import org.jetbrains.annotations.NotNull;
4 import org.jetbrains.annotations.Nullable;
5 import org.jetbrains.concurrency.Promise;
6
7 import java.util.concurrent.atomic.AtomicReference;
8
9 public abstract class SuspendContextManagerBase<T extends SuspendContextBase, CALL_FRAME extends CallFrame> implements SuspendContextManager<CALL_FRAME> {
10   protected final AtomicReference<T> context = new AtomicReference<T>();
11
12   protected final AtomicReference<Promise<Void>> suspendCallback = new AtomicReference<Promise<Void>>();
13
14   public final void setContext(@NotNull T newContext) {
15     if (!context.compareAndSet(null, newContext)) {
16       throw new IllegalStateException("Attempt to set context, but current suspend context is already exists");
17     }
18   }
19
20   public final void contextDismissed(@NotNull T context, @NotNull DebugEventListener listener) {
21     if (!this.context.compareAndSet(context, null)) {
22       throw new IllegalStateException("Expected " + context + ", but another suspend context exists");
23     }
24     context.getValueManager().markObsolete();
25     listener.resumed();
26   }
27
28   @Nullable
29   @Override
30   public final T getContext() {
31     return context.get();
32   }
33
34   @NotNull
35   @Override
36   public T getContextOrFail() {
37     T context = getContext();
38     if (context == null) {
39       throw new IllegalStateException("No current suspend context");
40     }
41     return context;
42   }
43
44   @NotNull
45   @Override
46   public final Promise<?> suspend() {
47     Promise<Void> callback = suspendCallback.get();
48     if (callback != null) {
49       return callback;
50     }
51
52     if (context.get() != null) {
53       return Promise.DONE;
54     }
55     return doSuspend();
56   }
57
58   @NotNull
59   protected abstract Promise<?> doSuspend();
60
61   @Override
62   public boolean isContextObsolete(@NotNull SuspendContext context) {
63     return this.context.get() != context;
64   }
65
66   @Override
67   public void setOverlayMessage(@Nullable String message) {
68   }
69
70   @NotNull
71   @Override
72   public final Promise<Boolean> restartFrame(@NotNull CALL_FRAME callFrame) {
73     return restartFrame(callFrame, getContextOrFail());
74   }
75
76   @NotNull
77   protected abstract Promise<Boolean> restartFrame(@NotNull CALL_FRAME callFrame, @NotNull T currentContext);
78 }