Skip to content

Commit a770fb8

Browse files
Concurrency: repair cooperative executor
1 parent bef7b1b commit a770fb8

File tree

5 files changed

+22
-0
lines changed

5 files changed

+22
-0
lines changed

stdlib/cmake/modules/SwiftSource.cmake

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,10 @@ function(_add_target_variant_swift_compile_flags
284284
list(APPEND result "-D" "SWIFT_RUNTIME_OS_VERSIONING")
285285
endif()
286286

287+
if(SWIFT_STDLIB_SINGLE_THREADED_RUNTIME)
288+
list(APPEND result "-DSWIFT_STDLIB_SINGLE_THREADED_RUNTIME")
289+
endif()
290+
287291
set("${result_var_name}" "${result}" PARENT_SCOPE)
288292
endfunction()
289293

stdlib/public/Concurrency/Executor.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ func _checkExpectedExecutor(_filenameStart: Builtin.RawPointer,
9393
_filenameStart, _filenameLength, _filenameIsASCII, _line, _executor)
9494
}
9595

96+
#if !SWIFT_STDLIB_SINGLE_THREADED_RUNTIME
9697
// This must take a DispatchQueueShim, not something like AnyObject,
9798
// or else SILGen will emit a retain/release in unoptimized builds,
9899
// which won't work because DispatchQueues aren't actually
@@ -119,3 +120,4 @@ internal final class DispatchQueueShim: UnsafeSendable, SerialExecutor {
119120
return UnownedSerialExecutor(ordinary: self)
120121
}
121122
}
123+
#endif

stdlib/public/Concurrency/GlobalExecutor.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,21 +408,31 @@ void swift::swift_task_enqueueMainExecutor(Job *job) {
408408
swift_task_enqueueMainExecutorImpl(job);
409409
}
410410

411+
#if !SWIFT_CONCURRENCY_COOPERATIVE_GLOBAL_EXECUTOR
411412
void swift::swift_task_enqueueOnDispatchQueue(Job *job,
412413
HeapObject *_queue) {
413414
JobPriority priority = job->getPriority();
414415
auto queue = reinterpret_cast<dispatch_queue_t>(_queue);
415416
dispatchEnqueue(queue, job, (dispatch_qos_class_t)priority, queue);
416417
}
418+
#endif
417419

418420
ExecutorRef swift::swift_task_getMainExecutor() {
421+
#if SWIFT_CONCURRENCY_COOPERATIVE_GLOBAL_EXECUTOR
422+
return ExecutorRef::generic();
423+
#else
419424
return ExecutorRef::forOrdinary(
420425
reinterpret_cast<HeapObject*>(&_dispatch_main_q),
421426
_swift_task_getDispatchQueueSerialExecutorWitnessTable());
427+
#endif
422428
}
423429

424430
bool ExecutorRef::isMainExecutor() const {
431+
#if SWIFT_CONCURRENCY_COOPERATIVE_GLOBAL_EXECUTOR
432+
return isGeneric();
433+
#else
425434
return Identity == reinterpret_cast<HeapObject*>(&_dispatch_main_q);
435+
#endif
426436
}
427437

428438
#define OVERRIDE_GLOBAL_EXECUTOR COMPATIBILITY_OVERRIDE

stdlib/public/Concurrency/Task.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,12 +244,16 @@ static void destroyTask(SWIFT_CONTEXT HeapObject *obj) {
244244
}
245245

246246
static ExecutorRef executorForEnqueuedJob(Job *job) {
247+
#if SWIFT_CONCURRENCY_COOPERATIVE_GLOBAL_EXECUTOR
248+
return ExecutorRef::generic();
249+
#else
247250
void *jobQueue = job->SchedulerPrivate[Job::DispatchQueueIndex];
248251
if (jobQueue == DISPATCH_QUEUE_GLOBAL_EXECUTOR)
249252
return ExecutorRef::generic();
250253
else
251254
return ExecutorRef::forOrdinary(reinterpret_cast<HeapObject*>(jobQueue),
252255
_swift_task_getDispatchQueueSerialExecutorWitnessTable());
256+
#endif
253257
}
254258

255259
static void jobInvoke(void *obj, void *unused, uint32_t flags) {

stdlib/public/Concurrency/TaskPrivate.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,12 +112,14 @@ void _swift_tsan_release(void *addr);
112112
/// executors.
113113
#define DISPATCH_QUEUE_GLOBAL_EXECUTOR (void *)1
114114

115+
#if !defined(SWIFT_STDLIB_SINGLE_THREADED_RUNTIME)
115116
inline SerialExecutorWitnessTable *
116117
_swift_task_getDispatchQueueSerialExecutorWitnessTable() {
117118
extern SerialExecutorWitnessTable wtable
118119
SWIFT_ASM_LABEL_WITH_PREFIX("$ss17DispatchQueueShimCScfsWP");
119120
return &wtable;
120121
}
122+
#endif
121123

122124
// ==== ------------------------------------------------------------------------
123125

0 commit comments

Comments
 (0)