@@ -109,6 +109,23 @@ public struct UnownedJob: Sendable {
109
109
_swiftJobRun ( self , executor)
110
110
}
111
111
112
+ /// Run this job isolated to the passed task executor.
113
+ ///
114
+ /// This operation runs the job on the calling thread and *blocks* until the job completes.
115
+ /// The intended use of this method is for an executor to determine when and where it
116
+ /// wants to run the job and then call this method on it.
117
+ ///
118
+ /// The passed in executor reference is used to establish the executor context for the job,
119
+ /// and should be the same executor as the one semantically calling the `runSynchronously` method.
120
+ ///
121
+ /// This operation consumes the job, preventing it accidental use after it has been run.
122
+ ///
123
+ /// Converting a `ExecutorJob` to an ``UnownedJob`` and invoking ``UnownedJob/runSynchronously(_:)` on it multiple times is undefined behavior,
124
+ /// as a job can only ever be run once, and must not be accessed after it has been run.
125
+ ///
126
+ /// - Parameter executor: the task executor this job will be run on.
127
+ ///
128
+ /// - SeeAlso: ``runSynchronously(isolatedTo:taskExecutor:)``
112
129
@_unavailableInEmbedded
113
130
@available ( SwiftStdlib 6 . 0 , * )
114
131
@_alwaysEmitIntoClient
@@ -117,6 +134,24 @@ public struct UnownedJob: Sendable {
117
134
_swiftJobRunOnTaskExecutor ( self , executor)
118
135
}
119
136
137
+ /// Run this job isolated to the passed in serial executor, while executing it on the specified task executor.
138
+ ///
139
+ /// This operation runs the job on the calling thread and *blocks* until the job completes.
140
+ /// The intended use of this method is for an executor to determine when and where it
141
+ /// wants to run the job and then call this method on it.
142
+ ///
143
+ /// The passed in executor reference is used to establish the executor context for the job,
144
+ /// and should be the same executor as the one semantically calling the `runSynchronously` method.
145
+ ///
146
+ /// This operation consumes the job, preventing it accidental use after it has been run.
147
+ ///
148
+ /// Converting a `ExecutorJob` to an ``UnownedJob`` and invoking ``UnownedJob/runSynchronously(_:)` on it multiple times is undefined behavior,
149
+ /// as a job can only ever be run once, and must not be accessed after it has been run.
150
+ ///
151
+ /// - Parameter serialExecutor: the executor this job will be semantically running on.
152
+ /// - Parameter taskExecutor: the task executor this job will be run on.
153
+ ///
154
+ /// - SeeAlso: ``runSynchronously(on:)``
120
155
@_unavailableInEmbedded
121
156
@available ( SwiftStdlib 6 . 0 , * )
122
157
@_alwaysEmitIntoClient
@@ -286,6 +321,58 @@ extension ExecutorJob {
286
321
__consuming public func runSynchronously( on executor: UnownedSerialExecutor ) {
287
322
_swiftJobRun ( UnownedJob ( self ) , executor)
288
323
}
324
+
325
+ /// Run this job on the passed in task executor.
326
+ ///
327
+ /// This operation runs the job on the calling thread and *blocks* until the job completes.
328
+ /// The intended use of this method is for an executor to determine when and where it
329
+ /// wants to run the job and then call this method on it.
330
+ ///
331
+ /// The passed in executor reference is used to establish the executor context for the job,
332
+ /// and should be the same executor as the one semantically calling the `runSynchronously` method.
333
+ ///
334
+ /// This operation consumes the job, preventing it accidental use after it has been run.
335
+ ///
336
+ /// Converting a `ExecutorJob` to an ``UnownedJob`` and invoking ``UnownedJob/runSynchronously(_:)` on it multiple times is undefined behavior,
337
+ /// as a job can only ever be run once, and must not be accessed after it has been run.
338
+ ///
339
+ /// - Parameter executor: the executor this job will be run on.
340
+ ///
341
+ /// - SeeAlso: ``runSynchronously(isolatedTo:taskExecutor:)``
342
+ @_unavailableInEmbedded
343
+ @available ( SwiftStdlib 6 . 0 , * )
344
+ @_alwaysEmitIntoClient
345
+ @inlinable
346
+ __consuming public func runSynchronously( on executor: UnownedTaskExecutor ) {
347
+ _swiftJobRunOnTaskExecutor ( UnownedJob ( self ) , executor)
348
+ }
349
+
350
+ /// Run this job isolated to the passed in serial executor, while executing it on the specified task executor.
351
+ ///
352
+ /// This operation runs the job on the calling thread and *blocks* until the job completes.
353
+ /// The intended use of this method is for an executor to determine when and where it
354
+ /// wants to run the job and then call this method on it.
355
+ ///
356
+ /// The passed in executor reference is used to establish the executor context for the job,
357
+ /// and should be the same executor as the one semantically calling the `runSynchronously` method.
358
+ ///
359
+ /// This operation consumes the job, preventing it accidental use after it has been run.
360
+ ///
361
+ /// Converting a `ExecutorJob` to an ``UnownedJob`` and invoking ``UnownedJob/runSynchronously(_:)` on it multiple times is undefined behavior,
362
+ /// as a job can only ever be run once, and must not be accessed after it has been run.
363
+ ///
364
+ /// - Parameter serialExecutor: the executor this job will be semantically running on.
365
+ /// - Parameter taskExecutor: the task executor this job will be run on.
366
+ ///
367
+ /// - SeeAlso: ``runSynchronously(on:)``
368
+ @_unavailableInEmbedded
369
+ @available ( SwiftStdlib 6 . 0 , * )
370
+ @_alwaysEmitIntoClient
371
+ @inlinable
372
+ __consuming public func runSynchronously( isolatedTo serialExecutor: UnownedSerialExecutor ,
373
+ taskExecutor: UnownedTaskExecutor ) {
374
+ _swiftJobRunOnTaskExecutor ( UnownedJob ( self ) , serialExecutor, taskExecutor)
375
+ }
289
376
}
290
377
#endif // !SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY
291
378
0 commit comments