Skip to content

Commit 6da4b03

Browse files
committed
Use a PBQ instead of a PQ on the trampoline. Moves counter inside to worker class and ditches the separate field updater.
1 parent 28ec4c7 commit 6da4b03

File tree

1 file changed

+9
-16
lines changed

1 file changed

+9
-16
lines changed

src/main/java/rx/schedulers/TrampolineScheduler.java

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
*/
1616
package rx.schedulers;
1717

18-
import java.util.PriorityQueue;
18+
import java.util.concurrent.PriorityBlockingQueue;
1919
import java.util.concurrent.TimeUnit;
2020
import java.util.concurrent.atomic.AtomicInteger;
2121
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
@@ -45,14 +45,12 @@ public Worker createWorker() {
4545
/* package accessible for unit tests */TrampolineScheduler() {
4646
}
4747

48-
volatile int counter;
49-
static final AtomicIntegerFieldUpdater<TrampolineScheduler> COUNTER_UPDATER = AtomicIntegerFieldUpdater.newUpdater(TrampolineScheduler.class, "counter");
50-
5148
private class InnerCurrentThreadScheduler extends Scheduler.Worker implements Subscription {
5249

53-
final PriorityQueue<TimedAction> queue = new PriorityQueue<TimedAction>();
50+
private final PriorityBlockingQueue<TimedAction> queue = new PriorityBlockingQueue<TimedAction>();
5451
private final BooleanSubscription innerSubscription = new BooleanSubscription();
5552
private final AtomicInteger wip = new AtomicInteger();
53+
private final AtomicInteger counter = new AtomicInteger();
5654

5755
@Override
5856
public Subscription schedule(Action0 action) {
@@ -70,18 +68,15 @@ private Subscription enqueue(Action0 action, long execTime) {
7068
if (innerSubscription.isUnsubscribed()) {
7169
return Subscriptions.unsubscribed();
7270
}
73-
final TimedAction timedAction = new TimedAction(action, execTime, COUNTER_UPDATER.incrementAndGet(TrampolineScheduler.this));
74-
synchronized (queue) {
75-
queue.add(timedAction);
76-
}
71+
final TimedAction timedAction = new TimedAction(action, execTime, counter.incrementAndGet());
72+
queue.add(timedAction);
7773

7874
if (wip.getAndIncrement() == 0) {
7975
do {
80-
TimedAction polled;
81-
synchronized (queue) {
82-
polled = queue.poll();
76+
final TimedAction polled = queue.poll();
77+
if (polled != null) {
78+
polled.action.call();
8379
}
84-
polled.action.call();
8580
} while (wip.decrementAndGet() > 0);
8681
return Subscriptions.unsubscribed();
8782
} else {
@@ -90,9 +85,7 @@ private Subscription enqueue(Action0 action, long execTime) {
9085

9186
@Override
9287
public void call() {
93-
synchronized (queue) {
94-
queue.remove(timedAction);
95-
}
88+
queue.remove(timedAction);
9689
}
9790

9891
});

0 commit comments

Comments
 (0)