Skip to content

Commit

Permalink
Improve Akka.Actor.Cancelable (#6032)
Browse files Browse the repository at this point in the history
* Improve Cancelable

- Add new Create methods that takes CancellationToken params
- Clean up the Dispose method
- Expose the _isDisposed field as a property

* Update API Verify list

* Re-add try...catch block

* moved `IsDisposed=true` inside the `finally` block

Co-authored-by: Aaron Stannard <aaron@petabridge.com>
  • Loading branch information
Arkatufus and Aaronontheweb committed Jul 21, 2022
1 parent 0c92aac commit e9b643f
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 25 deletions.
Expand Up @@ -492,6 +492,7 @@ namespace Akka.Actor
public Cancelable(Akka.Actor.IScheduler scheduler) { }
public Cancelable(Akka.Actor.IActionScheduler scheduler) { }
public bool IsCancellationRequested { get; }
public bool IsDisposed { get; }
public System.Threading.CancellationToken Token { get; }
public void Cancel() { }
public void Cancel(bool throwOnFirstException) { }
Expand All @@ -500,6 +501,8 @@ namespace Akka.Actor
public static Akka.Actor.ICancelable CreateCanceled() { }
public static Akka.Actor.ICancelable CreateLinkedCancelable(Akka.Actor.IScheduler scheduler, params Akka.Actor.ICancelable[] cancelables) { }
public static Akka.Actor.ICancelable CreateLinkedCancelable(Akka.Actor.IActionScheduler scheduler, params Akka.Actor.ICancelable[] cancelables) { }
public static Akka.Actor.ICancelable CreateLinkedCancelable(Akka.Actor.IScheduler scheduler, params System.Threading.CancellationToken[] cancellationTokens) { }
public static Akka.Actor.ICancelable CreateLinkedCancelable(Akka.Actor.IActionScheduler scheduler, params System.Threading.CancellationToken[] cancellationTokens) { }
public void Dispose() { }
protected virtual void Dispose(bool disposing) { }
}
Expand Down
Expand Up @@ -492,6 +492,7 @@ namespace Akka.Actor
public Cancelable(Akka.Actor.IScheduler scheduler) { }
public Cancelable(Akka.Actor.IActionScheduler scheduler) { }
public bool IsCancellationRequested { get; }
public bool IsDisposed { get; }
public System.Threading.CancellationToken Token { get; }
public void Cancel() { }
public void Cancel(bool throwOnFirstException) { }
Expand All @@ -500,6 +501,8 @@ namespace Akka.Actor
public static Akka.Actor.ICancelable CreateCanceled() { }
public static Akka.Actor.ICancelable CreateLinkedCancelable(Akka.Actor.IScheduler scheduler, params Akka.Actor.ICancelable[] cancelables) { }
public static Akka.Actor.ICancelable CreateLinkedCancelable(Akka.Actor.IActionScheduler scheduler, params Akka.Actor.ICancelable[] cancelables) { }
public static Akka.Actor.ICancelable CreateLinkedCancelable(Akka.Actor.IScheduler scheduler, params System.Threading.CancellationToken[] cancellationTokens) { }
public static Akka.Actor.ICancelable CreateLinkedCancelable(Akka.Actor.IActionScheduler scheduler, params System.Threading.CancellationToken[] cancellationTokens) { }
public void Dispose() { }
protected virtual void Dispose(bool disposing) { }
}
Expand Down
Expand Up @@ -492,6 +492,7 @@ namespace Akka.Actor
public Cancelable(Akka.Actor.IScheduler scheduler) { }
public Cancelable(Akka.Actor.IActionScheduler scheduler) { }
public bool IsCancellationRequested { get; }
public bool IsDisposed { get; }
public System.Threading.CancellationToken Token { get; }
public void Cancel() { }
public void Cancel(bool throwOnFirstException) { }
Expand All @@ -500,6 +501,8 @@ namespace Akka.Actor
public static Akka.Actor.ICancelable CreateCanceled() { }
public static Akka.Actor.ICancelable CreateLinkedCancelable(Akka.Actor.IScheduler scheduler, params Akka.Actor.ICancelable[] cancelables) { }
public static Akka.Actor.ICancelable CreateLinkedCancelable(Akka.Actor.IActionScheduler scheduler, params Akka.Actor.ICancelable[] cancelables) { }
public static Akka.Actor.ICancelable CreateLinkedCancelable(Akka.Actor.IScheduler scheduler, params System.Threading.CancellationToken[] cancellationTokens) { }
public static Akka.Actor.ICancelable CreateLinkedCancelable(Akka.Actor.IActionScheduler scheduler, params System.Threading.CancellationToken[] cancellationTokens) { }
public void Dispose() { }
protected virtual void Dispose(bool disposing) { }
}
Expand Down
44 changes: 19 additions & 25 deletions src/core/Akka/Actor/Cancellation/Cancelable.cs
Expand Up @@ -90,6 +90,7 @@ internal Cancelable(IActionScheduler scheduler, CancellationTokenSource source)
/// <inheritdoc/>
public CancellationToken Token => _source.Token;

public bool IsDisposed { get; private set; }

/// <inheritdoc/>
public void Cancel()
Expand Down Expand Up @@ -155,11 +156,7 @@ public static ICancelable CreateCanceled()
/// <param name="cancelables">The cancelables instances to observe.</param>
/// <returns>A new <see cref="ICancelable"/> that is linked to the source .</returns>
public static ICancelable CreateLinkedCancelable(IScheduler scheduler, params ICancelable[] cancelables)
{
var cancellationTokens = cancelables.Select(c => c.Token).ToArray();
var cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationTokens);
return new Cancelable(scheduler.Advanced, cts);
}
=> CreateLinkedCancelable(scheduler.Advanced, cancelables.Select(c => c.Token).ToArray());

/// <summary>
/// Creates a <see cref="ICancelable"/> that will be in the canceled state
Expand All @@ -169,22 +166,24 @@ public static ICancelable CreateLinkedCancelable(IScheduler scheduler, params IC
/// <param name="cancelables">The cancelables instances to observe.</param>
/// <returns>A new <see cref="ICancelable"/> that is linked to the source .</returns>
public static ICancelable CreateLinkedCancelable(IActionScheduler scheduler, params ICancelable[] cancelables)
=> CreateLinkedCancelable(scheduler, cancelables.Select(c => c.Token).ToArray());

public static ICancelable CreateLinkedCancelable(IScheduler scheduler, params CancellationToken[] cancellationTokens)
=> CreateLinkedCancelable(scheduler.Advanced, cancellationTokens);

public static ICancelable CreateLinkedCancelable(IActionScheduler scheduler, params CancellationToken[] cancellationTokens)
{
var cancellationTokens = cancelables.Select(c => c.Token).ToArray();
var cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationTokens);
return new Cancelable(scheduler, cts);
}



private void ThrowIfDisposed()
{
if(_isDisposed)
if(IsDisposed)
throw new ObjectDisposedException(null, "The cancelable has been disposed");
}

// Dispose ---------------------------------------------------------------
private bool _isDisposed; //Automatically initialized to false;


public void Dispose()
Expand All @@ -207,26 +206,21 @@ protected virtual void Dispose(bool disposing)
// runtime from inside the finalizer and you should not reference
// other objects. Only unmanaged resources can be disposed.

try
//Make sure Dispose does not get called more than once, by checking the disposed field
if(disposing)
{
//Make sure Dispose does not get called more than once, by checking the disposed field
if(!_isDisposed)
if(!IsDisposed)
{
if(disposing)
//Clean up managed resources
try
{
//Clean up managed resources
if(_source != null)
{
_source.Dispose();
}
_source?.Dispose();
}
//Clean up unmanaged resources
finally
{
IsDisposed = true;
}
}
_isDisposed = true;
}
finally
{
// base.dispose(disposing);
}
}
}
Expand Down

0 comments on commit e9b643f

Please sign in to comment.