5#include "../Foundation/Compiler.h"
6#ifndef SC_EXPORT_LIBRARY_AWAIT
7#define SC_EXPORT_LIBRARY_AWAIT 0
9#define SC_AWAIT_EXPORT SC_COMPILER_LIBRARY_EXPORT(SC_EXPORT_LIBRARY_AWAIT)
11#ifndef SC_AWAIT_REQUIRE_ARENA
12#define SC_AWAIT_REQUIRE_ARENA 0
15#include "../Async/Async.h"
16#include "../Foundation/Result.h"
17#include "Internal/AwaitCoroutine.h"
33struct AwaitCancellationHandler;
34struct AwaitSleepAwaiter;
35struct AwaitSocketAcceptAwaiter;
36struct AwaitSocketConnectAwaiter;
37struct AwaitSocketSendAwaiter;
38struct AwaitSocketSendToAwaiter;
39struct AwaitSocketSendAllAwaiter;
40struct AwaitSocketSendAllBuffersAwaiter;
41struct AwaitSocketReceiveAwaiter;
42struct AwaitSocketReceiveExactAwaiter;
43struct AwaitSocketReceiveLineAwaiter;
44struct AwaitSocketReceiveFromAwaiter;
45struct AwaitLoopWakeUp;
46struct AwaitLoopWakeUpAwaiter;
47struct AwaitFileReadAwaiter;
48struct AwaitFileReadUntilFullOrEOFAwaiter;
49struct AwaitFileWriteAwaiter;
50struct AwaitFileSendAwaiter;
51struct AwaitFilePollAwaiter;
52struct AwaitFileSystemOperationAwaiter;
53struct AwaitProcessExitAwaiter;
54struct AwaitSignalAwaiter;
56struct AwaitTaskGroupWaitAllAwaiter;
57struct AwaitTaskGroupWaitAnyAwaiter;
58struct AwaitTaskSpawnAwaiter;
59struct AwaitTaskTimeoutAwaiter;
60struct AwaitLoopWorkAwaiter;
62SC_AWAIT_EXPORT
const char* AwaitCancellationMessage();
63SC_AWAIT_EXPORT Result AwaitCancelledResult();
64SC_AWAIT_EXPORT
bool AwaitIsCancelled(Result result);
67#define SC_CO_TRY(expression) \
69 if (auto _exprResConv = SC::Result(expression)) \
70 SC_LANGUAGE_LIKELY { (void)0; } \
73 co_return _exprResConv; \
86 bool disconnected =
false;
93 bool disconnected =
false;
94 bool lineComplete =
false;
102 bool disconnected =
false;
109 bool endOfFile =
false;
121 bool useOffset =
false;
128 bool useOffset =
false;
141 size_t bytesTransferred = 0;
142 bool usedZeroCopy =
false;
143 bool complete =
false;
148 bool timedOut =
false;
158 int signalNumber = 0;
169 size_t index =
size_t(-1);
176 size_t numCompleted = 0;
177 size_t numSucceeded = 0;
178 size_t numFailed = 0;
179 size_t firstFailureIndex =
size_t(-1);
184enum class AwaitTaskGroupCancelPolicy :
uint8_t
187 LeaveChildrenRunning,
190enum class AwaitTaskGroupWaitAnyPolicy :
uint8_t
193 LeaveRemainingRunning,
196enum class AwaitFileSystemOperationType :
uint8_t
205 RemoveEmptyDirectory,
212 void*
object =
nullptr;
222 [[nodiscard]]
void* allocate(
size_t size,
size_t alignment);
225 [[nodiscard]]
size_t used()
const;
226 [[nodiscard]]
size_t capacity()
const;
227 [[nodiscard]]
size_t peakUsed()
const;
228 [[nodiscard]]
size_t failedAllocationSize()
const;
233 size_t peakOffset = 0;
234 size_t lastFailedAllocationSize = 0;
242 using Handle = AwaitCoroutineTypedHandle<Promise>;
254 [[nodiscard]]
bool isValid()
const;
255 [[nodiscard]]
bool isStarted()
const;
256 [[nodiscard]]
bool isCompleted()
const;
257 [[nodiscard]]
bool isActive()
const;
258 [[nodiscard]]
bool isCancellationRequested()
const;
260 [[nodiscard]]
Result result()
const;
264 bool await_ready()
const;
265 bool await_suspend(Handle continuation);
266 Result await_resume()
const;
288 template <
typename First,
typename... Rest>
291 eventLoop = findEventLoop(first, rest...);
297 template <
typename First,
typename... Rest>
300 return findEventLoop(rest...);
303 static void* allocateFrame(
size_t size,
AwaitEventLoop* eventLoop)
noexcept;
304 static void deallocateFrame(
void* frame)
noexcept;
306 static void*
operator new(
size_t size)
noexcept;
308 template <
typename First,
typename... Rest>
309 static void*
operator new(
size_t size, First& first, Rest&... rest)
noexcept
311 return allocateFrame(size, findEventLoop(first, rest...));
314 static void operator delete(
void* frame,
size_t)
noexcept;
316 static AwaitTask get_return_object_on_allocation_failure();
320 AwaitSuspendAlways initial_suspend()
noexcept;
324 bool await_ready()
noexcept;
325 void await_suspend(AwaitTask::Handle handle)
noexcept;
326 void await_resume()
noexcept;
331 void return_value(
Result newResult) noexcept;
333 void unhandled_exception() noexcept;
341 void* completionObject;
342 void (*completionCallback)(
void*
object);
346 bool cancellationRequested;
347 bool inCompletionCallback;
348 bool destroyDeferred;
359 [[nodiscard]]
bool hasArena()
const;
431 void deferDestroy(AwaitTask::Handle handle);
432 void drainDeferredDestroys();
436 AwaitTask::Handle deferredDestroyList;
445 [[nodiscard]]
bool isActive()
const;
463 bool await_ready()
const;
464 bool await_suspend(AwaitTask::Handle continuation);
472 AwaitTask::Handle continuation;
488 bool await_ready()
const;
489 bool await_suspend(AwaitTask::Handle continuation);
497 AwaitTask::Handle continuation;
512 bool await_ready()
const;
513 bool await_suspend(AwaitTask::Handle continuation);
521 AwaitTask::Handle continuation;
536 bool await_ready()
const;
537 bool await_suspend(AwaitTask::Handle continuation);
545 AwaitTask::Handle continuation;
564 bool singleBuffer =
true;
566 bool await_ready()
const;
567 bool await_suspend(AwaitTask::Handle continuation);
575 AwaitTask::Handle continuation;
595 bool singleBuffer =
true;
597 bool await_ready()
const;
598 bool await_suspend(AwaitTask::Handle continuation);
606 AwaitTask::Handle continuation;
622 size_t numBytesSent = 0;
624 bool await_ready()
const;
625 bool await_suspend(AwaitTask::Handle continuation);
633 AwaitTask::Handle continuation;
650 size_t numBytesSent = 0;
651 size_t bufferIndex = 0;
652 size_t bufferOffset = 0;
654 bool await_ready()
const;
655 bool await_suspend(AwaitTask::Handle continuation);
662 bool findNextBuffer();
663 Result startCurrentBuffer();
664 Result updateRequestBuffer();
666 AwaitTask::Handle continuation;
683 bool await_ready()
const;
684 bool await_suspend(AwaitTask::Handle continuation);
692 AwaitTask::Handle continuation;
708 size_t numBytesReceived = 0;
710 bool await_ready()
const;
711 bool await_suspend(AwaitTask::Handle continuation);
718 Result startRemainingReceive();
719 Result updateRequestBuffer();
720 Result updateOutResult(
bool disconnected);
722 AwaitTask::Handle continuation;
738 size_t numBytesReceived = 0;
739 char currentByte = 0;
740 bool lineComplete =
false;
742 bool await_ready()
const;
743 bool await_suspend(AwaitTask::Handle continuation);
751 Result updateOutResult(
bool disconnected);
753 AwaitTask::Handle continuation;
770 bool await_ready()
const;
771 bool await_suspend(AwaitTask::Handle continuation);
779 AwaitTask::Handle continuation;
798 bool await_ready()
const;
799 bool await_suspend(AwaitTask::Handle continuation);
807 AwaitTask::Handle continuation;
825 size_t numBytesRead = 0;
827 bool await_ready()
const;
828 bool await_suspend(AwaitTask::Handle continuation);
835 Result startRemainingRead();
836 Result updateRequestBufferAndOffset();
837 Result updateOutResult(
bool endOfFile);
839 AwaitTask::Handle continuation;
860 bool singleBuffer =
true;
862 bool await_ready()
const;
863 bool await_suspend(AwaitTask::Handle continuation);
871 AwaitTask::Handle continuation;
890 bool await_ready()
const;
891 bool await_suspend(AwaitTask::Handle continuation);
899 AwaitTask::Handle continuation;
913 bool await_ready()
const;
914 bool await_suspend(AwaitTask::Handle continuation);
922 AwaitTask::Handle continuation;
930 AwaitFileSystemOperationType operation,
StringSpan path,
945 AwaitFileSystemOperationType operation;
961 bool await_ready()
const;
962 bool await_suspend(AwaitTask::Handle continuation);
970 AwaitTask::Handle continuation;
978 AwaitTaskGroupCancelPolicy cancelPolicy = AwaitTaskGroupCancelPolicy::CancelChildren);
984 AwaitTaskGroupWaitAnyPolicy waitAnyPolicy = AwaitTaskGroupWaitAnyPolicy::CancelRemaining);
987 [[nodiscard]]
size_t size()
const;
988 [[nodiscard]]
size_t capacity()
const;
996 AwaitTaskGroupCancelPolicy cancelPolicy;
1008 bool await_ready()
const;
1009 bool await_suspend(AwaitTask::Handle continuation);
1014 static void onTaskCompleted(
void*
object);
1017 void onTaskCompleted();
1018 void finish(
Result result);
1019 void clearChildCallbacks();
1020 Result collectResult()
const;
1022 AwaitTask::Handle continuation;
1023 size_t completedTasks = 0;
1024 bool finished =
false;
1031 AwaitTaskGroupWaitAnyPolicy waitAnyPolicy);
1035 AwaitTaskGroupWaitAnyPolicy waitAnyPolicy;
1038 bool await_ready()
const;
1039 bool await_suspend(AwaitTask::Handle continuation);
1044 static void onTaskCompleted(
void*
object);
1047 void onTaskCompleted();
1048 void finish(
Result result);
1049 void clearChildCallbacks();
1050 Result setWinner(
size_t index);
1053 AwaitTask::Handle continuation;
1054 size_t completedTasks = 0;
1055 size_t winnerIndex =
size_t(-1);
1056 bool cancelling =
false;
1057 bool finished =
false;
1066 FileDescriptor::Handle process = FileDescriptor::Invalid;
1071 bool await_ready()
const;
1072 bool await_suspend(AwaitTask::Handle continuation);
1080 AwaitTask::Handle continuation;
1090 int signalNumber = 0;
1095 bool await_ready()
const;
1096 bool await_suspend(AwaitTask::Handle continuation);
1104 AwaitTask::Handle continuation;
1117 bool await_ready()
const;
1118 bool await_suspend(AwaitTask::Handle continuation);
1126 AwaitTask::Handle continuation;
1141 bool await_ready()
const;
1142 bool await_suspend(AwaitTask::Handle continuation);
1147 static void onTaskCompleted(
void*
object);
1150 void onTaskCompleted();
1151 void finish(
Result result);
1153 AwaitTask::Handle continuation;
1155 bool cancelling =
false;
1156 bool childCompleted =
false;
1157 bool timeoutStopped =
false;
1158 bool timeoutFired =
false;
1159 bool finished =
false;
1173 bool await_ready()
const;
1174 bool await_suspend(AwaitTask::Handle continuation);
1182 AwaitTask::Handle continuation;
struct SC_FOUNDATION_EXPORT Function
Wraps function pointers, member functions and lambdas without ever allocating.
Definition Function.h:19
unsigned char uint8_t
Platform independent (1) byte unsigned int.
Definition PrimitiveTypes.h:27
decltype(sizeof(0)) size_t
Platform independent unsigned size type.
Definition PrimitiveTypes.h:45
unsigned long long uint64_t
Platform independent (8) bytes unsigned int.
Definition PrimitiveTypes.h:33
unsigned int uint32_t
Platform independent (4) bytes unsigned int.
Definition PrimitiveTypes.h:29
long long int64_t
Platform independent (8) bytes signed int.
Definition PrimitiveTypes.h:41
Asynchronous I/O (files, sockets, timers, processes, fs events, threads wake-up) (see Async) AsyncEve...
Definition Async.h:1397
Starts an handle polling operation.
Definition Async.h:932
Starts a file read operation, reading bytes from a file (or pipe).
Definition Async.h:778
Sends file contents to a socket using zero-copy when available (sendfile, TransmitFile).
Definition Async.h:982
Starts an asynchronous file system operation (open, close, read, write, sendFile, stat,...
Definition Async.h:1196
Starts a file write operation, writing bytes to a file (or pipe).
Definition Async.h:854
Starts a Timeout that is invoked only once after expiration (relative) time has passed.
Definition Async.h:310
Options for AsyncLoopWakeUp configuration.
Definition Async.h:335
Starts a wake-up operation, allowing threads to execute callbacks on loop thread.
Definition Async.h:358
Executes work in a thread pool and then invokes a callback on the event loop thread.
Definition Async.h:1143
Starts monitoring a process, notifying about its termination.
Definition Async.h:395
Base class for all async results (argument of completion callbacks).
Definition Async.h:265
Starts monitoring a signal, notifying about its reception.
Definition Async.h:457
Starts a socket accept operation, obtaining a new socket from a listening socket.
Definition Async.h:554
Starts a socket connect operation, connecting to a remote endpoint.
Definition Async.h:574
Starts an unconnected socket receive from operation, receiving bytes from a remote endpoint.
Definition Async.h:743
Starts a socket receive operation, receiving bytes from a remote endpoint.
Definition Async.h:686
Starts an unconnected socket send to operation, sending bytes to a remote endpoint.
Definition Async.h:654
Starts a socket send operation, sending bytes to a remote endpoint.
Definition Async.h:608
An AsyncSequence using a SC::ThreadPool to execute one or more SC::AsyncRequest in a background threa...
Definition Async.h:1124
Caller-owned monotonic arena for coroutine frame allocation.
Definition Await.h:219
Cancellation hook installed by the awaiter currently suspending an AwaitTask.
Definition Await.h:211
Coroutine-friendly wrapper around an existing AsyncEventLoop.
Definition Await.h:353
Awaiter for a single AsyncFilePoll operation.
Definition Await.h:905
Awaiter for a single AsyncFileRead operation.
Definition Await.h:785
Result object populated by AwaitEventLoop::fileRead.
Definition Await.h:107
Awaiter that reads until the caller buffer is full or EOF is reached.
Definition Await.h:813
Awaiter for a single AsyncFileSend operation.
Definition Await.h:877
Awaiter for selected AsyncFileSystemOperation path operations.
Definition Await.h:928
Awaiter for a single AsyncFileWrite operation.
Definition Await.h:845
Awaiter for a single AsyncLoopWakeUp delivery.
Definition Await.h:478
Stable wake-up object that can resume an AwaitLoopWakeUpAwaiter from another thread.
Definition Await.h:441
Awaiter for a single AsyncLoopWork operation.
Definition Await.h:1164
Awaiter for a single AsyncProcessExit operation.
Definition Await.h:1062
Awaiter for a single one-shot AsyncSignal operation.
Definition Await.h:1086
Awaiter for a single AsyncLoopTimeout operation.
Definition Await.h:455
Awaiter for a single AsyncSocketAccept operation.
Definition Await.h:503
Awaiter for a single AsyncSocketConnect operation.
Definition Await.h:527
Awaiter for a single AsyncSocketReceive operation.
Definition Await.h:672
Awaiter that reactivates AsyncSocketReceive until the whole caller buffer is filled.
Definition Await.h:698
Awaiter for a single AsyncSocketReceiveFrom operation.
Definition Await.h:759
Result object populated by AwaitEventLoop::receiveFrom.
Definition Await.h:99
Awaiter that reads a ' '-terminated line into caller-provided storage.
Definition Await.h:728
Result object populated by AwaitEventLoop::receiveLine.
Definition Await.h:91
Result object populated by AwaitEventLoop::receive.
Definition Await.h:84
Awaiter that reactivates AsyncSocketSend until the whole buffer is sent.
Definition Await.h:612
Awaiter that sends every buffer in a scatter/gather list.
Definition Await.h:639
Awaiter for a single AsyncSocketSend operation.
Definition Await.h:551
Awaiter for a single AsyncSocketSendTo operation.
Definition Await.h:581
Awaiter that waits for every active task in an AwaitTaskGroup.
Definition Await.h:1002
Awaiter that waits for the first active task in an AwaitTaskGroup to complete.
Definition Await.h:1029
Caller-storage structured group of child tasks owned by the current scope.
Definition Await.h:976
Awaiter that starts a child task if needed, then waits for it to complete.
Definition Await.h:1110
Awaiter that waits for a child task, cancelling it if a timeout expires first.
Definition Await.h:1131
Coroutine promise implementation used by AwaitTask.
Definition Await.h:285
Caller-owned coroutine task returning a plain SC::Result.
Definition Await.h:239
[UniqueHandleDeclaration2Snippet]
Definition File.h:128
Options used to open a file descriptor.
Definition File.h:99
A structure to describe copy flags.
Definition FileSystem.h:76
An ascii string used as boolean result. SC_TRY macro forwards errors to caller.
Definition Result.h:13
Low-level OS socket handle.
Definition Socket.h:159
Native representation of an IP Address.
Definition Socket.h:106
View over a contiguous sequence of items (pointer + size in elements).
Definition Span.h:29
An read-only view over a string (to avoid including Strings library when parsing is not needed).
Definition StringSpan.h:37
Simple thread pool that executes tasks in a fixed number of worker threads.
Definition ThreadPool.h:38
A vocabulary type representing a time interval in milliseconds since epoch.
Definition PrimitiveTypes.h:50