Skip to content

Commit 2532484

Browse files
Merge pull request ReactiveX#2912 from akarnokd/FixEventLoopsPerfDegradation
Fix the performance degradation due to different schedule execution and
2 parents f1bd2a9 + 729e90e commit 2532484

File tree

2 files changed

+7
-31
lines changed

2 files changed

+7
-31
lines changed

src/main/java/rx/internal/schedulers/EventLoopsScheduler.java

+1-4
Original file line numberDiff line numberDiff line change
@@ -117,10 +117,7 @@ public Subscription schedule(Action0 action) {
117117
if (isUnsubscribed()) {
118118
return Subscriptions.unsubscribed();
119119
}
120-
ScheduledAction s = poolWorker.scheduleActual(action, 0, null);
121-
122-
serial.add(s);
123-
s.addParent(serial);
120+
ScheduledAction s = poolWorker.scheduleActual(action, 0, null, serial);
124121

125122
return s;
126123
}

src/main/java/rx/internal/util/SubscriptionList.java

+6-27
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,7 @@
1515
*/
1616
package rx.internal.util;
1717

18-
import java.util.ArrayList;
19-
import java.util.Arrays;
20-
import java.util.Collection;
21-
import java.util.LinkedList;
22-
import java.util.List;
23-
import java.util.concurrent.locks.ReentrantLock;
18+
import java.util.*;
2419

2520
import rx.Subscription;
2621
import rx.exceptions.Exceptions;
@@ -34,7 +29,6 @@ public final class SubscriptionList implements Subscription {
3429

3530
private LinkedList<Subscription> subscriptions;
3631
private volatile boolean unsubscribed;
37-
private final ReentrantLock lock = new ReentrantLock();
3832

3933
public SubscriptionList() {
4034
}
@@ -66,8 +60,7 @@ public void add(final Subscription s) {
6660
return;
6761
}
6862
if (!unsubscribed) {
69-
lock.lock();
70-
try {
63+
synchronized (this) {
7164
if (!unsubscribed) {
7265
LinkedList<Subscription> subs = subscriptions;
7366
if (subs == null) {
@@ -77,8 +70,6 @@ public void add(final Subscription s) {
7770
subs.add(s);
7871
return;
7972
}
80-
} finally {
81-
lock.unlock();
8273
}
8374
}
8475
// call after leaving the synchronized block so we're not holding a lock while executing this
@@ -88,15 +79,12 @@ public void add(final Subscription s) {
8879
public void remove(final Subscription s) {
8980
if (!unsubscribed) {
9081
boolean unsubscribe = false;
91-
lock.lock();
92-
try {
82+
synchronized (this) {
9383
LinkedList<Subscription> subs = subscriptions;
9484
if (unsubscribed || subs == null) {
9585
return;
9686
}
9787
unsubscribe = subs.remove(s);
98-
} finally {
99-
lock.unlock();
10088
}
10189
if (unsubscribe) {
10290
// if we removed successfully we then need to call unsubscribe on it (outside of the lock)
@@ -113,16 +101,13 @@ public void remove(final Subscription s) {
113101
public void unsubscribe() {
114102
if (!unsubscribed) {
115103
List<Subscription> list;
116-
lock.lock();
117-
try {
104+
synchronized (this) {
118105
if (unsubscribed) {
119106
return;
120107
}
121108
unsubscribed = true;
122109
list = subscriptions;
123110
subscriptions = null;
124-
} finally {
125-
lock.unlock();
126111
}
127112
// we will only get here once
128113
unsubscribeFromAll(list);
@@ -150,12 +135,9 @@ private static void unsubscribeFromAll(Collection<Subscription> subscriptions) {
150135
public void clear() {
151136
if (!unsubscribed) {
152137
List<Subscription> list;
153-
lock.lock();
154-
try {
138+
synchronized (this) {
155139
list = subscriptions;
156140
subscriptions = null;
157-
} finally {
158-
lock.unlock();
159141
}
160142
unsubscribeFromAll(list);
161143
}
@@ -166,11 +148,8 @@ public void clear() {
166148
*/
167149
public boolean hasSubscriptions() {
168150
if (!unsubscribed) {
169-
lock.lock();
170-
try {
151+
synchronized (this) {
171152
return !unsubscribed && subscriptions != null && !subscriptions.isEmpty();
172-
} finally {
173-
lock.unlock();
174153
}
175154
}
176155
return false;

0 commit comments

Comments
 (0)