Skip to content

Commit a8385a8

Browse files
authored
An allocation in BasicProducer.SubscribeRaw can be saved in most cases. (#602)
1 parent a18e4da commit a8385a8

File tree

1 file changed

+12
-8
lines changed

1 file changed

+12
-8
lines changed

Rx.NET/Source/src/System.Reactive/Internal/Producer.cs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,31 +38,35 @@ public IDisposable Subscribe(IObserver<TSource> observer)
3838

3939
public IDisposable SubscribeRaw(IObserver<TSource> observer, bool enableSafeguard)
4040
{
41-
var subscription = new SingleAssignmentDisposable();
41+
IDisposable run;
42+
ISafeObserver<TSource> safeObserver = null;
4243

4344
//
4445
// See AutoDetachObserver.cs for more information on the safeguarding requirement and
4546
// its implementation aspects.
4647
//
4748
if (enableSafeguard)
4849
{
49-
var safeObserver = SafeObserver<TSource>.Wrap(observer);
50-
safeObserver.SetResource(subscription);
51-
observer = safeObserver;
50+
observer = safeObserver = SafeObserver<TSource>.Wrap(observer);
5251
}
5352

5453
if (CurrentThreadScheduler.IsScheduleRequired)
5554
{
55+
var runAssignable = new SingleAssignmentDisposable();
56+
5657
CurrentThreadScheduler.Instance.ScheduleAction(
57-
(@this: this, subscription, observer),
58-
tuple => tuple.subscription.Disposable = tuple.@this.Run(tuple.observer));
58+
(@this: this, runAssignable, observer),
59+
tuple => tuple.runAssignable.Disposable = tuple.@this.Run(tuple.observer));
60+
61+
run = runAssignable;
5962
}
6063
else
6164
{
62-
subscription.Disposable = Run(observer);
65+
run = Run(observer);
6366
}
6467

65-
return subscription;
68+
safeObserver?.SetResource(run);
69+
return run;
6670
}
6771

6872
/// <summary>

0 commit comments

Comments
 (0)