//===--- Concurrency.h - Runtime interface for concurrency ------*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2024 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
//
//===----------------------------------------------------------------------===//
//
// Hooks for concurrency
//
//===----------------------------------------------------------------------===//

// To use this file, define the following macros:
//
//   SWIFT_CONCURRENCY_HOOK(returnType, name, ...)
//   SWIFT_CONCURRENCY_HOOK0(returnType, name)
//   SWIFT_CONCURRENCY_HOOK_OVERRIDE0(returnType, name)
//
// Then include the file somewhere.

#ifndef SWIFT_CONCURRENCY_HOOK
#define SWIFT_CONCURRENCY_HOOK(returnType, name, ...)
#endif

#ifndef SWIFT_CONCURRENCY_HOOK0
#define SWIFT_CONCURRENCY_HOOK0(returnType, name)
#endif

// .............................................................................

SWIFT_CONCURRENCY_HOOK(void, swift_task_enqueueGlobal, Job *job);

SWIFT_CONCURRENCY_HOOK(void, swift_task_enqueueGlobalWithDelay,
                 unsigned long long delay, Job *job);

SWIFT_CONCURRENCY_HOOK(void, swift_task_enqueueGlobalWithDeadline,
    long long sec,
    long long nsec,
    long long tsec,
    long long tnsec,
    int clock, Job *job);

SWIFT_CONCURRENCY_HOOK(void, swift_task_checkIsolated,
    SerialExecutorRef executor);

SWIFT_CONCURRENCY_HOOK(int8_t, swift_task_isIsolatingCurrentContext,
    SerialExecutorRef executor);

SWIFT_CONCURRENCY_HOOK(bool, swift_task_isOnExecutor,
    HeapObject *executor,
    const Metadata *selfType,
    const SerialExecutorWitnessTable *wtable);

SWIFT_CONCURRENCY_HOOK(void, swift_task_enqueueMainExecutor, Job *job);

SWIFT_CONCURRENCY_HOOK0(SerialExecutorRef, swift_task_getMainExecutor);

SWIFT_CONCURRENCY_HOOK(bool, swift_task_isMainExecutor, SerialExecutorRef);

SWIFT_CONCURRENCY_HOOK(void, swift_task_donateThreadToGlobalExecutorUntil,
                       bool (*condition)(void *), void *context);

// .............................................................................

#undef SWIFT_CONCURRENCY_HOOK
#undef SWIFT_CONCURRENCY_HOOK0
#undef SWIFT_CONCURRENCY_HOOK_OVERRIDE0
