Skip to content

Commit 6872707

Browse files
committed
[embedded][Concurrency] Further refine C-api boundary for isIsolating...
1 parent ea16df0 commit 6872707

File tree

11 files changed

+44
-40
lines changed

11 files changed

+44
-40
lines changed

include/swift/ABI/Executor.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -418,11 +418,11 @@ enum class IsIsolatingCurrentContextDecision : int8_t {
418418
// The function call could not determine if the current context is isolated
419419
// by this executor or not. Default value for executors which do not implement
420420
// `isIsolatingCurrentContext`.
421-
Unknown,
421+
Unknown = -1,
422422
// The current context is definitely not isolated by this executor.
423-
NotIsolated,
423+
NotIsolated = 0,
424424
// The current context is definitely isolated by this executor.
425-
Isolated,
425+
Isolated = 1,
426426
};
427427

428428
IsIsolatingCurrentContextDecision

include/swift/Runtime/Concurrency.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -777,12 +777,12 @@ bool swift_task_invokeSwiftCheckIsolated(SerialExecutorRef executor);
777777

778778
/// Invoke an executor's `isIsolatingCurrentContext` implementation;
779779
SWIFT_EXPORT_FROM(swift_Concurrency) SWIFT_CC(swift)
780-
IsIsolatingCurrentContextDecision swift_task_isIsolatingCurrentContext(SerialExecutorRef executor);
780+
int8_t swift_task_isIsolatingCurrentContext(SerialExecutorRef executor);
781781

782782
/// Invoke a Swift executor's `isIsolatingCurrentContext` implementation; returns
783783
/// `true` if it invoked the Swift implementation, `false` otherwise.
784784
SWIFT_EXPORT_FROM(swift_Concurrency) SWIFT_CC(swift)
785-
IsIsolatingCurrentContextDecision swift_task_invokeSwiftIsIsolatingCurrentContext(SerialExecutorRef executor);
785+
int8_t swift_task_invokeSwiftIsIsolatingCurrentContext(SerialExecutorRef executor);
786786

787787
/// A count in nanoseconds.
788788
using JobDelay = unsigned long long;

include/swift/Runtime/ConcurrencyHooks.def

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ SWIFT_CONCURRENCY_HOOK(void, swift_task_enqueueGlobalWithDeadline,
4747
SWIFT_CONCURRENCY_HOOK(void, swift_task_checkIsolated,
4848
SerialExecutorRef executor);
4949

50-
SWIFT_CONCURRENCY_HOOK(IsIsolatingCurrentContextDecision, swift_task_isIsolatingCurrentContext,
50+
SWIFT_CONCURRENCY_HOOK(int8_t, swift_task_isIsolatingCurrentContext,
5151
SerialExecutorRef executor);
5252

5353
SWIFT_CONCURRENCY_HOOK(bool, swift_task_isOnExecutor,

stdlib/public/Concurrency/Actor.cpp

+5-2
Original file line numberDiff line numberDiff line change
@@ -520,7 +520,9 @@ static bool swift_task_isCurrentExecutorWithFlagsImpl(
520520
expectedExecutor.getIdentity());
521521
// The executor has the most recent 'isIsolatingCurrentContext' API
522522
// so available so we prefer calling that to 'checkIsolated'.
523-
auto isIsolatingCurrentContextDecision = swift_task_isIsolatingCurrentContext(expectedExecutor);
523+
auto isIsolatingCurrentContextDecision =
524+
getIsIsolatingCurrentContextDecisionFromInt(
525+
swift_task_isIsolatingCurrentContext(expectedExecutor));
524526

525527
SWIFT_TASK_DEBUG_LOG("executor checking mode option: UseIsIsolatingCurrentContext; invoke (%p).isIsolatingCurrentContext => %s",
526528
expectedExecutor.getIdentity(), getIsIsolatingCurrentContextDecisionNameStr(isIsolatingCurrentContextDecision));
@@ -646,7 +648,8 @@ static bool swift_task_isCurrentExecutorWithFlagsImpl(
646648
SWIFT_TASK_DEBUG_LOG("executor checking: call (%p).isIsolatingCurrentContext",
647649
expectedExecutor.getIdentity());
648650

649-
const auto isIsolatingCurrentContextDecision = swift_task_isIsolatingCurrentContext(expectedExecutor);
651+
const auto isIsolatingCurrentContextDecision =
652+
getIsIsolatingCurrentContextDecisionFromInt(swift_task_isIsolatingCurrentContext(expectedExecutor));
650653

651654
SWIFT_TASK_DEBUG_LOG("executor checking: can call (%p).isIsolatingCurrentContext => %p",
652655
expectedExecutor.getIdentity(), getIsIsolatingCurrentContextDecisionNameStr(isIsolatingCurrentContextDecision));

stdlib/public/Concurrency/ConcurrencyHooks.cpp

+7-5
Original file line numberDiff line numberDiff line change
@@ -111,18 +111,20 @@ swift::swift_task_checkIsolated(SerialExecutorRef executor) {
111111
swift_task_checkIsolatedOrig(executor);
112112
}
113113

114-
SWIFT_CC(swift) static IsIsolatingCurrentContextDecision
114+
SWIFT_CC(swift) static int8_t
115115
swift_task_isIsolatingCurrentContextOrig(SerialExecutorRef executor) {
116116
return swift_task_isIsolatingCurrentContextImpl(
117117
*reinterpret_cast<SwiftExecutorRef *>(&executor));
118118
}
119119

120-
IsIsolatingCurrentContextDecision
120+
int8_t
121121
swift::swift_task_isIsolatingCurrentContext(SerialExecutorRef executor) {
122-
if (SWIFT_UNLIKELY(swift_task_isIsolatingCurrentContext_hook))
123-
return swift_task_isIsolatingCurrentContext_hook(executor, swift_task_isIsolatingCurrentContextOrig);
124-
else
122+
if (SWIFT_UNLIKELY(swift_task_isIsolatingCurrentContext_hook)) {
123+
return swift_task_isIsolatingCurrentContext_hook(
124+
executor, swift_task_isIsolatingCurrentContextOrig);
125+
} else {
125126
return swift_task_isIsolatingCurrentContextOrig(executor);
127+
}
126128
}
127129

128130
// Implemented in Swift because we need to obtain the user-defined flags on the executor ref.

stdlib/public/Concurrency/CooperativeGlobalExecutor.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ void swift_task_checkIsolatedImpl(SwiftExecutorRef executor) {
155155
}
156156

157157
SWIFT_CC(swift)
158-
IsIsolatingCurrentContextDecision swift_task_isIsolatingCurrentContextImpl(SwiftExecutorRef executor) {
158+
int8_t swift_task_isIsolatingCurrentContextImpl(SwiftExecutorRef executor) {
159159
return swift_executor_invokeSwiftIsIsolatingCurrentContext(executor);
160160
}
161161

stdlib/public/Concurrency/ExecutorImpl.cpp

+5-7
Original file line numberDiff line numberDiff line change
@@ -62,22 +62,20 @@ int8_t _swift_task_isIsolatingCurrentContextSwift(
6262
const SerialExecutorWitnessTable *witnessTable
6363
);
6464

65-
extern "C" SWIFT_CC(swift) IsIsolatingCurrentContextDecision swift_task_isIsolatingCurrentContextImpl(
65+
extern "C" SWIFT_CC(swift) int8_t
66+
swift_task_isIsolatingCurrentContextImpl(
6667
SerialExecutorRef executor) {
6768
HeapObject *identity = executor.getIdentity();
6869

6970
// We might be being called with an actor rather than a "proper"
7071
// SerialExecutor; in that case, we won't have a SerialExecutor witness
7172
// table.
72-
if (!executor.hasSerialExecutorWitnessTable()) {
73-
return IsIsolatingCurrentContextDecision::Unknown;
74-
}
73+
if (!executor.hasSerialExecutorWitnessTable())
74+
return static_cast<uint8_t>(IsIsolatingCurrentContextDecision::Unknown);
7575

76-
auto decision = _swift_task_isIsolatingCurrentContextSwift(
76+
return _swift_task_isIsolatingCurrentContextSwift(
7777
identity, swift_getObjectType(identity),
7878
executor.getSerialExecutorWitnessTable());
79-
80-
return getIsIsolatingCurrentContextDecisionFromInt(decision);
8179
}
8280

8381
extern "C" SWIFT_CC(swift) bool swift_task_isMainExecutorImpl(

stdlib/public/Concurrency/ExecutorImpl.h

+9-8
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@
3131
#define __ptrauth_objc_isa_pointer
3232
#endif
3333

34-
#include "swift/ABI/Executor.h"
35-
3634
#include <inttypes.h>
3735
#include <stdbool.h>
3836
#include <stdlib.h>
@@ -228,12 +226,15 @@ swift_executor_invokeSwiftCheckIsolated(SwiftExecutorRef executor) {
228226
return _swift_task_invokeSwiftCheckIsolated_c(executor);
229227
}
230228

231-
using swift::IsIsolatingCurrentContextDecision;
232-
233229
/// Check if the current context is isolated by the specified executor.
234-
static inline IsIsolatingCurrentContextDecision
230+
///
231+
/// The numeric values correspond to `swift::IsIsolatingCurrentContextDecision`.
232+
///
233+
/// Specifically ONLY `1` means "isolated", while smaller values mean not isolated or unknown.
234+
/// See ``IsIsolatingCurrentContextDecision`` for details.
235+
static inline int8_t
235236
swift_executor_invokeSwiftIsIsolatingCurrentContext(SwiftExecutorRef executor) {
236-
extern IsIsolatingCurrentContextDecision _swift_task_invokeSwiftIsIsolatingCurrentContext_c(SwiftExecutorRef executor);
237+
extern int8_t _swift_task_invokeSwiftIsIsolatingCurrentContext_c(SwiftExecutorRef executor);
237238

238239
return _swift_task_invokeSwiftIsIsolatingCurrentContext_c(executor);
239240
}
@@ -296,8 +297,8 @@ SWIFT_CC(swift) void swift_task_enqueueMainExecutorImpl(SwiftJob * _Nonnull job)
296297
SWIFT_CC(swift) void swift_task_checkIsolatedImpl(SwiftExecutorRef executor);
297298

298299
/// Check if the specified executor isolates the current context.
299-
SWIFT_CC(swift)
300-
swift::IsIsolatingCurrentContextDecision swift_task_isIsolatingCurrentContextImpl(SwiftExecutorRef executor);
300+
SWIFT_CC(swift) int8_t
301+
swift_task_isIsolatingCurrentContextImpl(SwiftExecutorRef executor);
301302

302303
/// Get a reference to the main executor.
303304
SWIFT_CC(swift) SwiftExecutorRef swift_task_getMainExecutorImpl(void);

stdlib/public/Concurrency/GlobalExecutor.cpp

+8-8
Original file line numberDiff line numberDiff line change
@@ -93,25 +93,26 @@ int8_t _task_serialExecutor_isIsolatingCurrentContext(
9393
const Metadata *selfType,
9494
const SerialExecutorWitnessTable *wtable);
9595

96-
using swift::IsIsolatingCurrentContextDecision;
97-
98-
SWIFT_CC(swift) IsIsolatingCurrentContextDecision
96+
SWIFT_CC(swift) int8_t
9997
swift::swift_task_invokeSwiftIsIsolatingCurrentContext(SerialExecutorRef executor)
10098
{
10199
if (!executor.hasSerialExecutorWitnessTable()) {
102-
return IsIsolatingCurrentContextDecision::NotIsolated;
100+
return static_cast<int8_t>(IsIsolatingCurrentContextDecision::NotIsolated);
103101
}
104102

105103
auto decision = _task_serialExecutor_isIsolatingCurrentContext(
106104
executor.getIdentity(), swift_getObjectType(executor.getIdentity()),
107105
executor.getSerialExecutorWitnessTable());
108106

109-
return getIsIsolatingCurrentContextDecisionFromInt(decision);
107+
return decision;
110108
}
111109

112-
extern "C" swift::IsIsolatingCurrentContextDecision _swift_task_invokeSwiftIsIsolatingCurrentContext_c(SwiftExecutorRef executor)
110+
extern "C" int8_t
111+
_swift_task_invokeSwiftIsIsolatingCurrentContext_c(SwiftExecutorRef executor)
113112
{
114-
return swift_task_invokeSwiftIsIsolatingCurrentContext(*reinterpret_cast<SerialExecutorRef *>(&executor));
113+
return
114+
static_cast<int8_t>(swift_task_invokeSwiftIsIsolatingCurrentContext(
115+
*reinterpret_cast<SerialExecutorRef *>(&executor)));
115116
}
116117

117118
extern "C" void _swift_job_run_c(SwiftJob *job, SwiftExecutorRef executor)
@@ -181,7 +182,6 @@ swift::getIsIsolatingCurrentContextDecisionNameStr(IsIsolatingCurrentContextDeci
181182
swift_Concurrency_fatalError(0, "Unexpected IsIsolatingCurrentContextDecision value");
182183
}
183184

184-
185185
/*****************************************************************************/
186186
/****************************** MAIN EXECUTOR *******************************/
187187
/*****************************************************************************/

test/embedded/Inputs/executor.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ void swift_task_checkIsolatedImpl(SwiftExecutorRef executor) {
308308

309309
/// Check if the specified executor is the current executor.
310310
SWIFT_CC(swift)
311-
IsIsolatingCurrentContextDecision swift_task_isIsolatingCurrentContextImpl(SwiftExecutorRef executor) {
311+
int8_t swift_task_isIsolatingCurrentContextImpl(SwiftExecutorRef executor) {
312312
return swift_executor_invokeSwiftIsIsolatingCurrentContext(executor);
313313
}
314314

unittests/runtime/CompatibilityOverrideConcurrency.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -92,11 +92,11 @@ swift_task_checkIsolated_override(SerialExecutorRef executor,
9292
}
9393

9494
SWIFT_CC(swift)
95-
static bool
95+
static int8_t
9696
swift_task_isIsolatingCurrentContext_override(SerialExecutorRef executor,
9797
swift_task_isIsolatingCurrentContext_original original) {
9898
Ran = true;
99-
return true;
99+
return 0;
100100
}
101101

102102
SWIFT_CC(swift)

0 commit comments

Comments
 (0)