Custom main and global executors#2654
Open
al45tair wants to merge 16 commits intoswiftlang:mainfrom
Open
Conversation
Use `any TaskExecutor` instead of `any Executor` for `Task.defaultExecutor`. Rename `ExecutorJobKind` to `ExecutorJob.Kind`. Add `EventableExecutor`; replace `SerialRunLoopExecutor` with `MainExecutor`, then make `MainActor` and `PlatformMainExecutor` use the new protocol.
08df4e3 to
d176b25
Compare
The previous iteration would have required us to make calling the allocation methods a fatal error, and would have meant executors had to check explicitly for the `.task` job kind before using them. Instead, if we add a new `LocalAllocator` type, we can have an `allocator` property that is `nil` if the job doesn't support allocation, and a valid `LocalAllocator` otherwise.
Since the previous pitch, I've added `Clock`-based `enqueue` methods and made a few other changes, notably to the way you actually set custome executors for your program.
Remove `EventableExecutor`; we can come back to that later. Update documentation for `currentExecutor` and add `preferredExecutor` and `currentSchedulableExecutor`. Move the clock-based enqueuing to a separate `SchedulableExecutor` protocol, and provide an efficient way to get it. This means we don't need the `supportsScheduling` property. Back `ClockTraits` with `UInt32`.
We should use typed throws, which will make this work better for Embedded Swift.
FranzBusch
reviewed
Mar 24, 2025
| /// 1. The custom executor associated with an `Actor` on which we are | ||
| /// currently running, or | ||
| /// 2. The preferred executor for the currently executing `Task`, or | ||
| /// 3. The task executor for the current thread |
Member
There was a problem hiding this comment.
I think this should be "for the current task" instead of "current thread"
Contributor
Author
There was a problem hiding this comment.
I'm not sure there's a practical difference there; the task executors are tracked using thread local data.
Member
There was a problem hiding this comment.
Is that true? Aren't they tracked using task local data?
Contributor
Author
There was a problem hiding this comment.
It's this code here that does the tracking: https://github.com/swiftlang/swift/blob/5a6a14785075436b8bdb2c423cd47df4945d3ec8/stdlib/public/Concurrency/Actor.cpp#L114
Removed clock conversion functions; we're going to add `enqueue` and `run` functions instead. Updated comments for various items. Mention that we're planning to expose the built-in executor implementations by name.
c76a990 to
90e5d1b
Compare
Allow `DefaultExecutorFactory` to be defined in the `@main` struct as well as at top level. Remove some text from the proposal that is out of date. Don't expose the Dispatch or CF executors, since that implies that we will have a permanent dependency on Dispatch or Foundation.
We can have something similar in a separate package; let's not share this implementation outside of the runtime for now (it has a number of gotchas and we'd have to spend quite a bit of time in the proposal explaining what it's for and what it does).
Added some text explaining the reason for adding some of the API surface (some of this was already present). Also added a section about the previous `Clock` interface with the `traits` and `convert` functions.
* Added `ThreadDonationExecutor`. * Re-worked the other executors protocols to use it. * Added default implementations for `ExecutorFactory`'s properties. * Removed extraneous `Optional`s in the task allocator. * Updated various bits of wording.
Added some text about alternatives to `currentExecutor`. Also credit John McCall as well, as he's provided substantial input on the proposal at this point.
We've decided to make these non-public.
The delayed enqueuing support will be moved to another proposal.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Add write up of custom executor proposals. There are still some concerns surrounding integration with Dispatch that need working through.