mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Most of the async runtime functions have been changed to not expect the task and executor to be passed in. When knowing the task and executor is necessary, there are runtime functions available to recover them. The biggest change I had to make to a runtime function signature was to swift_task_switch, which has been altered to expect to be passed the context and resumption function instead of requiring the caller to park the task. This has the pleasant consequence of allowing the implementation to very quickly turn around when it recognizes that the current executor is satisfactory. It does mean that on arm64e we have to sign the continuation function pointer as an argument and then potentially resign it when assigning into the task's resume slot. rdar://70546948
47 lines
1.5 KiB
C++
47 lines
1.5 KiB
C++
//===--- TaskGroup.h - ABI structures for task groups -00--------*- C++ -*-===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2020 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See https://swift.org/LICENSE.txt for license information
|
|
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Swift ABI describing task groups.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef SWIFT_ABI_TASK_GROUP_H
|
|
#define SWIFT_ABI_TASK_GROUP_H
|
|
|
|
#include "swift/ABI/Task.h"
|
|
#include "swift/ABI/HeapObject.h"
|
|
#include "swift/Runtime/Concurrency.h"
|
|
#include "swift/Runtime/Config.h"
|
|
#include "swift/Basic/RelativePointer.h"
|
|
#include "swift/Basic/STLExtras.h"
|
|
|
|
namespace swift {
|
|
|
|
/// The task group is responsible for maintaining dynamically created child tasks.
|
|
class alignas(Alignment_TaskGroup) TaskGroup {
|
|
public:
|
|
// These constructors do not initialize the actor instance, and the
|
|
// destructor does not destroy the actor instance; you must call
|
|
// swift_taskGroup_{initialize,destroy} yourself.
|
|
constexpr TaskGroup()
|
|
: PrivateData{} {}
|
|
|
|
void *PrivateData[NumWords_TaskGroup];
|
|
|
|
/// Upon a future task's completion, offer it to the task group it belongs to.
|
|
void offer(AsyncTask *completed, AsyncContext *context);
|
|
};
|
|
|
|
} // end namespace swift
|
|
|
|
#endif
|