Skip to content

Commit fecd9f5

Browse files
Concurrency: repair cooperative executor
1 parent 7c112c3 commit fecd9f5

File tree

6 files changed

+23
-1
lines changed

6 files changed

+23
-1
lines changed

stdlib/cmake/modules/SwiftSource.cmake

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,10 @@ function(_add_target_variant_swift_compile_flags
280280
list(APPEND result "-D" "SWIFT_RUNTIME_OS_VERSIONING")
281281
endif()
282282

283+
if(SWIFT_STDLIB_SINGLE_THREADED_RUNTIME)
284+
list(APPEND result "-DSWIFT_STDLIB_SINGLE_THREADED_RUNTIME")
285+
endif()
286+
283287
set("${result_var_name}" "${result}" PARENT_SCOPE)
284288
endfunction()
285289

stdlib/public/Concurrency/AsyncLet.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
#include "AsyncCall.h"
2828
#include "Debug.h"
2929

30-
#if !defined(_WIN32)
30+
#if !defined(_WIN32) && !defined(__wasi__)
3131
#include <dlfcn.h>
3232
#endif
3333

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
@@ -407,21 +407,31 @@ void swift::swift_task_enqueueMainExecutor(Job *job) {
407407
swift_task_enqueueMainExecutorImpl(job);
408408
}
409409

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

417419
ExecutorRef swift::swift_task_getMainExecutor() {
420+
#if SWIFT_CONCURRENCY_COOPERATIVE_GLOBAL_EXECUTOR
421+
return ExecutorRef::generic();
422+
#else
418423
return ExecutorRef::forOrdinary(
419424
reinterpret_cast<HeapObject*>(&_dispatch_main_q),
420425
_swift_task_getDispatchQueueSerialExecutorWitnessTable());
426+
#endif
421427
}
422428

423429
bool ExecutorRef::isMainExecutor() const {
430+
#if SWIFT_CONCURRENCY_COOPERATIVE_GLOBAL_EXECUTOR
431+
return isGeneric();
432+
#else
424433
return Identity == reinterpret_cast<HeapObject*>(&_dispatch_main_q);
434+
#endif
425435
}
426436

427437
#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
@@ -250,12 +250,16 @@ static void destroyTask(SWIFT_CONTEXT HeapObject *obj) {
250250
}
251251

252252
static ExecutorRef executorForEnqueuedJob(Job *job) {
253+
#if SWIFT_CONCURRENCY_COOPERATIVE_GLOBAL_EXECUTOR
254+
return ExecutorRef::generic();
255+
#else
253256
void *jobQueue = job->SchedulerPrivate[Job::DispatchQueueIndex];
254257
if (jobQueue == DISPATCH_QUEUE_GLOBAL_EXECUTOR)
255258
return ExecutorRef::generic();
256259
else
257260
return ExecutorRef::forOrdinary(reinterpret_cast<HeapObject*>(jobQueue),
258261
_swift_task_getDispatchQueueSerialExecutorWitnessTable());
262+
#endif
259263
}
260264

261265
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
@@ -80,12 +80,14 @@ void _swift_tsan_release(void *addr);
8080
/// executors.
8181
#define DISPATCH_QUEUE_GLOBAL_EXECUTOR (void *)1
8282

83+
#if !defined(SWIFT_STDLIB_SINGLE_THREADED_RUNTIME)
8384
inline SerialExecutorWitnessTable *
8485
_swift_task_getDispatchQueueSerialExecutorWitnessTable() {
8586
extern SerialExecutorWitnessTable wtable
8687
SWIFT_ASM_LABEL_WITH_PREFIX("$ss17DispatchQueueShimCScfsWP");
8788
return &wtable;
8889
}
90+
#endif
8991

9092
// ==== ------------------------------------------------------------------------
9193

0 commit comments

Comments
 (0)