DefaultPromise internal state dependent on Signal
Motivation: DefaultPromise's internal state depends upon specific Signal objects. These Signal objects can be used externally which causes the DefaultPromise object API to not function correct and state to become corrupted. Modifications: - DefaultPromise shouldn't depend upon Signal for its internal state Result: Fixes https://github.com/netty/netty/issues/7707
This commit is contained in:
parent
108fbe5282
commit
4f982be91e
@ -15,7 +15,6 @@
|
||||
*/
|
||||
package io.netty.util.concurrent;
|
||||
|
||||
import io.netty.util.Signal;
|
||||
import io.netty.util.internal.InternalThreadLocalMap;
|
||||
import io.netty.util.internal.PlatformDependent;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
@ -40,8 +39,8 @@ public class DefaultPromise<V> extends AbstractFuture<V> implements Promise<V> {
|
||||
@SuppressWarnings("rawtypes")
|
||||
private static final AtomicReferenceFieldUpdater<DefaultPromise, Object> RESULT_UPDATER =
|
||||
AtomicReferenceFieldUpdater.newUpdater(DefaultPromise.class, Object.class, "result");
|
||||
private static final Signal SUCCESS = Signal.valueOf(DefaultPromise.class, "SUCCESS");
|
||||
private static final Signal UNCANCELLABLE = Signal.valueOf(DefaultPromise.class, "UNCANCELLABLE");
|
||||
private static final Object SUCCESS = new Object();
|
||||
private static final Object UNCANCELLABLE = new Object();
|
||||
private static final CauseHolder CANCELLATION_CAUSE_HOLDER = new CauseHolder(ThrowableUtil.unknownStackTrace(
|
||||
new CancellationException(), DefaultPromise.class, "cancel(...)"));
|
||||
|
||||
|
@ -16,6 +16,7 @@
|
||||
|
||||
package io.netty.util.concurrent;
|
||||
|
||||
import io.netty.util.Signal;
|
||||
import io.netty.util.internal.logging.InternalLogger;
|
||||
import io.netty.util.internal.logging.InternalLoggerFactory;
|
||||
import org.junit.BeforeClass;
|
||||
@ -241,6 +242,22 @@ public class DefaultPromiseTest {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void signalUncancellableCompletionValue() {
|
||||
final Promise<Signal> promise = new DefaultPromise<Signal>(ImmediateEventExecutor.INSTANCE);
|
||||
promise.setSuccess(Signal.valueOf(DefaultPromise.class, "UNCANCELLABLE"));
|
||||
assertTrue(promise.isDone());
|
||||
assertTrue(promise.isSuccess());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void signalSuccessCompletionValue() {
|
||||
final Promise<Signal> promise = new DefaultPromise<Signal>(ImmediateEventExecutor.INSTANCE);
|
||||
promise.setSuccess(Signal.valueOf(DefaultPromise.class, "SUCCESS"));
|
||||
assertTrue(promise.isDone());
|
||||
assertTrue(promise.isSuccess());
|
||||
}
|
||||
|
||||
private static void testStackOverFlowChainedFuturesA(int promiseChainLength, final EventExecutor executor,
|
||||
boolean runTestInExecutorThread)
|
||||
throws InterruptedException {
|
||||
|
Loading…
Reference in New Issue
Block a user