Skip to content

Commit c325c57

Browse files
committed
wip
1 parent b91057c commit c325c57

File tree

2 files changed

+32
-33
lines changed

2 files changed

+32
-33
lines changed

src/Compiler/Utilities/Async2.fs

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -476,38 +476,38 @@ module Async2 =
476476

477477
let inline start ct (code: Async2<_>) =
478478
let oldCt = CheckAndThrowToken.Value
479+
let oldStarted = BindContext.started.Value
480+
481+
let immediate =
482+
not oldStarted
483+
&& isNull SynchronizationContext.Current
484+
&& TaskScheduler.Current = TaskScheduler.Default
479485

480486
try
481487
BindContext.started.Value <- true
482488
CheckAndThrowToken.Value <- ct
483-
code.StartImmediate ct
489+
if immediate then
490+
code.StartImmediate ct |> _.Task
491+
else
492+
Task.Run<'t>(fun () -> code.StartImmediate ct |> _.Task)
484493
finally
485494
CheckAndThrowToken.Value <- oldCt
486-
BindContext.started.Value <- false
495+
BindContext.started.Value <- oldStarted
487496

488-
let run ct (code: Async2<'t>) =
489-
490-
if
491-
not BindContext.started.Value // should this be an assert fail or even an exception instead?
492-
&& isNull SynchronizationContext.Current
493-
&& TaskScheduler.Current = TaskScheduler.Default
494-
then
495-
start ct code |> _.GetAwaiter().GetResult()
496-
else
497-
Task.Run<'t>(fun () -> start ct code |> _.Task).GetAwaiter().GetResult()
497+
let run ct (code: Async2<'t>) = start ct code |> _.GetAwaiter().GetResult()
498498

499499
let runWithoutCancellation code = run CancellationToken.None code
500500

501-
let queueTask ct code =
502-
Task.Run<'t>(fun () -> start ct code |> _.Task)
501+
//let queueTask ct code =
502+
// Task.Run<'t>(fun () -> start ct code)
503503

504504
let startAsTaskWithoutCancellation code =
505-
queueTask CancellationToken.None code
505+
start CancellationToken.None code
506506

507507
let toAsync (code: Async2<'t>) =
508508
async {
509509
let! ct = Async.CancellationToken
510-
let task = queueTask ct code
510+
let task = start ct code
511511
return! Async.AwaitTask task
512512
}
513513

@@ -529,11 +529,11 @@ type Async2 =
529529

530530
static member Start(computation: Async2<_>, ?cancellationToken: CancellationToken) : unit =
531531
let ct = defaultArg cancellationToken CancellationToken.None
532-
Async2.queueTask ct computation |> ignore
532+
Async2.start ct computation |> ignore
533533

534534
static member StartAsTask(computation: Async2<_>, ?cancellationToken: CancellationToken) : Task<_> =
535535
let ct = defaultArg cancellationToken CancellationToken.None
536-
Async2.queueTask ct computation
536+
Async2.start ct computation
537537

538538
static member RunImmediate(computation: Async2<'T>, ?cancellationToken: CancellationToken) : 'T =
539539
let ct = defaultArg cancellationToken CancellationToken.None
@@ -554,7 +554,7 @@ type Async2 =
554554
lcts.Cancel()
555555
return raise exn
556556
}
557-
|> Async2.queueTask lcts.Token
557+
|> Async2.start lcts.Token
558558
}
559559

560560
return! Task.WhenAll tasks
@@ -583,25 +583,25 @@ type Async2 =
583583
static member TryCancelled(computation: Async2<'T>, compensation) =
584584
async2 {
585585
let! ct = Async2.CancellationToken
586-
let invocation = Async2.start ct computation
586+
let task = Async2.start ct computation
587587

588588
try
589-
return! invocation
589+
return! task
590590
finally
591-
if invocation.Task.IsCanceled then
591+
if task.IsCanceled then
592592
compensation ()
593593
}
594594

595595
static member StartChild(computation: Async2<'T>) : Async2<Async2<'T>> =
596596
async2 {
597597
let! ct = Async2.CancellationToken
598-
return async2 { return! computation |> Async2.queueTask ct }
598+
return async2 { return! computation |> Async2.start ct }
599599
}
600600

601601
static member StartChildAsTask(computation: Async2<'T>) : Async2<Task<'T>> =
602602
async2 {
603603
let! ct = Async2.CancellationToken
604-
let task = computation |> Async2.queueTask ct
604+
let task = computation |> Async2.start ct
605605
return task
606606
}
607607

tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.bsl

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12422,10 +12422,6 @@ Internal.Utilities.Library.Async2Implementation+Async2Code: Microsoft.FSharp.Cor
1242212422
Internal.Utilities.Library.Async2Implementation+Async2Code: Microsoft.FSharp.Core.CompilerServices.ResumableCode`2[Internal.Utilities.Library.Async2Implementation+Async2Data`1[a],b] yieldOnBindLimit[a,b]()
1242312423
Internal.Utilities.Library.Async2Implementation+Async2Code: Microsoft.FSharp.Core.CompilerServices.ResumableCode`2[Internal.Utilities.Library.Async2Implementation+Async2Data`1[a],c] filterCancellation[a,b,c](Microsoft.FSharp.Core.FSharpFunc`2[System.Exception,Microsoft.FSharp.Core.CompilerServices.ResumableCode`2[Internal.Utilities.Library.Async2Implementation+Async2Data`1[a],b]], System.Exception)
1242412424
Internal.Utilities.Library.Async2Implementation+Async2Code: Microsoft.FSharp.Core.CompilerServices.ResumableCode`2[Internal.Utilities.Library.Async2Implementation+Async2Data`1[a],c] throwIfCancellationRequested[a,b,c](Microsoft.FSharp.Core.CompilerServices.ResumableCode`2[Internal.Utilities.Library.Async2Implementation+Async2Data`1[a],b])
12425-
Internal.Utilities.Library.Async2Implementation+Async2Context: Boolean IncrementBindCount()
12426-
Internal.Utilities.Library.Async2Implementation+Async2Context: Int32 bindLimit
12427-
Internal.Utilities.Library.Async2Implementation+Async2Context: System.Threading.ThreadLocal`1[System.Int32] bindCount
12428-
Internal.Utilities.Library.Async2Implementation+Async2Context: System.Threading.ThreadLocal`1[System.Int32] get_bindCount()
1242912425
Internal.Utilities.Library.Async2Implementation+Async2Data`1[t]: Boolean Equals(Async2Data`1)
1243012426
Internal.Utilities.Library.Async2Implementation+Async2Data`1[t]: Boolean Equals(Async2Data`1, System.Collections.IEqualityComparer)
1243112427
Internal.Utilities.Library.Async2Implementation+Async2Data`1[t]: Boolean Equals(System.Object)
@@ -12457,6 +12453,13 @@ Internal.Utilities.Library.Async2Implementation+Awaiter: Void unsafeOnCompleted$
1245712453
Internal.Utilities.Library.Async2Implementation+Awaiter: Void unsafeOnCompleted[a,b](a, System.Action)
1245812454
Internal.Utilities.Library.Async2Implementation+Awaiter: b getResult$W[a,b](Microsoft.FSharp.Core.FSharpFunc`2[a,b], Microsoft.FSharp.Core.FSharpFunc`2[a,System.Boolean], a)
1245912455
Internal.Utilities.Library.Async2Implementation+Awaiter: b getResult[a,b](a)
12456+
Internal.Utilities.Library.Async2Implementation+BindContext: Boolean IncrementBindCount()
12457+
Internal.Utilities.Library.Async2Implementation+BindContext: Int32 bindLimit
12458+
Internal.Utilities.Library.Async2Implementation+BindContext: System.Threading.AsyncLocal`1[System.Boolean] get_started()
12459+
Internal.Utilities.Library.Async2Implementation+BindContext: System.Threading.AsyncLocal`1[System.Boolean] started
12460+
Internal.Utilities.Library.Async2Implementation+BindContext: System.Threading.ThreadLocal`1[System.Int32] bindCount
12461+
Internal.Utilities.Library.Async2Implementation+BindContext: System.Threading.ThreadLocal`1[System.Int32] get_bindCount()
12462+
Internal.Utilities.Library.Async2Implementation+BindContext: Void Reset()
1246012463
Internal.Utilities.Library.Async2Implementation+DynamicState+Awaiting: System.Runtime.CompilerServices.ICriticalNotifyCompletion Item
1246112464
Internal.Utilities.Library.Async2Implementation+DynamicState+Awaiting: System.Runtime.CompilerServices.ICriticalNotifyCompletion get_Item()
1246212465
Internal.Utilities.Library.Async2Implementation+DynamicState+Bounce: DynamicState Item
@@ -12511,25 +12514,21 @@ Internal.Utilities.Library.Async2Implementation+ExceptionCache: System.Runtime.E
1251112514
Internal.Utilities.Library.Async2Implementation+ExceptionCache: a Throw[a](System.Exception)
1251212515
Internal.Utilities.Library.Async2Implementation+ExceptionCache: b GetResultOrThrow$W[a,b](Microsoft.FSharp.Core.FSharpFunc`2[a,b], Microsoft.FSharp.Core.FSharpFunc`2[a,System.Boolean], a)
1251312516
Internal.Utilities.Library.Async2Implementation+ExceptionCache: b GetResultOrThrow[a,b](a)
12514-
Internal.Utilities.Library.Async2Implementation+Trampoline: Boolean Running
12515-
Internal.Utilities.Library.Async2Implementation+Trampoline: Boolean get_Running()
1251612517
Internal.Utilities.Library.Async2Implementation+Trampoline: Microsoft.FSharp.Core.FSharpRef`1[System.Runtime.CompilerServices.ICriticalNotifyCompletion] Ref
1251712518
Internal.Utilities.Library.Async2Implementation+Trampoline: Microsoft.FSharp.Core.FSharpRef`1[System.Runtime.CompilerServices.ICriticalNotifyCompletion] get_Ref()
1251812519
Internal.Utilities.Library.Async2Implementation+Trampoline: Trampoline Current
1251912520
Internal.Utilities.Library.Async2Implementation+Trampoline: Trampoline get_Current()
12520-
Internal.Utilities.Library.Async2Implementation+Trampoline: Void Set(System.Action)
1252112521
Internal.Utilities.Library.Async2Implementation: Internal.Utilities.Library.Async2Implementation+Async2Builder
1252212522
Internal.Utilities.Library.Async2Implementation: Internal.Utilities.Library.Async2Implementation+Async2Code
12523-
Internal.Utilities.Library.Async2Implementation: Internal.Utilities.Library.Async2Implementation+Async2Context
1252412523
Internal.Utilities.Library.Async2Implementation: Internal.Utilities.Library.Async2Implementation+Async2Data`1[t]
1252512524
Internal.Utilities.Library.Async2Implementation: Internal.Utilities.Library.Async2Implementation+Async2Dynamic`2[t,m]
1252612525
Internal.Utilities.Library.Async2Implementation: Internal.Utilities.Library.Async2Implementation+Async2`2[t,m]
1252712526
Internal.Utilities.Library.Async2Implementation: Internal.Utilities.Library.Async2Implementation+Awaitable
1252812527
Internal.Utilities.Library.Async2Implementation: Internal.Utilities.Library.Async2Implementation+Awaiter
12528+
Internal.Utilities.Library.Async2Implementation: Internal.Utilities.Library.Async2Implementation+BindContext
1252912529
Internal.Utilities.Library.Async2Implementation: Internal.Utilities.Library.Async2Implementation+DynamicState
1253012530
Internal.Utilities.Library.Async2Implementation: Internal.Utilities.Library.Async2Implementation+ExceptionCache
1253112531
Internal.Utilities.Library.Async2Implementation: Internal.Utilities.Library.Async2Implementation+Trampoline
12532-
Internal.Utilities.Library.Async2Implementation: Void failIfNot(Boolean, System.String)
1253312532
Internal.Utilities.Library.Async2Module: Internal.Utilities.Library.Async2`1[System.Threading.CancellationToken] CancellationToken
1253412533
Internal.Utilities.Library.Async2Module: Internal.Utilities.Library.Async2`1[System.Threading.CancellationToken] get_CancellationToken()
1253512534
Internal.Utilities.Library.Async2Module: Internal.Utilities.Library.Async2`1[t] fromValue[t](t)

0 commit comments

Comments
 (0)