Skip to content

Commit d9e3259

Browse files
committed
[SE-0304] Clean up handling of task priorities.
1 parent d8686f7 commit d9e3259

File tree

4 files changed

+21
-19
lines changed

4 files changed

+21
-19
lines changed

stdlib/public/Concurrency/Task.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -496,15 +496,18 @@ static AsyncTaskAndContext swift_task_create_commonImpl(
496496

497497
if (currentTask)
498498
jobFlags.setPriority(currentTask->getPriority());
499-
else
500-
// FIXME: Ideally, this should be setting priority based on
501-
// swift_task_getCurrentThreadPriority(). However, that creates
502-
// priority differences which lead to different kinds of hangs
503-
// Temporarily use Unspecified to work around that.
504-
// See also: PR #37939.
505-
jobFlags.setPriority(JobPriority::Unspecified);
499+
else if (taskCreateFlags.inheritContext())
500+
jobFlags.setPriority(swift_task_getCurrentThreadPriority());
506501
}
507502

503+
// Adjust user-interactive priorities down to user-initiated.
504+
if (jobFlags.getPriority() == JobPriority::UserInteractive)
505+
jobFlags.setPriority(JobPriority::UserInitiated);
506+
507+
// If there is still no job priority, use the default priority.
508+
if (jobFlags.getPriority() == JobPriority::Unspecified)
509+
jobFlags.setPriority(JobPriority::Default);
510+
508511
// Figure out the size of the header.
509512
size_t headerSize = sizeof(AsyncTask);
510513
if (parent) {

stdlib/public/Concurrency/Task.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ extension Task where Success == Never, Failure == Never {
269269
}
270270

271271
// Otherwise, query the system.
272-
return TaskPriority(rawValue: UInt8(0))
272+
return TaskPriority(rawValue: UInt8(_getCurrentThreadPriority()))
273273
}
274274
}
275275
}
@@ -632,11 +632,10 @@ extension Task where Success == Never, Failure == Never {
632632
/// As such,
633633
/// this method isn't necessarily a way to avoid resource starvation.
634634
public static func yield() async {
635-
let currentTask = Builtin.getCurrentAsyncTask()
636-
let priority = getJobFlags(currentTask).priority ?? Task.currentPriority._downgradeUserInteractive
637-
638635
return await Builtin.withUnsafeContinuation { (continuation: Builtin.RawUnsafeContinuation) -> Void in
639-
let job = _taskCreateNullaryContinuationJob(priority: Int(priority.rawValue), continuation: continuation)
636+
let job = _taskCreateNullaryContinuationJob(
637+
priority: Int(Task.currentPriority.rawValue),
638+
continuation: continuation)
640639
_enqueueJobGlobal(job)
641640
}
642641
}
@@ -708,7 +707,8 @@ public struct UnsafeCurrentTask {
708707
/// - SeeAlso: `TaskPriority`
709708
/// - SeeAlso: `Task.currentPriority`
710709
public var priority: TaskPriority {
711-
getJobFlags(_task).priority ?? .unspecified
710+
getJobFlags(_task).priority ?? TaskPriority(
711+
rawValue: UInt8(_getCurrentThreadPriority()))
712712
}
713713

714714
/// Cancel the current task.

stdlib/public/Concurrency/TaskSleep.swift

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,10 @@ extension Task where Success == Never, Failure == Never {
1919
///
2020
/// This function does _not_ block the underlying thread.
2121
public static func sleep(_ duration: UInt64) async {
22-
let currentTask = Builtin.getCurrentAsyncTask()
23-
let priority = getJobFlags(currentTask).priority ?? Task.currentPriority._downgradeUserInteractive
24-
2522
return await Builtin.withUnsafeContinuation { (continuation: Builtin.RawUnsafeContinuation) -> Void in
26-
let job = _taskCreateNullaryContinuationJob(priority: Int(priority.rawValue), continuation: continuation)
23+
let job = _taskCreateNullaryContinuationJob(
24+
priority: Int(Task.currentPriority.rawValue),
25+
continuation: continuation)
2726
_enqueueJobGlobalWithDelay(duration, job)
2827
}
2928
}

test/Concurrency/Runtime/async_task_priority_current.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import Dispatch
1313
@available(SwiftStdlib 5.5, *)
1414
func test_detach() async {
1515
let a1 = Task.currentPriority
16-
print("a1: \(a1)") // CHECK: TaskPriority(rawValue: 0)
16+
print("a1: \(a1)") // CHECK: TaskPriority(rawValue: 21)
1717

1818
// Note: remember to detach using a higher priority, otherwise a lower one
1919
// might be escalated by the get() and we could see `default` in the detached
@@ -24,7 +24,7 @@ func test_detach() async {
2424
}.get()
2525

2626
let a3 = Task.currentPriority
27-
print("a3: \(a3)") // CHECK: a3: TaskPriority(rawValue: 0)
27+
print("a3: \(a3)") // CHECK: a3: TaskPriority(rawValue: 21)
2828
}
2929

3030
@available(SwiftStdlib 5.5, *)

0 commit comments

Comments
 (0)