From 23603ff3ed235d4a2c8fa4315e2546f11d64be6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1vid=20Karnok?= Date: Thu, 31 May 2018 21:11:50 +0200 Subject: [PATCH 1/2] 4.x: Inline disposability into ScheduledItem --- .../Concurrency/CurrentThreadScheduler.cs | 2 +- .../Concurrency/ScheduledItem.cs | 17 +++++++++++------ .../Api/ApiApprovalTests.Core.approved.txt | 3 ++- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/Rx.NET/Source/src/System.Reactive/Concurrency/CurrentThreadScheduler.cs b/Rx.NET/Source/src/System.Reactive/Concurrency/CurrentThreadScheduler.cs index 7a913721b3..3b3ec97a3a 100644 --- a/Rx.NET/Source/src/System.Reactive/Concurrency/CurrentThreadScheduler.cs +++ b/Rx.NET/Source/src/System.Reactive/Concurrency/CurrentThreadScheduler.cs @@ -103,7 +103,7 @@ public override IDisposable Schedule(TState state, TimeSpan dueTime, Fun queue.Enqueue(si); } - return Disposable.Create(si.Cancel); + return si; } private static class Trampoline diff --git a/Rx.NET/Source/src/System.Reactive/Concurrency/ScheduledItem.cs b/Rx.NET/Source/src/System.Reactive/Concurrency/ScheduledItem.cs index 81e9e81ee2..0ae591a1d8 100644 --- a/Rx.NET/Source/src/System.Reactive/Concurrency/ScheduledItem.cs +++ b/Rx.NET/Source/src/System.Reactive/Concurrency/ScheduledItem.cs @@ -11,10 +11,10 @@ namespace System.Reactive.Concurrency /// Abstract base class for scheduled work items. /// /// Absolute time representation type. - public abstract class ScheduledItem : IScheduledItem, IComparable> + public abstract class ScheduledItem : IScheduledItem, IComparable>, IDisposable where TAbsolute : IComparable { - private readonly SingleAssignmentDisposable _disposable = new SingleAssignmentDisposable(); + private IDisposable _disposable; private readonly IComparer _comparer; /// @@ -42,9 +42,9 @@ protected ScheduledItem(TAbsolute dueTime, IComparer comparer) /// public void Invoke() { - if (!_disposable.IsDisposed) + if (!Disposable.GetIsDisposed(ref _disposable)) { - _disposable.Disposable = InvokeCore(); + Disposable.SetSingle(ref _disposable, InvokeCore()); } } @@ -149,12 +149,17 @@ public int CompareTo(ScheduledItem other) /// /// Cancels the work item by disposing the resource returned by as soon as possible. /// - public void Cancel() => _disposable.Dispose(); + public void Cancel() => Dispose(); /// /// Gets whether the work item has received a cancellation request. /// - public bool IsCanceled => _disposable.IsDisposed; + public bool IsCanceled => Disposable.GetIsDisposed(ref _disposable); + + public void Dispose() + { + Disposable.TryDispose(ref _disposable); + } } /// diff --git a/Rx.NET/Source/tests/Tests.System.Reactive.ApiApprovals/Api/ApiApprovalTests.Core.approved.txt b/Rx.NET/Source/tests/Tests.System.Reactive.ApiApprovals/Api/ApiApprovalTests.Core.approved.txt index 0db13f8b7e..01c4197a9e 100644 --- a/Rx.NET/Source/tests/Tests.System.Reactive.ApiApprovals/Api/ApiApprovalTests.Core.approved.txt +++ b/Rx.NET/Source/tests/Tests.System.Reactive.ApiApprovals/Api/ApiApprovalTests.Core.approved.txt @@ -348,7 +348,7 @@ namespace System.Reactive.Concurrency public System.IDisposable SchedulePeriodic(TState state, System.TimeSpan period, System.Func action) { } public override System.Reactive.Concurrency.IStopwatch StartStopwatch() { } } - public abstract class ScheduledItem : System.IComparable>, System.Reactive.Concurrency.IScheduledItem + public abstract class ScheduledItem : System.IComparable>, System.IDisposable, System.Reactive.Concurrency.IScheduledItem where TAbsolute : System.IComparable<> { protected ScheduledItem(TAbsolute dueTime, System.Collections.Generic.IComparer comparer) { } @@ -356,6 +356,7 @@ namespace System.Reactive.Concurrency public bool IsCanceled { get; } public void Cancel() { } public int CompareTo(System.Reactive.Concurrency.ScheduledItem other) { } + public void Dispose() { } public override bool Equals(object obj) { } public override int GetHashCode() { } public void Invoke() { } From 8f0440f4eac200f164f0c6f5ec564ebabf349478 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1vid=20Karnok?= Date: Wed, 6 Jun 2018 22:43:12 +0200 Subject: [PATCH 2/2] Make IDisposable.Dispose not public --- .../Source/src/System.Reactive/Concurrency/ScheduledItem.cs | 6 +++--- .../Api/ApiApprovalTests.Core.approved.txt | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Rx.NET/Source/src/System.Reactive/Concurrency/ScheduledItem.cs b/Rx.NET/Source/src/System.Reactive/Concurrency/ScheduledItem.cs index 0ae591a1d8..d1764c342e 100644 --- a/Rx.NET/Source/src/System.Reactive/Concurrency/ScheduledItem.cs +++ b/Rx.NET/Source/src/System.Reactive/Concurrency/ScheduledItem.cs @@ -149,16 +149,16 @@ public int CompareTo(ScheduledItem other) /// /// Cancels the work item by disposing the resource returned by as soon as possible. /// - public void Cancel() => Dispose(); + public void Cancel() => Disposable.TryDispose(ref _disposable); /// /// Gets whether the work item has received a cancellation request. /// public bool IsCanceled => Disposable.GetIsDisposed(ref _disposable); - public void Dispose() + void IDisposable.Dispose() { - Disposable.TryDispose(ref _disposable); + Cancel(); } } diff --git a/Rx.NET/Source/tests/Tests.System.Reactive.ApiApprovals/Api/ApiApprovalTests.Core.approved.txt b/Rx.NET/Source/tests/Tests.System.Reactive.ApiApprovals/Api/ApiApprovalTests.Core.approved.txt index f51b9a5b16..b22c1dcd8f 100644 --- a/Rx.NET/Source/tests/Tests.System.Reactive.ApiApprovals/Api/ApiApprovalTests.Core.approved.txt +++ b/Rx.NET/Source/tests/Tests.System.Reactive.ApiApprovals/Api/ApiApprovalTests.Core.approved.txt @@ -356,7 +356,6 @@ namespace System.Reactive.Concurrency public bool IsCanceled { get; } public void Cancel() { } public int CompareTo(System.Reactive.Concurrency.ScheduledItem other) { } - public void Dispose() { } public override bool Equals(object obj) { } public override int GetHashCode() { } public void Invoke() { }