Skip to content

Commit 359ef10

Browse files
committed
make it configurable via property
1 parent e0929ee commit 359ef10

9 files changed

+197
-159
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public Worker createWorker() {
4646

4747
/** Worker that schedules tasks on the executor indirectly through a trampoline mechanism. */
4848
static final class ExecutorSchedulerWorker extends Scheduler.Worker implements Runnable {
49-
private final Throwable creationContext = new SchedulerContextException();
49+
private final Throwable creationContext = SchedulerContextException.create();
5050
final Executor executor;
5151
// TODO: use a better performing structure for task tracking
5252
final CompositeSubscription tasks;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
* @warn class description missing
3434
*/
3535
public class NewThreadWorker extends Scheduler.Worker implements Subscription {
36-
private final Throwable creationContext = new SchedulerContextException();
36+
private final Throwable creationContext = SchedulerContextException.create();
3737
private final ScheduledExecutorService executor;
3838
private final RxJavaSchedulersHook schedulersHook;
3939
volatile boolean isUnsubscribed;

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ public void run() {
6666
} else {
6767
ie = new IllegalStateException("Fatal Exception thrown on Scheduler.Worker thread.", e);
6868
}
69-
Exceptions.addCause(ie, creationContext);
69+
if (creationContext != null)
70+
Exceptions.addCause(ie, creationContext);
7071
RxJavaPlugins.getInstance().getErrorHandler().handleError(ie);
7172
Thread thread = Thread.currentThread();
7273
thread.getUncaughtExceptionHandler().uncaughtException(thread, ie);

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,14 @@
1919
* Used only for providing context around where work was scheduled should an error occur in a different thread.
2020
*/
2121
public class SchedulerContextException extends Exception {
22-
public SchedulerContextException() {
22+
public static Throwable create() {
23+
if (System.getProperty("rxjava.captureSchedulerContext", "false").equals("true")) {
24+
return new SchedulerContextException();
25+
}
26+
return null;
27+
}
28+
29+
private SchedulerContextException() {
2330
super("Asynchronous work scheduled at");
2431
}
2532

src/test/java/rx/schedulers/ComputationSchedulerTests.java

Lines changed: 37 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -176,43 +176,49 @@ public void testCancelledTaskRetention() throws InterruptedException {
176176
public void testStackTraceAcrossThreads() throws Throwable {
177177
final AtomicReference<Throwable> exceptionRef = new AtomicReference<Throwable>();
178178
final CountDownLatch done = new CountDownLatch(1);
179-
180-
RxJavaPlugins.getInstance().reset();
181-
RxJavaPlugins.getInstance().registerErrorHandler(new RxJavaErrorHandler() {
182-
@Override
183-
public void handleError(Throwable e) {
184-
exceptionRef.set(e);
185-
done.countDown();
186-
}
187-
});
188-
179+
System.setProperty("rxjava.captureSchedulerContext", "true");
180+
189181
try {
190-
getScheduler().createWorker().schedule(new Action0() {
182+
183+
RxJavaPlugins.getInstance().reset();
184+
RxJavaPlugins.getInstance().registerErrorHandler(new RxJavaErrorHandler() {
191185
@Override
192-
public void call() {
193-
throw new RuntimeException();
186+
public void handleError(Throwable e) {
187+
exceptionRef.set(e);
188+
done.countDown();
194189
}
195190
});
196-
} catch (Exception e) {
197-
exceptionRef.set(e);
198-
done.countDown();
199-
}
200-
201-
done.await();
202-
203-
Throwable exception = exceptionRef.get();
204-
Throwable e = exception;
205-
while (e != null) {
206-
StackTraceElement[] st = e.getStackTrace();
207-
for (StackTraceElement stackTraceElement : st) {
208-
if (stackTraceElement.getClassName().contains(getClass().getName())) {
209-
// pass we found this class in the stack trace.
210-
return;
191+
192+
try {
193+
getScheduler().createWorker().schedule(new Action0() {
194+
@Override
195+
public void call() {
196+
throw new RuntimeException();
197+
}
198+
});
199+
} catch (Exception e) {
200+
exceptionRef.set(e);
201+
done.countDown();
202+
}
203+
204+
done.await();
205+
206+
Throwable exception = exceptionRef.get();
207+
Throwable e = exception;
208+
while (e != null) {
209+
StackTraceElement[] st = e.getStackTrace();
210+
for (StackTraceElement stackTraceElement : st) {
211+
if (stackTraceElement.getClassName().contains(getClass().getName())) {
212+
// pass we found this class in the stack trace.
213+
return;
214+
}
211215
}
216+
e = e.getCause();
212217
}
213-
e = e.getCause();
218+
219+
throw exception;
220+
} finally {
221+
System.setProperty("rxjava.captureSchedulerContext", "false");
214222
}
215-
216-
throw exception;
217223
}
218224
}

src/test/java/rx/schedulers/ImmediateSchedulerTest.java

Lines changed: 37 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -112,43 +112,49 @@ public void call(String t) {
112112
public void testStackTraceAcrossThreads() throws Throwable {
113113
final AtomicReference<Throwable> exceptionRef = new AtomicReference<Throwable>();
114114
final CountDownLatch done = new CountDownLatch(1);
115-
116-
RxJavaPlugins.getInstance().reset();
117-
RxJavaPlugins.getInstance().registerErrorHandler(new RxJavaErrorHandler() {
118-
@Override
119-
public void handleError(Throwable e) {
120-
exceptionRef.set(e);
121-
done.countDown();
122-
}
123-
});
124-
115+
System.setProperty("rxjava.captureSchedulerContext", "true");
116+
125117
try {
126-
getScheduler().createWorker().schedule(new Action0() {
118+
119+
RxJavaPlugins.getInstance().reset();
120+
RxJavaPlugins.getInstance().registerErrorHandler(new RxJavaErrorHandler() {
127121
@Override
128-
public void call() {
129-
throw new RuntimeException();
122+
public void handleError(Throwable e) {
123+
exceptionRef.set(e);
124+
done.countDown();
130125
}
131126
});
132-
} catch (Exception e) {
133-
exceptionRef.set(e);
134-
done.countDown();
135-
}
136-
137-
done.await();
138-
139-
Throwable exception = exceptionRef.get();
140-
Throwable e = exception;
141-
while (e != null) {
142-
StackTraceElement[] st = e.getStackTrace();
143-
for (StackTraceElement stackTraceElement : st) {
144-
if (stackTraceElement.getClassName().contains(getClass().getName())) {
145-
// pass we found this class in the stack trace.
146-
return;
127+
128+
try {
129+
getScheduler().createWorker().schedule(new Action0() {
130+
@Override
131+
public void call() {
132+
throw new RuntimeException();
133+
}
134+
});
135+
} catch (Exception e) {
136+
exceptionRef.set(e);
137+
done.countDown();
138+
}
139+
140+
done.await();
141+
142+
Throwable exception = exceptionRef.get();
143+
Throwable e = exception;
144+
while (e != null) {
145+
StackTraceElement[] st = e.getStackTrace();
146+
for (StackTraceElement stackTraceElement : st) {
147+
if (stackTraceElement.getClassName().contains(getClass().getName())) {
148+
// pass we found this class in the stack trace.
149+
return;
150+
}
147151
}
152+
e = e.getCause();
148153
}
149-
e = e.getCause();
154+
155+
throw exception;
156+
} finally {
157+
System.setProperty("rxjava.captureSchedulerContext", "false");
150158
}
151-
152-
throw exception;
153159
}
154160
}

src/test/java/rx/schedulers/IoSchedulerTest.java

Lines changed: 37 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -92,43 +92,49 @@ public void testCancelledTaskRetention() throws InterruptedException {
9292
public void testStackTraceAcrossThreads() throws Throwable {
9393
final AtomicReference<Throwable> exceptionRef = new AtomicReference<Throwable>();
9494
final CountDownLatch done = new CountDownLatch(1);
95-
96-
RxJavaPlugins.getInstance().reset();
97-
RxJavaPlugins.getInstance().registerErrorHandler(new RxJavaErrorHandler() {
98-
@Override
99-
public void handleError(Throwable e) {
100-
exceptionRef.set(e);
101-
done.countDown();
102-
}
103-
});
104-
95+
System.setProperty("rxjava.captureSchedulerContext", "true");
96+
10597
try {
106-
getScheduler().createWorker().schedule(new Action0() {
98+
99+
RxJavaPlugins.getInstance().reset();
100+
RxJavaPlugins.getInstance().registerErrorHandler(new RxJavaErrorHandler() {
107101
@Override
108-
public void call() {
109-
throw new RuntimeException();
102+
public void handleError(Throwable e) {
103+
exceptionRef.set(e);
104+
done.countDown();
110105
}
111106
});
112-
} catch (Exception e) {
113-
exceptionRef.set(e);
114-
done.countDown();
115-
}
116-
117-
done.await();
118-
119-
Throwable exception = exceptionRef.get();
120-
Throwable e = exception;
121-
while (e != null) {
122-
StackTraceElement[] st = e.getStackTrace();
123-
for (StackTraceElement stackTraceElement : st) {
124-
if (stackTraceElement.getClassName().contains(getClass().getName())) {
125-
// pass we found this class in the stack trace.
126-
return;
107+
108+
try {
109+
getScheduler().createWorker().schedule(new Action0() {
110+
@Override
111+
public void call() {
112+
throw new RuntimeException();
113+
}
114+
});
115+
} catch (Exception e) {
116+
exceptionRef.set(e);
117+
done.countDown();
118+
}
119+
120+
done.await();
121+
122+
Throwable exception = exceptionRef.get();
123+
Throwable e = exception;
124+
while (e != null) {
125+
StackTraceElement[] st = e.getStackTrace();
126+
for (StackTraceElement stackTraceElement : st) {
127+
if (stackTraceElement.getClassName().contains(getClass().getName())) {
128+
// pass we found this class in the stack trace.
129+
return;
130+
}
127131
}
132+
e = e.getCause();
128133
}
129-
e = e.getCause();
134+
135+
throw exception;
136+
} finally {
137+
System.setProperty("rxjava.captureSchedulerContext", "false");
130138
}
131-
132-
throw exception;
133139
}
134140
}

src/test/java/rx/schedulers/NewThreadSchedulerTest.java

Lines changed: 37 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -90,43 +90,49 @@ public void call() {
9090
public void testStackTraceAcrossThreads() throws Throwable {
9191
final AtomicReference<Throwable> exceptionRef = new AtomicReference<Throwable>();
9292
final CountDownLatch done = new CountDownLatch(1);
93-
94-
RxJavaPlugins.getInstance().reset();
95-
RxJavaPlugins.getInstance().registerErrorHandler(new RxJavaErrorHandler() {
96-
@Override
97-
public void handleError(Throwable e) {
98-
exceptionRef.set(e);
99-
done.countDown();
100-
}
101-
});
102-
93+
System.setProperty("rxjava.captureSchedulerContext", "true");
94+
10395
try {
104-
getScheduler().createWorker().schedule(new Action0() {
96+
97+
RxJavaPlugins.getInstance().reset();
98+
RxJavaPlugins.getInstance().registerErrorHandler(new RxJavaErrorHandler() {
10599
@Override
106-
public void call() {
107-
throw new RuntimeException();
100+
public void handleError(Throwable e) {
101+
exceptionRef.set(e);
102+
done.countDown();
108103
}
109104
});
110-
} catch (Exception e) {
111-
exceptionRef.set(e);
112-
done.countDown();
113-
}
114-
115-
done.await();
116-
117-
Throwable exception = exceptionRef.get();
118-
Throwable e = exception;
119-
while (e != null) {
120-
StackTraceElement[] st = e.getStackTrace();
121-
for (StackTraceElement stackTraceElement : st) {
122-
if (stackTraceElement.getClassName().contains(getClass().getName())) {
123-
// pass we found this class in the stack trace.
124-
return;
105+
106+
try {
107+
getScheduler().createWorker().schedule(new Action0() {
108+
@Override
109+
public void call() {
110+
throw new RuntimeException();
111+
}
112+
});
113+
} catch (Exception e) {
114+
exceptionRef.set(e);
115+
done.countDown();
116+
}
117+
118+
done.await();
119+
120+
Throwable exception = exceptionRef.get();
121+
Throwable e = exception;
122+
while (e != null) {
123+
StackTraceElement[] st = e.getStackTrace();
124+
for (StackTraceElement stackTraceElement : st) {
125+
if (stackTraceElement.getClassName().contains(getClass().getName())) {
126+
// pass we found this class in the stack trace.
127+
return;
128+
}
125129
}
130+
e = e.getCause();
126131
}
127-
e = e.getCause();
132+
133+
throw exception;
134+
} finally {
135+
System.setProperty("rxjava.captureSchedulerContext", "false");
128136
}
129-
130-
throw exception;
131137
}
132138
}

0 commit comments

Comments
 (0)