Skip to content

Commit dbbc20e

Browse files
authored
Merge pull request #72395 from rjmccall/isolated-any-tasks-6.0
[6.0] Use `@isolated(any)` function types in task creation
2 parents 97c29bd + 0494b55 commit dbbc20e

File tree

14 files changed

+682
-65
lines changed

14 files changed

+682
-65
lines changed

include/swift/Threading/ThreadLocalStorage.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,15 @@ class ThreadLocal {
115115
T get() { return value; }
116116

117117
void set(T newValue) { value = newValue; }
118+
119+
T swap(T newValue) {
120+
// There's an implicit optimization here because we implicitly
121+
// materialize the address of the thread-local once instead of
122+
// separately for two calls to get and set.
123+
auto curValue = get();
124+
set(newValue);
125+
return curValue;
126+
}
118127
};
119128
#else
120129
// A wrapper around a TLS key that is lazily initialized using swift::once.
@@ -168,6 +177,12 @@ class ThreadLocal {
168177
memcpy(&storedValue, &newValue, sizeof(T));
169178
tls_set(key.getKey(), storedValue);
170179
}
180+
181+
T swap(T newValue) {
182+
auto curValue = get();
183+
set(newValue);
184+
return curValue;
185+
}
171186
};
172187
#endif
173188

lib/IRGen/GenBuiltin.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,8 @@ void irgen::emitBuiltinCall(IRGenFunction &IGF, const BuiltinInfo &Builtin,
230230
auto taskOptions = args.claimNext();
231231
auto taskFunction = args.claimNext();
232232
auto taskContext = args.claimNext();
233+
taskOptions = IGF.Builder.CreateIntToPtr(taskOptions,
234+
IGF.IGM.SwiftTaskOptionRecordPtrTy);
233235

234236
auto asyncLet = emitBuiltinStartAsyncLet(
235237
IGF,
@@ -249,6 +251,8 @@ void irgen::emitBuiltinCall(IRGenFunction &IGF, const BuiltinInfo &Builtin,
249251
auto taskFunction = args.claimNext();
250252
auto taskContext = args.claimNext();
251253
auto localBuffer = args.claimNext();
254+
taskOptions = IGF.Builder.CreateIntToPtr(taskOptions,
255+
IGF.IGM.SwiftTaskOptionRecordPtrTy);
252256

253257
auto asyncLet = emitBuiltinStartAsyncLet(
254258
IGF,

lib/IRGen/GenConcurrency.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -705,7 +705,7 @@ irgen::emitTaskCreate(IRGenFunction &IGF, llvm::Value *flags,
705705
Explosion &taskFunction,
706706
SubstitutionMap subs) {
707707
llvm::Value *taskOptions =
708-
llvm::ConstantInt::get(IGF.IGM.SwiftTaskOptionRecordPtrTy, 0);
708+
llvm::ConstantPointerNull::get(IGF.IGM.SwiftTaskOptionRecordPtrTy);
709709

710710
CanType resultType;
711711
if (subs) {

lib/IRGen/IRGenModule.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -675,13 +675,14 @@ IRGenModule::IRGenModule(IRGenerator &irgen,
675675
AsyncFunctionPointerPtrTy = AsyncFunctionPointerTy->getPointerTo(DefaultAS);
676676
SwiftTaskPtrTy = SwiftTaskTy->getPointerTo(DefaultAS);
677677
SwiftAsyncLetPtrTy = Int8PtrTy; // we pass it opaquely (AsyncLet*)
678-
SwiftTaskOptionRecordPtrTy = SizeTy; // Builtin.RawPointer? that we get as (TaskOptionRecord*)
679-
SwiftTaskGroupPtrTy = Int8PtrTy; // we pass it opaquely (TaskGroup*)
680-
SwiftTaskOptionRecordTy = createStructType(
681-
*this, "swift.task_option", {
678+
SwiftTaskOptionRecordTy =
679+
llvm::StructType::create(getLLVMContext(), "swift.task_option");
680+
SwiftTaskOptionRecordPtrTy = SwiftTaskOptionRecordTy->getPointerTo(DefaultAS);
681+
SwiftTaskOptionRecordTy->setBody({
682682
SizeTy, // Flags
683683
SwiftTaskOptionRecordPtrTy, // Parent
684684
});
685+
SwiftTaskGroupPtrTy = Int8PtrTy; // we pass it opaquely (TaskGroup*)
685686
SwiftTaskGroupTaskOptionRecordTy = createStructType(
686687
*this, "swift.task_group_task_option", {
687688
SwiftTaskOptionRecordTy, // Base option record

lib/IRGen/IRGenModule.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -816,7 +816,7 @@ class IRGenModule {
816816
llvm::PointerType *SwiftContextPtrTy;
817817
llvm::PointerType *SwiftTaskPtrTy;
818818
llvm::PointerType *SwiftAsyncLetPtrTy;
819-
llvm::IntegerType *SwiftTaskOptionRecordPtrTy;
819+
llvm::PointerType *SwiftTaskOptionRecordPtrTy;
820820
llvm::PointerType *SwiftTaskGroupPtrTy;
821821
llvm::StructType *SwiftTaskOptionRecordTy;
822822
llvm::StructType *SwiftInitialSerialExecutorTaskOptionRecordTy;

stdlib/public/Concurrency/Actor.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,9 @@ class ActiveTask {
196196
public:
197197
static void set(AsyncTask *task) { Value.set(task); }
198198
static AsyncTask *get() { return Value.get(); }
199+
static AsyncTask *swap(AsyncTask *newTask) {
200+
return Value.swap(newTask);
201+
}
199202
};
200203

201204
/// Define the thread-locals.
@@ -217,7 +220,7 @@ void swift::runJobInEstablishedExecutorContext(Job *job) {
217220

218221
if (auto task = dyn_cast<AsyncTask>(job)) {
219222
// Update the active task in the current thread.
220-
ActiveTask::set(task);
223+
auto oldTask = ActiveTask::swap(task);
221224

222225
// Update the task status to say that it's running on the
223226
// current thread. If the task suspends somewhere, it should
@@ -231,6 +234,7 @@ void swift::runJobInEstablishedExecutorContext(Job *job) {
231234

232235
assert(ActiveTask::get() == nullptr &&
233236
"active task wasn't cleared before suspending?");
237+
if (oldTask) ActiveTask::set(oldTask);
234238
} else {
235239
// There's no extra bookkeeping to do for simple jobs besides swapping in
236240
// the voucher.
@@ -259,15 +263,11 @@ AsyncTask *swift::swift_task_getCurrent() {
259263
}
260264

261265
AsyncTask *swift::_swift_task_clearCurrent() {
262-
auto task = ActiveTask::get();
263-
ActiveTask::set(nullptr);
264-
return task;
266+
return ActiveTask::swap(nullptr);
265267
}
266268

267269
AsyncTask *swift::_swift_task_setCurrent(AsyncTask *new_task) {
268-
auto task = ActiveTask::get();
269-
ActiveTask::set(new_task);
270-
return task;
270+
return ActiveTask::swap(new_task);
271271
}
272272

273273
SWIFT_CC(swift)

0 commit comments

Comments
 (0)