Skip to content
This repository has been archived by the owner on Jan 23, 2023. It is now read-only.

Commit

Permalink
Add token to IValueTaskSource
Browse files Browse the repository at this point in the history
  • Loading branch information
stephentoub committed Mar 1, 2018
1 parent 0c19df6 commit 6676f53
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 57 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public void OnCompleted(Action continuation)
}
else if (_value._obj != null)
{
_value.UnsafeValueTaskSource.OnCompleted(ValueTaskAwaiter.s_invokeActionDelegate, continuation,
_value.UnsafeValueTaskSource.OnCompleted(ValueTaskAwaiter.s_invokeActionDelegate, continuation, _value._token,
ValueTaskSourceOnCompletedFlags.FlowExecutionContext |
(_value.ContinueOnCapturedContext ? ValueTaskSourceOnCompletedFlags.UseSchedulingContext : ValueTaskSourceOnCompletedFlags.None));
}
Expand All @@ -82,7 +82,7 @@ public void UnsafeOnCompleted(Action continuation)
}
else if (_value._obj != null)
{
_value.UnsafeValueTaskSource.OnCompleted(ValueTaskAwaiter.s_invokeActionDelegate, continuation,
_value.UnsafeValueTaskSource.OnCompleted(ValueTaskAwaiter.s_invokeActionDelegate, continuation, _value._token,
_value.ContinueOnCapturedContext ? ValueTaskSourceOnCompletedFlags.UseSchedulingContext : ValueTaskSourceOnCompletedFlags.None);
}
else
Expand All @@ -100,7 +100,7 @@ void IValueTaskAwaiter.AwaitUnsafeOnCompleted(IAsyncStateMachineBox box)
}
else if (_value._obj != null)
{
_value.UnsafeValueTaskSource.OnCompleted(ValueTaskAwaiter.s_invokeAsyncStateMachineBox, box,
_value.UnsafeValueTaskSource.OnCompleted(ValueTaskAwaiter.s_invokeAsyncStateMachineBox, box, _value._token,
_value.ContinueOnCapturedContext ? ValueTaskSourceOnCompletedFlags.UseSchedulingContext : ValueTaskSourceOnCompletedFlags.None);
}
else
Expand Down Expand Up @@ -165,7 +165,7 @@ public void OnCompleted(Action continuation)
}
else if (_value._obj != null)
{
_value.UnsafeValueTaskSource.OnCompleted(ValueTaskAwaiter.s_invokeActionDelegate, continuation,
_value.UnsafeValueTaskSource.OnCompleted(ValueTaskAwaiter.s_invokeActionDelegate, continuation, _value._token,
ValueTaskSourceOnCompletedFlags.FlowExecutionContext |
(_value.ContinueOnCapturedContext ? ValueTaskSourceOnCompletedFlags.UseSchedulingContext : ValueTaskSourceOnCompletedFlags.None));
}
Expand All @@ -184,7 +184,7 @@ public void UnsafeOnCompleted(Action continuation)
}
else if (_value._obj != null)
{
_value.UnsafeValueTaskSource.OnCompleted(ValueTaskAwaiter.s_invokeActionDelegate, continuation,
_value.UnsafeValueTaskSource.OnCompleted(ValueTaskAwaiter.s_invokeActionDelegate, continuation, _value._token,
_value.ContinueOnCapturedContext ? ValueTaskSourceOnCompletedFlags.UseSchedulingContext : ValueTaskSourceOnCompletedFlags.None);
}
else
Expand All @@ -202,7 +202,7 @@ void IValueTaskAwaiter.AwaitUnsafeOnCompleted(IAsyncStateMachineBox box)
}
else if (_value._obj != null)
{
_value.UnsafeValueTaskSource.OnCompleted(ValueTaskAwaiter.s_invokeAsyncStateMachineBox, box,
_value.UnsafeValueTaskSource.OnCompleted(ValueTaskAwaiter.s_invokeAsyncStateMachineBox, box, _value._token,
_value.ContinueOnCapturedContext ? ValueTaskSourceOnCompletedFlags.UseSchedulingContext : ValueTaskSourceOnCompletedFlags.None);
}
else
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public void OnCompleted(Action continuation)
}
else if (_value._obj != null)
{
_value.UnsafeValueTaskSource.OnCompleted(s_invokeActionDelegate, continuation, ValueTaskSourceOnCompletedFlags.UseSchedulingContext | ValueTaskSourceOnCompletedFlags.FlowExecutionContext);
_value.UnsafeValueTaskSource.OnCompleted(s_invokeActionDelegate, continuation, _value._token, ValueTaskSourceOnCompletedFlags.UseSchedulingContext | ValueTaskSourceOnCompletedFlags.FlowExecutionContext);
}
else
{
Expand All @@ -70,7 +70,7 @@ public void UnsafeOnCompleted(Action continuation)
}
else if (_value._obj != null)
{
_value.UnsafeValueTaskSource.OnCompleted(s_invokeActionDelegate, continuation, ValueTaskSourceOnCompletedFlags.UseSchedulingContext);
_value.UnsafeValueTaskSource.OnCompleted(s_invokeActionDelegate, continuation, _value._token, ValueTaskSourceOnCompletedFlags.UseSchedulingContext);
}
else
{
Expand All @@ -87,7 +87,7 @@ void IValueTaskAwaiter.AwaitUnsafeOnCompleted(IAsyncStateMachineBox box)
}
else if (_value._obj != null)
{
_value.UnsafeValueTaskSource.OnCompleted(s_invokeAsyncStateMachineBox, box, ValueTaskSourceOnCompletedFlags.UseSchedulingContext);
_value.UnsafeValueTaskSource.OnCompleted(s_invokeAsyncStateMachineBox, box, _value._token, ValueTaskSourceOnCompletedFlags.UseSchedulingContext);
}
else
{
Expand Down Expand Up @@ -144,7 +144,7 @@ public void OnCompleted(Action continuation)
}
else if (_value._obj != null)
{
_value.UnsafeValueTaskSource.OnCompleted(ValueTaskAwaiter.s_invokeActionDelegate, continuation, ValueTaskSourceOnCompletedFlags.UseSchedulingContext | ValueTaskSourceOnCompletedFlags.FlowExecutionContext);
_value.UnsafeValueTaskSource.OnCompleted(ValueTaskAwaiter.s_invokeActionDelegate, continuation, _value._token, ValueTaskSourceOnCompletedFlags.UseSchedulingContext | ValueTaskSourceOnCompletedFlags.FlowExecutionContext);
}
else
{
Expand All @@ -161,7 +161,7 @@ public void UnsafeOnCompleted(Action continuation)
}
else if (_value._obj != null)
{
_value.UnsafeValueTaskSource.OnCompleted(ValueTaskAwaiter.s_invokeActionDelegate, continuation, ValueTaskSourceOnCompletedFlags.UseSchedulingContext);
_value.UnsafeValueTaskSource.OnCompleted(ValueTaskAwaiter.s_invokeActionDelegate, continuation, _value._token, ValueTaskSourceOnCompletedFlags.UseSchedulingContext);
}
else
{
Expand All @@ -178,7 +178,7 @@ void IValueTaskAwaiter.AwaitUnsafeOnCompleted(IAsyncStateMachineBox box)
}
else if (_value._obj != null)
{
_value.UnsafeValueTaskSource.OnCompleted(ValueTaskAwaiter.s_invokeAsyncStateMachineBox, box, ValueTaskSourceOnCompletedFlags.UseSchedulingContext);
_value.UnsafeValueTaskSource.OnCompleted(ValueTaskAwaiter.s_invokeAsyncStateMachineBox, box, _value._token, ValueTaskSourceOnCompletedFlags.UseSchedulingContext);
}
else
{
Expand Down
20 changes: 13 additions & 7 deletions src/mscorlib/shared/System/Threading/Tasks/IValueTaskSource.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,32 +46,38 @@ public enum ValueTaskSourceStatus
public interface IValueTaskSource
{
/// <summary>Gets the status of the current operation.</summary>
ValueTaskSourceStatus Status { get; }

/// <param name="token">Opaque value that was provided to the <see cref="ValueTask"/>'s constructor.</param>
ValueTaskSourceStatus GetStatus(short token);

/// <summary>Schedules the continuation action for this <see cref="IValueTaskSource"/>.</summary>
/// <param name="continuation">The continuation to invoke when the operation has completed.</param>
/// <param name="state">The state object to pass to <paramref name="continuation"/> when it's invoked.</param>
/// <param name="token">Opaque value that was provided to the <see cref="ValueTask"/>'s constructor.</param>
/// <param name="flags">The flags describing the behavior of the continuation.</param>
void OnCompleted(Action<object> continuation, object state, ValueTaskSourceOnCompletedFlags flags);
void OnCompleted(Action<object> continuation, object state, short token, ValueTaskSourceOnCompletedFlags flags);

/// <summary>Gets the result of the <see cref="IValueTaskSource"/>.</summary>
void GetResult();
/// <param name="token">Opaque value that was provided to the <see cref="ValueTask"/>'s constructor.</param>
void GetResult(short token);
}

/// <summary>Represents an object that can be wrapped by a <see cref="ValueTask{TResult}"/>.</summary>
/// <typeparam name="TResult">Specifies the type of data returned from the object.</typeparam>
public interface IValueTaskSource<out TResult>
{
/// <summary>Gets the status of the current operation.</summary>
ValueTaskSourceStatus Status { get; }
/// <param name="token">Opaque value that was provided to the <see cref="ValueTask"/>'s constructor.</param>
ValueTaskSourceStatus GetStatus(short token);

/// <summary>Schedules the continuation action for this <see cref="IValueTaskSource{TResult}"/>.</summary>
/// <param name="continuation">The continuation to invoke when the operation has completed.</param>
/// <param name="state">The state object to pass to <paramref name="continuation"/> when it's invoked.</param>
/// <param name="token">Opaque value that was provided to the <see cref="ValueTask"/>'s constructor.</param>
/// <param name="flags">The flags describing the behavior of the continuation.</param>
void OnCompleted(Action<object> continuation, object state, ValueTaskSourceOnCompletedFlags flags);
void OnCompleted(Action<object> continuation, object state, short token, ValueTaskSourceOnCompletedFlags flags);

/// <summary>Gets the result of the <see cref="IValueTaskSource{TResult}"/>.</summary>
TResult GetResult();
/// <param name="token">Opaque value that was provided to the <see cref="ValueTask"/>'s constructor.</param>
TResult GetResult(short token);
}
}
Loading

0 comments on commit 6676f53

Please sign in to comment.