//===--- CompatibilityOverridesConcurrency.def - Overrides Info -*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2018 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
//
//===----------------------------------------------------------------------===//
//
// This file defines x-macros used for metaprogramming with the set of
// compatibility override functions.  See CompatibilityOverride.h for
// a detailed explanation of how this system works.
//
//===----------------------------------------------------------------------===//

/// #define OVERRIDE(name, ret, attrs, ccAttrs, namespace, typedArgs, namedArgs)
///   Provides information about an overridable function.
///   - name is the name of the function, without any leading swift_ or
///     namespace.
///   - ret is the return type of the function.
///   - attrs is the attributes, if any, applied to the function definition.
///   - ccAttrs is the calling convention attributes, if any, applied to the
///     function definition and corresponding typedefs
///   - namespace is the namespace, if any, the function is in, including a
///     trailing ::
///   - typedArgs is the argument list, including types, surrounded by
///     parentheses
///   - namedArgs is the list of argument names, with no types, surrounded by
///     parentheses
///
/// The entries are organized by group. A user may define OVERRIDE to get all
/// entries, or define one or more of the more specific OVERRIDE_* variants to
/// get only those entries.  The more specific OVERRIDE_* variants group
/// entries into the functions that are emitted in the specified file;
/// for example, OVERRIDE_ACTOR identifies the functions that are defined
/// in Actor.cpp.

// NOTE: the entries in this file are used to build the struct layout for
// the OverrideSection in the CompatibilityOverride.cpp that is built into
// the concurrency runtime.  A matching file must be used to build the
// ConcurrencyOverrideSection in Overrides.cpp for future compatibility
// override libraries that target this release.
//
// Because compatibility override libraries target a specific release of
// Swift, there is no inherent reason the entries in this file cannot be
// arbitrarily rearranged between release cycles, as long as a matching
// file is used to build any future compatibility override library
// targeting this release.  However, the targeting of compatibility
// override libraries is precise only to a specific major+minor release
// number (e.g. 5.6).  Therefore, care must be taken to avoid ABI breaks
// in this file between patch releases, or else it will become impossible
// to create a compatibility override library for this release:
//
// - Moving or removing entries in this file will break the ABI.
//
// - Changing an entry to use a different implementation file is allowed,
//   but do not move the entry to be grouped with the other entries for
//   the implementation file, as this will break the ABI.
//
// - New entries can be added to the end without breaking the ABI.  This
//   is possible even if there have already been patch releases for this
//   major+minor release, since older patch releases of the runtime will
//   simply not read the new fields.  It is not possible if a compatibility
//   override library has already been released for this major+minor
//   release, but that is unlikely for releases under active development.
//
// When creating a new compatibility override library, always clone the
// last .def files from the appropriate release branch and edit this comment.

#ifdef OVERRIDE
#  define OVERRIDE_ACTOR OVERRIDE
#  define OVERRIDE_TASK OVERRIDE
#  define OVERRIDE_ASYNC_LET OVERRIDE
#  define OVERRIDE_TASK_GROUP OVERRIDE
#  define OVERRIDE_TASK_LOCAL OVERRIDE
#  define OVERRIDE_TASK_STATUS OVERRIDE
#ifndef HOOKED_OVERRIDE_TASK_NORETURN
# define HOOKED_OVERRIDE_TASK_NORETURN(name, attrs, ccAttrs, namespace,       \
                                      typedArgs, namedArgs)                   \
  OVERRIDE(name, void, attrs, ccAttrs, namespace, typedArgs, namedArgs)
#endif
#else
#  ifndef OVERRIDE_ACTOR
#    define OVERRIDE_ACTOR(...)
#  endif
#  ifndef OVERRIDE_TASK
#    define OVERRIDE_TASK(...)
#  endif
#  ifndef OVERRIDE_ASYNC_LET
#    define OVERRIDE_ASYNC_LET(...)
#  endif
#  ifndef OVERRIDE_TASK_GROUP
#    define OVERRIDE_TASK_GROUP(...)
#  endif
#  ifndef OVERRIDE_TASK_LOCAL
#    define OVERRIDE_TASK_LOCAL(...)
#  endif
#  ifndef OVERRIDE_TASK_STATUS
#    define OVERRIDE_TASK_STATUS(...)
#  endif
#  ifndef HOOKED_OVERRIDE_TASK_NORETURN
#    define HOOKED_OVERRIDE_TASK_NORETURN(...)
#  endif
#endif

OVERRIDE_ACTOR(task_enqueue, void,
               SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
               swift::, (Job *job, SerialExecutorRef executor),
               (job, executor))

OVERRIDE_ACTOR(job_run, void,
               SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
               swift::, (Job *job, SerialExecutorRef executor),
               (job, executor))

OVERRIDE_ACTOR(job_run_on_task_executor, void,
               SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
               swift::, (Job *job, TaskExecutorRef executor),
               (job, executor))

OVERRIDE_ACTOR(job_run_on_serial_and_task_executor, void,
               SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
               swift::, (Job *job,
                         SerialExecutorRef serialExecutor,
                         TaskExecutorRef taskExecutor),
               (job, serialExecutor, taskExecutor))

OVERRIDE_ACTOR(task_getCurrentExecutor, SerialExecutorRef,
               SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
               swift::, ,)

OVERRIDE_ACTOR(task_isCurrentExecutor, bool,
               SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
               swift::, (SerialExecutorRef executor), (executor))

OVERRIDE_ACTOR(task_isCurrentExecutorWithFlags, bool,
               SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift), swift::,
               (SerialExecutorRef executor, swift_task_is_current_executor_flag flags),
               (executor, flags))

OVERRIDE_ACTOR(task_switch, void,
               SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swiftasync),
               swift::, (SWIFT_ASYNC_CONTEXT AsyncContext *resumeToContext,
               TaskContinuationFunction *resumeFunction, SerialExecutorRef newExecutor),
               (resumeToContext, resumeFunction, newExecutor))

OVERRIDE_ACTOR(task_deinitOnExecutor, void,
              SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift), swift::,
              (void *object, DeinitWorkFunction *work, SerialExecutorRef newExecutor, size_t flags),
              (object, work, newExecutor, flags))

OVERRIDE_TASK(task_create_common, AsyncTaskAndContext,
              SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift), swift::,
              (size_t taskCreateFlags,
               TaskOptionRecord *options,
               const Metadata *futureResultType,
               TaskContinuationFunction *function,
               void *closureContext,
               size_t initialContextSize),
              (taskCreateFlags, options, futureResultType, function,
               closureContext, initialContextSize))

OVERRIDE_TASK(task_future_wait, void, SWIFT_EXPORT_FROM(swift_Concurrency),
              SWIFT_CC(swiftasync), swift::,
              (OpaqueValue *result,
               SWIFT_ASYNC_CONTEXT AsyncContext *callerContext, AsyncTask *task,
               TaskContinuationFunction *resumeFunction,
               AsyncContext *callContext),
              (result, callerContext, task, resumeFunction, callContext))

OVERRIDE_TASK(task_future_wait_throwing, void,
              SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swiftasync),
              swift::,
              (OpaqueValue *result,
               SWIFT_ASYNC_CONTEXT AsyncContext *callerContext, AsyncTask *task,
               ThrowingTaskFutureWaitContinuationFunction *resumeFunction,
               AsyncContext *callContext),
              (result, callerContext, task, resumeFunction, callContext))

OVERRIDE_TASK(continuation_resume, void, SWIFT_EXPORT_FROM(swift_Concurrency),
              SWIFT_CC(swift), swift::,
              (AsyncTask *continuation),
              (continuation))

OVERRIDE_TASK(continuation_throwingResume, void,
              SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift), swift::,
              (AsyncTask *continuation),
              (continuation))

OVERRIDE_TASK(continuation_throwingResumeWithError, void,
              SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift), swift::,
              (AsyncTask *continuation, SwiftError *error),
              (continuation, error))

OVERRIDE_TASK(task_addCancellationHandler,
              CancellationNotificationStatusRecord *,
              SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift), swift::,
              (CancellationNotificationStatusRecord::FunctionType handler,
               void *context),
              (handler, context))

OVERRIDE_TASK(task_removeCancellationHandler, void,
              SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift), swift::,
              (CancellationNotificationStatusRecord *record), (record))

OVERRIDE_TASK(task_addPriorityEscalationHandler,
              EscalationNotificationStatusRecord *,
              SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift), swift::,
              (EscalationNotificationStatusRecord::FunctionType handler,
               void *context),
              (handler, context))

OVERRIDE_TASK(task_removePriorityEscalationHandler, void,
              SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift), swift::,
              (EscalationNotificationStatusRecord *record), (record))

OVERRIDE_TASK(task_createNullaryContinuationJob, NullaryContinuationJob *,
              SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift), swift::,
              (size_t priority,
               AsyncTask *continuation), (priority, continuation))

HOOKED_OVERRIDE_TASK_NORETURN(task_asyncMainDrainQueue,
              SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
              swift::, ,)


OVERRIDE_TASK(task_suspend, AsyncTask *,
              SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
              swift::, ,)

OVERRIDE_TASK(task_enqueueTaskOnExecutor, void,
              SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift), swift::,
              (AsyncTask *task, SerialExecutorRef newExecutor), (task, newExecutor))

OVERRIDE_TASK(continuation_init, AsyncTask *,
              SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
              swift::, (ContinuationAsyncContext *context,
                        AsyncContinuationFlags flags),
              (context, flags))

OVERRIDE_TASK(continuation_await, void,
              SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swiftasync),
              swift::, (ContinuationAsyncContext *context),
              (context))

OVERRIDE_ASYNC_LET(asyncLet_get, void,
                   SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swiftasync),
                   swift::,
                   (SWIFT_ASYNC_CONTEXT AsyncContext *callerContext,
                    AsyncLet *alet, void *resultBuffer,
                    TaskContinuationFunction *resumeFn,
                    AsyncContext *callContext),
                   (callerContext, alet, resultBuffer, resumeFn, callContext))

OVERRIDE_ASYNC_LET(asyncLet_get_throwing, void,
                   SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swiftasync),
                   swift::,
                   (SWIFT_ASYNC_CONTEXT AsyncContext *callerContext,
                    AsyncLet *alet, void *resultBuffer,
                    ThrowingTaskFutureWaitContinuationFunction *resumeFn,
                    AsyncContext *callContext),
                   (callerContext, alet, resultBuffer, resumeFn, callContext))

OVERRIDE_ASYNC_LET(asyncLet_consume, void,
                   SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swiftasync),
                   swift::,
                   (SWIFT_ASYNC_CONTEXT AsyncContext *callerContext,
                    AsyncLet *alet, void *resultBuffer,
                    TaskContinuationFunction *resumeFn,
                    AsyncContext *callContext),
                   (callerContext, alet, resultBuffer, resumeFn, callContext))

OVERRIDE_ASYNC_LET(asyncLet_consume_throwing, void,
                   SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swiftasync),
                   swift::,
                   (SWIFT_ASYNC_CONTEXT AsyncContext *callerContext,
                    AsyncLet *alet, void *resultBuffer,
                    ThrowingTaskFutureWaitContinuationFunction *resumeFn,
                    AsyncContext *callContext),
                   (callerContext, alet, resultBuffer, resumeFn, callContext))

OVERRIDE_ASYNC_LET(asyncLet_finish, void,
                   SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swiftasync),
                   swift::,
                   (SWIFT_ASYNC_CONTEXT AsyncContext *callerContext,
                    AsyncLet *alet, void *resultBuffer,
                    TaskContinuationFunction *resumeFn,
                    AsyncContext *callContext),
                   (callerContext, alet, resultBuffer, resumeFn, callContext))

OVERRIDE_TASK_GROUP(taskGroup_initialize, void,
                    SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
                    swift::, (TaskGroup *group, const Metadata *T), (group, T))

OVERRIDE_TASK_GROUP(taskGroup_initializeWithFlags, void,
                    SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
                    swift::, (size_t flags, TaskGroup *group, const Metadata *T), (flags, group, T))

OVERRIDE_TASK_GROUP(taskGroup_initializeWithOptions, void,
                    SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
                    swift::, (size_t flags, TaskGroup *group, const Metadata *T, TaskOptionRecord *options), (flags, group, T, options))

OVERRIDE_TASK_STATUS(taskGroup_attachChild, void,
                    SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
                    swift::, (TaskGroup *group, AsyncTask *child),
                    (group, child))

OVERRIDE_TASK_GROUP(taskGroup_destroy, void,
                    SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
                    swift::, (TaskGroup *group), (group))

OVERRIDE_TASK_GROUP(taskGroup_wait_next_throwing, void,
                    SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swiftasync),
                    swift::,
                    (OpaqueValue *resultPointer,
                     SWIFT_ASYNC_CONTEXT AsyncContext *callerContext,
                     TaskGroup *_group,
                     ThrowingTaskFutureWaitContinuationFunction *resumeFn,
                     AsyncContext *callContext),
                    (resultPointer, callerContext, _group, resumeFn,
                    callContext))

OVERRIDE_TASK_GROUP(taskGroup_isEmpty, bool,
                    SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
                    swift::, (TaskGroup *group), (group))

OVERRIDE_TASK_GROUP(taskGroup_isCancelled, bool,
                    SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
                    swift::, (TaskGroup *group), (group))

OVERRIDE_TASK_GROUP(taskGroup_cancelAll, void,
                    SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
                    swift::, (TaskGroup *group), (group))

OVERRIDE_TASK_GROUP(taskGroup_addPending, bool,
                    SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
                    swift::, (TaskGroup *group, bool unconditionally),
                    (group, unconditionally))

OVERRIDE_TASK_GROUP(taskGroup_waitAll, void,
                    SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swiftasync),
                    swift::,
                    (OpaqueValue *resultPointer,
                        SWIFT_ASYNC_CONTEXT AsyncContext *callerContext,
                        TaskGroup *_group,
                        SwiftError *bodyError,
                        ThrowingTaskFutureWaitContinuationFunction *resumeFn,
                        AsyncContext *callContext),
                    (resultPointer, callerContext, _group, bodyError,
                        resumeFn, callContext))

#if !SWIFT_CONCURRENCY_EMBEDDED
OVERRIDE_TASK_LOCAL(task_reportIllegalTaskLocalBindingWithinWithTaskGroup, void,
                    SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift), swift::,
                    (const unsigned char *file, uintptr_t fileLength,
                        bool fileIsASCII, uintptr_t line),
                    (file, fileLength, fileIsASCII, line))
#endif

OVERRIDE_TASK_LOCAL(task_localValuePush, void,
                    SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
                    swift::,
                    (const HeapObject *key, OpaqueValue *value,
                     const Metadata *valueType),
                    (key, value, valueType))

OVERRIDE_TASK_LOCAL(task_localValueGet, OpaqueValue *,
                    SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
                    swift::,
                    (const HeapObject *key),
                    (key))

OVERRIDE_TASK_LOCAL(task_localValuePop, void,
                    SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
                    swift::, ,)

OVERRIDE_TASK_LOCAL(task_localsCopyTo, void,
                    SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
                    swift::,
                    (AsyncTask *target),
                    (target))

OVERRIDE_TASK(task_cancellationShieldPush, bool,
              SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
              swift::, , )

OVERRIDE_TASK(task_cancellationShieldPop, void,
              SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
              swift::, , )

OVERRIDE_TASK(task_hasActiveCancellationShield, bool,
              SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
              swift::, (AsyncTask *task), (task))

OVERRIDE_TASK_STATUS(task_hasTaskGroupStatusRecord, bool,
                     SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
                     swift::, , )

OVERRIDE_TASK_STATUS(task_cancel, void, SWIFT_EXPORT_FROM(swift_Concurrency),
                     SWIFT_CC(swift), swift::, (AsyncTask *task), (task))

OVERRIDE_TASK_GROUP(task_cancel_group_child_tasks, void,
                    SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
                    swift::, (TaskGroup *group), (group))

OVERRIDE_TASK_STATUS(task_escalate, JobPriority,
                     SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
                     swift::, (AsyncTask *task, JobPriority newPriority),
                     (task, newPriority))

OVERRIDE_TASK_STATUS(task_getPreferredTaskExecutor, TaskExecutorRef,
                     SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
                     swift::, , )

OVERRIDE_TASK_STATUS(task_pushTaskExecutorPreference,
                     TaskExecutorPreferenceStatusRecord*,
                     SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
                     swift::, (TaskExecutorRef executor),
                     (executor))

OVERRIDE_TASK_STATUS(task_popTaskExecutorPreference, void,
                     SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
                     swift::, (TaskExecutorPreferenceStatusRecord *record),
                     (record))

OVERRIDE_TASK(task_startOnMainActor, void,
              SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
              swift::, (AsyncTask *task), (task))

// In ACTOR since we need ExecutorTracking info
OVERRIDE_ACTOR(task_immediate, void,
               SWIFT_EXPORT_FROM(swift_Concurrency), SWIFT_CC(swift),
               swift::, (AsyncTask *task, SerialExecutorRef targetExecutor),
               (task, targetExecutor))

#undef OVERRIDE
#undef OVERRIDE_ACTOR
#undef OVERRIDE_TASK
#undef OVERRIDE_ASYNC_LET
#undef OVERRIDE_TASK_GROUP
#undef OVERRIDE_TASK_LOCAL
#undef OVERRIDE_TASK_STATUS
#undef HOOKED_OVERRIDE_TASK_NORETURN
