From fdf80101b915fe37de11ae5e1d983cbe5bf4086b Mon Sep 17 00:00:00 2001 From: akarnokd Date: Wed, 25 Aug 2021 13:44:33 +0200 Subject: [PATCH 1/2] 3.x: Fix ExecutorScheduler initializing Schedulers prematurely --- .../rxjava3/internal/schedulers/ExecutorScheduler.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/reactivex/rxjava3/internal/schedulers/ExecutorScheduler.java b/src/main/java/io/reactivex/rxjava3/internal/schedulers/ExecutorScheduler.java index c3957fa400..7c7b017988 100644 --- a/src/main/java/io/reactivex/rxjava3/internal/schedulers/ExecutorScheduler.java +++ b/src/main/java/io/reactivex/rxjava3/internal/schedulers/ExecutorScheduler.java @@ -38,7 +38,9 @@ public final class ExecutorScheduler extends Scheduler { @NonNull final Executor executor; - static final Scheduler HELPER = Schedulers.single(); + static final class SingleHolder { + static final Scheduler HELPER = Schedulers.single(); + } public ExecutorScheduler(@NonNull Executor executor, boolean interruptibleWorker, boolean fair) { this.executor = executor; @@ -97,7 +99,7 @@ public Disposable scheduleDirect(@NonNull Runnable run, final long delay, final final DelayedRunnable dr = new DelayedRunnable(decoratedRun); - Disposable delayed = HELPER.scheduleDirect(new DelayedDispose(dr), delay, unit); + Disposable delayed = SingleHolder.HELPER.scheduleDirect(new DelayedDispose(dr), delay, unit); dr.timed.replace(delayed); @@ -215,7 +217,7 @@ public Disposable schedule(@NonNull Runnable run, long delay, @NonNull TimeUnit return EmptyDisposable.INSTANCE; } } else { - final Disposable d = HELPER.scheduleDirect(sr, delay, unit); + final Disposable d = SingleHolder.HELPER.scheduleDirect(sr, delay, unit); sr.setFuture(new DisposeOnCancel(d)); } From 5b664b31931e8173c22dc52fde4bccd462c4449c Mon Sep 17 00:00:00 2001 From: akarnokd Date: Wed, 25 Aug 2021 14:14:26 +0200 Subject: [PATCH 2/2] Add coverage of the holder class --- .../ExecutorSchedulerInternalTest.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/test/java/io/reactivex/rxjava3/internal/schedulers/ExecutorSchedulerInternalTest.java diff --git a/src/test/java/io/reactivex/rxjava3/internal/schedulers/ExecutorSchedulerInternalTest.java b/src/test/java/io/reactivex/rxjava3/internal/schedulers/ExecutorSchedulerInternalTest.java new file mode 100644 index 0000000000..64d4d1861c --- /dev/null +++ b/src/test/java/io/reactivex/rxjava3/internal/schedulers/ExecutorSchedulerInternalTest.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2016-present, RxJava Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is + * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See + * the License for the specific language governing permissions and limitations under the License. + */ + +package io.reactivex.rxjava3.internal.schedulers; + +import static org.junit.Assert.assertNotNull; + +import org.junit.Test; + +public class ExecutorSchedulerInternalTest { + + @Test + public void helperHolder() { + assertNotNull(new ExecutorScheduler.SingleHolder()); + } + +}