mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
[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.
This commit is contained in:
@@ -59,12 +59,15 @@
|
||||
#include "TaskPrivate.h"
|
||||
#include "Error.h"
|
||||
|
||||
#if !SWIFT_CONCURRENCY_COOPERATIVE_GLOBAL_EXECUTOR
|
||||
#include <dispatch/dispatch.h>
|
||||
|
||||
#if !defined(_WIN32)
|
||||
#include <dlfcn.h>
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
using namespace swift;
|
||||
|
||||
SWIFT_CC(swift)
|
||||
@@ -180,7 +183,7 @@ void swift::donateThreadToGlobalExecutorUntil(bool (*condition)(void *),
|
||||
while (!condition(conditionContext)) {
|
||||
auto job = claimNextFromJobQueue();
|
||||
if (!job) return;
|
||||
job->run(ExecutorRef::generic());
|
||||
swift_job_run(job, ExecutorRef::generic());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -405,21 +408,35 @@ void swift::swift_task_enqueueMainExecutor(Job *job) {
|
||||
swift_task_enqueueMainExecutorImpl(job);
|
||||
}
|
||||
|
||||
#if !SWIFT_CONCURRENCY_COOPERATIVE_GLOBAL_EXECUTOR
|
||||
void swift::swift_task_enqueueOnDispatchQueue(Job *job,
|
||||
HeapObject *_queue) {
|
||||
JobPriority priority = job->getPriority();
|
||||
auto queue = reinterpret_cast<dispatch_queue_t>(_queue);
|
||||
dispatchEnqueue(queue, job, (dispatch_qos_class_t)priority, queue);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if SWIFT_CONCURRENCY_COOPERATIVE_GLOBAL_EXECUTOR
|
||||
static HeapObject _swift_mainExecutorIdentity;
|
||||
#endif
|
||||
|
||||
ExecutorRef swift::swift_task_getMainExecutor() {
|
||||
#if SWIFT_CONCURRENCY_COOPERATIVE_GLOBAL_EXECUTOR
|
||||
return ExecutorRef::forOrdinary(&_swift_mainExecutorIdentity, nullptr);
|
||||
#else
|
||||
return ExecutorRef::forOrdinary(
|
||||
reinterpret_cast<HeapObject*>(&_dispatch_main_q),
|
||||
_swift_task_getDispatchQueueSerialExecutorWitnessTable());
|
||||
#endif
|
||||
}
|
||||
|
||||
bool ExecutorRef::isMainExecutor() const {
|
||||
#if SWIFT_CONCURRENCY_COOPERATIVE_GLOBAL_EXECUTOR
|
||||
return Identity == &_swift_mainExecutorIdentity;
|
||||
#else
|
||||
return Identity == reinterpret_cast<HeapObject*>(&_dispatch_main_q);
|
||||
#endif
|
||||
}
|
||||
|
||||
#define OVERRIDE_GLOBAL_EXECUTOR COMPATIBILITY_OVERRIDE
|
||||
|
||||
Reference in New Issue
Block a user