Skip to content

Commit f6f756e

Browse files
[Concurrency] repair cooperative global executor (#39092)
`SWIFT_STDLIB_SINGLE_THREADED_RUNTIME` mode has been broken for a long time. This patch guards some includes and use of libdispatch headers so that platforms that doesn't support libdispatch can build cooperative executor runtime. And fixed missing implementations for cooperative mode.
1 parent 8e1e167 commit f6f756e

File tree

5 files changed

+30
-1
lines changed

5 files changed

+30
-1
lines changed

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: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,15 @@
5959
#include "TaskPrivate.h"
6060
#include "Error.h"
6161

62+
#if !SWIFT_CONCURRENCY_COOPERATIVE_GLOBAL_EXECUTOR
6263
#include <dispatch/dispatch.h>
6364

6465
#if !defined(_WIN32)
6566
#include <dlfcn.h>
6667
#endif
6768

69+
#endif
70+
6871
using namespace swift;
6972

7073
SWIFT_CC(swift)
@@ -180,7 +183,7 @@ void swift::donateThreadToGlobalExecutorUntil(bool (*condition)(void *),
180183
while (!condition(conditionContext)) {
181184
auto job = claimNextFromJobQueue();
182185
if (!job) return;
183-
job->run(ExecutorRef::generic());
186+
swift_job_run(job, ExecutorRef::generic());
184187
}
185188
}
186189

@@ -405,21 +408,35 @@ void swift::swift_task_enqueueMainExecutor(Job *job) {
405408
swift_task_enqueueMainExecutorImpl(job);
406409
}
407410

411+
#if !SWIFT_CONCURRENCY_COOPERATIVE_GLOBAL_EXECUTOR
408412
void swift::swift_task_enqueueOnDispatchQueue(Job *job,
409413
HeapObject *_queue) {
410414
JobPriority priority = job->getPriority();
411415
auto queue = reinterpret_cast<dispatch_queue_t>(_queue);
412416
dispatchEnqueue(queue, job, (dispatch_qos_class_t)priority, queue);
413417
}
418+
#endif
419+
420+
#if SWIFT_CONCURRENCY_COOPERATIVE_GLOBAL_EXECUTOR
421+
static HeapObject _swift_mainExecutorIdentity;
422+
#endif
414423

415424
ExecutorRef swift::swift_task_getMainExecutor() {
425+
#if SWIFT_CONCURRENCY_COOPERATIVE_GLOBAL_EXECUTOR
426+
return ExecutorRef::forOrdinary(&_swift_mainExecutorIdentity, nullptr);
427+
#else
416428
return ExecutorRef::forOrdinary(
417429
reinterpret_cast<HeapObject*>(&_dispatch_main_q),
418430
_swift_task_getDispatchQueueSerialExecutorWitnessTable());
431+
#endif
419432
}
420433

421434
bool ExecutorRef::isMainExecutor() const {
435+
#if SWIFT_CONCURRENCY_COOPERATIVE_GLOBAL_EXECUTOR
436+
return Identity == &_swift_mainExecutorIdentity;
437+
#else
422438
return Identity == reinterpret_cast<HeapObject*>(&_dispatch_main_q);
439+
#endif
423440
}
424441

425442
#define OVERRIDE_GLOBAL_EXECUTOR COMPATIBILITY_OVERRIDE

stdlib/public/Concurrency/Task.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@
2727
#include "Debug.h"
2828
#include "Error.h"
2929

30+
#if !SWIFT_CONCURRENCY_COOPERATIVE_GLOBAL_EXECUTOR
3031
#include <dispatch/dispatch.h>
32+
#endif
3133

3234
#if !defined(_WIN32)
3335
#include <dlfcn.h>
@@ -242,12 +244,16 @@ static void destroyTask(SWIFT_CONTEXT HeapObject *obj) {
242244
}
243245

244246
static ExecutorRef executorForEnqueuedJob(Job *job) {
247+
#if SWIFT_CONCURRENCY_COOPERATIVE_GLOBAL_EXECUTOR
248+
return ExecutorRef::generic();
249+
#else
245250
void *jobQueue = job->SchedulerPrivate[Job::DispatchQueueIndex];
246251
if (jobQueue == DISPATCH_QUEUE_GLOBAL_EXECUTOR)
247252
return ExecutorRef::generic();
248253
else
249254
return ExecutorRef::forOrdinary(reinterpret_cast<HeapObject*>(jobQueue),
250255
_swift_task_getDispatchQueueSerialExecutorWitnessTable());
256+
#endif
251257
}
252258

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

stdlib/public/Concurrency/TaskGroup.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@
3434
#include "queue" // TODO: remove and replace with usage of our mpsc queue
3535
#include <atomic>
3636
#include <assert.h>
37+
#if !SWIFT_CONCURRENCY_COOPERATIVE_GLOBAL_EXECUTOR
3738
#include <dispatch/dispatch.h>
39+
#endif
3840

3941
#if !defined(_WIN32)
4042
#include <dlfcn.h>

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)