Skip to content

Commit 66f3fca

Browse files
committed
[SE-0304] Clean up handling of task priorities.
1 parent 18a849e commit 66f3fca

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
@@ -490,15 +490,18 @@ static AsyncTaskAndContext swift_task_create_commonImpl(
490490

491491
if (currentTask)
492492
jobFlags.setPriority(currentTask->getPriority());
493-
else
494-
// FIXME: Ideally, this should be setting priority based on
495-
// swift_task_getCurrentThreadPriority(). However, that creates
496-
// priority differences which lead to different kinds of hangs
497-
// Temporarily use Unspecified to work around that.
498-
// See also: PR #37939.
499-
jobFlags.setPriority(JobPriority::Unspecified);
493+
else if (taskCreateFlags.inheritContext())
494+
jobFlags.setPriority(swift_task_getCurrentThreadPriority());
500495
}
501496

497+
// Adjust user-interactive priorities down to user-initiated.
498+
if (jobFlags.getPriority() == JobPriority::UserInteractive)
499+
jobFlags.setPriority(JobPriority::UserInitiated);
500+
501+
// If there is still no job priority, use the default priority.
502+
if (jobFlags.getPriority() == JobPriority::Unspecified)
503+
jobFlags.setPriority(JobPriority::Default);
504+
502505
// Figure out the size of the header.
503506
size_t headerSize = sizeof(AsyncTask);
504507
if (parent) {

stdlib/public/Concurrency/Task.swift

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

286286
// Otherwise, query the system.
287-
return TaskPriority(rawValue: UInt8(0))
287+
return TaskPriority(rawValue: UInt8(_getCurrentThreadPriority()))
288288
}
289289
}
290290
}
@@ -659,11 +659,10 @@ extension Task where Success == Never, Failure == Never {
659659
/// As such,
660660
/// this method isn't necessarily a way to avoid resource starvation.
661661
public static func yield() async {
662-
let currentTask = Builtin.getCurrentAsyncTask()
663-
let priority = getJobFlags(currentTask).priority ?? Task.currentPriority._downgradeUserInteractive
664-
665662
return await Builtin.withUnsafeContinuation { (continuation: Builtin.RawUnsafeContinuation) -> Void in
666-
let job = _taskCreateNullaryContinuationJob(priority: Int(priority.rawValue), continuation: continuation)
663+
let job = _taskCreateNullaryContinuationJob(
664+
priority: Int(Task.currentPriority.rawValue),
665+
continuation: continuation)
667666
_enqueueJobGlobal(job)
668667
}
669668
}
@@ -751,7 +750,8 @@ public struct UnsafeCurrentTask {
751750
/// - SeeAlso: `TaskPriority`
752751
/// - SeeAlso: `Task.currentPriority`
753752
public var priority: TaskPriority {
754-
getJobFlags(_task).priority ?? .unspecified
753+
getJobFlags(_task).priority ?? TaskPriority(
754+
rawValue: UInt8(_getCurrentThreadPriority()))
755755
}
756756

757757
/// 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)