Skip to content

Commit 837513d

Browse files
committed
[Concurrency] Fix test failures, add struct layout checks.
We were missing a field in `SwiftJob`, which broke various things. To avoid that problem in future, this PR adds a set of static asserts to check the layout of various structures and that we're using the same values as well. Also added some functions to the ABI, and fixed things so that if you enable the debug logging the library still builds (there was an extra `_` in `Actor.cpp` that caused a build failure). Finally, renamed `Hooks.cpp` to `ConcurrencyHooks.cpp`. rdar://135380149
1 parent 31df4ed commit 837513d

File tree

7 files changed

+83
-2
lines changed

7 files changed

+83
-2
lines changed

stdlib/public/Concurrency/Actor.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2240,7 +2240,7 @@ static void swift_task_enqueueImpl(Job *job, SerialExecutorRef serialExecutorRef
22402240
}
22412241
SWIFT_TASK_DEBUG_LOG("enqueue job %p on serial serialExecutor %p, taskExecutor = %p", job,
22422242
serialExecutorRef.getIdentity(),
2243-
__taskExecutorRef.getIdentity());
2243+
_taskExecutorRef.getIdentity());
22442244
#endif
22452245

22462246
assert(job && "no job provided");

stdlib/public/Concurrency/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,10 @@ set(SWIFT_RUNTIME_CONCURRENCY_C_SOURCES
7474
AsyncLet.cpp
7575
Clock.cpp
7676
GlobalExecutor.cpp
77-
Hooks.cpp
77+
ConcurrencyHooks.cpp
7878
EmbeddedSupport.cpp
7979
Error.cpp
80+
ExecutorChecks.cpp
8081
Setup.cpp
8182
Task.cpp
8283
TaskAlloc.cpp
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
///===--- ExecutorChecks.cpp - Static assertions to check struct layouts ---===///
2+
///
3+
/// This source file is part of the Swift.org open source project
4+
///
5+
/// Copyright (c) 2014 - 2020 Apple Inc. and the Swift project authors
6+
/// Licensed under Apache License v2.0 with Runtime Library Exception
7+
///
8+
/// See https:///swift.org/LICENSE.txt for license information
9+
/// See https:///swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
///
11+
///===----------------------------------------------------------------------===///
12+
///
13+
/// This file is responsible for checking that the structures in ExecutorImpl.h
14+
/// are laid out exactly the same as those in the ABI headers.
15+
///
16+
///===----------------------------------------------------------------------===///
17+
18+
#include "swift/Runtime/Concurrency.h"
19+
20+
#include "swift/ABI/Executor.h"
21+
#include "swift/ABI/MetadataValues.h"
22+
#include "swift/ABI/Task.h"
23+
24+
#include "ExecutorImpl.h"
25+
26+
// JobFlags
27+
static_assert(sizeof(swift::JobFlags) == sizeof(SwiftJobFlags));
28+
29+
// JobKind
30+
static_assert(sizeof(swift::JobKind) == sizeof(SwiftJobKind));
31+
static_assert((SwiftJobKind)swift::JobKind::Task == SwiftTaskJobKind);
32+
static_assert((SwiftJobKind)swift::JobKind::First_Reserved == SwiftFirstReservedJobKind);
33+
34+
// JobPriority
35+
static_assert(sizeof(swift::JobPriority) == sizeof(SwiftJobPriority));
36+
static_assert((SwiftJobPriority)swift::JobPriority::UserInteractive
37+
== SwiftUserInteractiveJobPriority);
38+
static_assert((SwiftJobPriority)swift::JobPriority::UserInteractive
39+
== SwiftUserInteractiveJobPriority);
40+
static_assert((SwiftJobPriority)swift::JobPriority::UserInitiated
41+
== SwiftUserInitiatedJobPriority);
42+
static_assert((SwiftJobPriority)swift::JobPriority::Default
43+
== SwiftDefaultJobPriority);
44+
static_assert((SwiftJobPriority)swift::JobPriority::Utility
45+
== SwiftUtilityJobPriority);
46+
static_assert((SwiftJobPriority)swift::JobPriority::Background
47+
== SwiftBackgroundJobPriority);
48+
static_assert((SwiftJobPriority)swift::JobPriority::Unspecified
49+
== SwiftUnspecifiedJobPriority);
50+
51+
// Job (has additional fields not exposed via SwiftJob)
52+
static_assert(sizeof(swift::Job) >= sizeof(SwiftJob));
53+
static_assert(offsetof(swift::Job, metadata) == offsetof(SwiftJob, metadata));
54+
static_assert(offsetof(swift::Job, refCounts) == offsetof(SwiftJob, refCounts));
55+
static_assert(offsetof(swift::Job, SchedulerPrivate) == offsetof(SwiftJob, schedulerPrivate));
56+
static_assert(offsetof(swift::Job, SchedulerPrivate[0]) == offsetof(SwiftJob, schedulerPrivate[0]));
57+
static_assert(offsetof(swift::Job, SchedulerPrivate[1]) == offsetof(SwiftJob, schedulerPrivate[1]));
58+
static_assert(offsetof(swift::Job, Flags) == offsetof(SwiftJob, flags));
59+
60+
// SerialExecutorRef
61+
static_assert(sizeof(swift::SerialExecutorRef) == sizeof(SwiftExecutorRef));
62+
63+
// swift_clock_id
64+
static_assert((SwiftClockId)swift::swift_clock_id_continuous
65+
== SwiftContinuousClock);
66+
static_assert((SwiftClockId)swift::swift_clock_id_suspending
67+
== SwiftSuspendingClock);

stdlib/public/Concurrency/ExecutorImpl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ static inline int swift_priority_getBucketIndex(SwiftJobPriority priority) {
9393
/// field may be freely used by the executor implementation.
9494
typedef struct {
9595
SwiftHeapMetadata const *__ptrauth_objc_isa_pointer metadata;
96+
uintptr_t refCounts;
9697
void *schedulerPrivate[2];
9798
SwiftJobFlags flags;
9899
} __attribute__((aligned(2 * sizeof(void *)))) SwiftJob;

test/abi/macOS/arm64/concurrency.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,12 @@ Added: _swift_task_invokeSwiftCheckIsolated
343343
Added: _swift_task_isMainExecutor
344344
Added: _swift_task_isMainExecutor_hook
345345

346+
Added: __swift_task_isMainExecutor_c
347+
Added: _swift_task_donateThreadToGlobalExecutorUntil
348+
Added: _swift_task_donateThreadToGlobalExecutorUntil_hook
349+
Added: _swift_job_alloc
350+
Added: _swift_job_dealloc
351+
346352
// Add property descriptors for static properties
347353
Added: _$sScM21sharedUnownedExecutorScevpZMV
348354
Added: _$sScM6sharedScMvpZMV

test/abi/macOS/x86_64/concurrency.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,12 @@ Added: _swift_task_invokeSwiftCheckIsolated
344344
Added: _swift_task_isMainExecutor
345345
Added: _swift_task_isMainExecutor_hook
346346

347+
Added: __swift_task_isMainExecutor_c
348+
Added: _swift_task_donateThreadToGlobalExecutorUntil
349+
Added: _swift_task_donateThreadToGlobalExecutorUntil_hook
350+
Added: _swift_job_alloc
351+
Added: _swift_job_dealloc
352+
347353
// Add property descriptors for static properties
348354
Added: _$sScM21sharedUnownedExecutorScevpZMV
349355
Added: _$sScM6sharedScMvpZMV

0 commit comments

Comments
 (0)