5#include "../Common/CompilerMacrosExport.h"
6#include "../Common/CompilerMacrosStdCpp.h"
7#include "../Common/CompilerMacrosStdVersion.h"
8#ifndef SC_EXPORT_LIBRARY_AWAIT
9#define SC_EXPORT_LIBRARY_AWAIT 0
11#define SC_AWAIT_EXPORT SC_COMPILER_LIBRARY_EXPORT(SC_EXPORT_LIBRARY_AWAIT)
13#include "../Common/Assert.h"
15#define SC_AWAIT_ASSERT_RELEASE(e) SC_ASSERT_PROVIDER_RELEASE(SC::AwaitAssert, e)
16#define SC_AWAIT_ASSERT_DEBUG(e) SC_ASSERT_PROVIDER_DEBUG(SC::AwaitAssert, e)
17#define SC_AWAIT_TRUST_RESULT(expression) SC_AWAIT_ASSERT_RELEASE(expression)
19#ifndef SC_AWAIT_ENABLE_NO_STDLIB_COROUTINE
20#define SC_AWAIT_ENABLE_NO_STDLIB_COROUTINE 0
23#if !SC_INCLUDE_STD_CPP && !SC_AWAIT_ENABLE_NO_STDLIB_COROUTINE
24#error "SC::Await requires SC_INCLUDE_STD_CPP=1 or SC_AWAIT_ENABLE_NO_STDLIB_COROUTINE=1."
27#if !SC_LANGUAGE_CPP_AT_LEAST_20
28#error "SC::Await requires C++20 or newer."
31#include "../Async/Async.h"
32#include "../Common/Result.h"
33#include "Internal/AwaitCoroutine.h"
46SC_DECLARE_ASSERT_PROVIDER(AwaitAssert, SC_AWAIT_EXPORT);
50struct AwaitAllocatorInterface;
52struct AwaitCancellationHandler;
53struct AwaitSleepAwaiter;
54struct AwaitSocketAcceptAwaiter;
55struct AwaitSocketConnectAwaiter;
56struct AwaitSocketSendAwaiter;
57struct AwaitSocketSendToAwaiter;
58struct AwaitSocketSendAllAwaiter;
59struct AwaitSocketSendAllBuffersAwaiter;
60struct AwaitSocketReceiveAwaiter;
61struct AwaitSocketReceiveExactAwaiter;
62struct AwaitSocketReceiveLineAwaiter;
63struct AwaitSocketReceiveFromAwaiter;
64struct AwaitLoopWakeUp;
65struct AwaitLoopWakeUpAwaiter;
66struct AwaitFileReadAwaiter;
67struct AwaitFileReadUntilFullOrEOFAwaiter;
68struct AwaitFileWriteAwaiter;
69struct AwaitFileSendAwaiter;
70struct AwaitFilePollAwaiter;
71struct AwaitFileSystemOperationAwaiter;
72struct AwaitProcessExitAwaiter;
73struct AwaitSignalAwaiter;
75struct AwaitTaskRegistry;
76struct AwaitTaskGroupWaitAllAwaiter;
77struct AwaitTaskGroupWaitAnyAwaiter;
78struct AwaitTaskRegistryWaitAllAwaiter;
79struct AwaitTaskRegistryWaitAnyAwaiter;
80struct AwaitTaskSpawnAwaiter;
81struct AwaitTaskTimeoutAwaiter;
82struct AwaitLoopWorkAwaiter;
84SC_AWAIT_EXPORT
const char* AwaitCancellationMessage();
85SC_AWAIT_EXPORT Result AwaitCancelledResult();
86SC_AWAIT_EXPORT
bool AwaitIsCancelled(Result result);
88SC_AWAIT_EXPORT
const char* AwaitWrongEventLoopMessage();
89SC_AWAIT_EXPORT Result AwaitWrongEventLoopResult();
90SC_AWAIT_EXPORT
bool AwaitIsWrongEventLoop(Result result);
93#define SC_CO_TRY(expression) \
95 if (auto _exprResConv = SC::Result(expression)) \
96 SC_LANGUAGE_LIKELY { (void)0; } \
99 co_return _exprResConv; \
112 bool disconnected =
false;
119 bool disconnected =
false;
120 bool lineComplete =
false;
128 bool disconnected =
false;
135 bool endOfFile =
false;
147 bool useOffset =
false;
154 bool useOffset =
false;
167 size_t bytesTransferred = 0;
168 bool usedZeroCopy =
false;
169 bool complete =
false;
174 bool timedOut =
false;
184 int signalNumber = 0;
185 uint32_t deliveryCount = 0;
190 uint32_t deliveryCount = 0;
195 size_t index = size_t(-1);
202 size_t numCompleted = 0;
203 size_t numSucceeded = 0;
204 size_t numFailed = 0;
205 size_t firstFailureIndex = size_t(-1);
207 Result firstFailure = Result(
true);
212 size_t index = size_t(-1);
218 size_t index = size_t(-1);
222enum class AwaitTaskGroupCancelPolicy : uint8_t
225 LeaveChildrenRunning,
228enum class AwaitTaskGroupWaitAnyPolicy : uint8_t
231 LeaveRemainingRunning,
234enum class AwaitTaskRegistryWaitAnyPolicy : uint8_t
237 LeaveRemainingRunning,
240enum class AwaitAllocatorMode : uint8_t
251 size_t numAllocations = 0;
252 size_t numReleases = 0;
254 size_t requestedBytesAllocated = 0;
255 size_t requestedBytesReleased = 0;
257 size_t bytesInUse = 0;
258 size_t peakBytesInUse = 0;
259 size_t largestRequestedAllocationSize = 0;
261 size_t numAllocationFailures = 0;
262 size_t lastFailedAllocationSize = 0;
263 size_t largestFailedAllocationSize = 0;
268 size_t reserveBytes = 0;
269 size_t initialCommitBytes = 0;
274 virtual void* allocateImpl(
const void* owner,
size_t numBytes,
size_t alignment) = 0;
275 virtual void releaseImpl(
void* memory) = 0;
279enum class AwaitFileSystemOperationType : uint8_t
288 RemoveEmptyDirectory,
295 void*
object =
nullptr;
297 Result (*cancel)(
void* object,
AwaitEventLoop& eventLoop) =
nullptr;
310 [[nodiscard]] Result createFixed(Span<char> storage);
312 [[nodiscard]] Result createMalloc();
314 [[nodiscard]] Result close();
316 [[nodiscard]]
void* allocate(
const void* owner,
size_t numBytes,
size_t alignment);
317 void release(
void* memory);
318 static void releaseFromAnyAllocator(
void* memory);
320 [[nodiscard]] AwaitAllocatorMode mode()
const;
322 [[nodiscard]]
bool isOpen()
const;
324 [[nodiscard]]
size_t used()
const;
325 [[nodiscard]]
size_t capacity()
const;
326 [[nodiscard]]
size_t peakUsed()
const;
327 [[nodiscard]]
size_t largestAllocationSize()
const;
328 [[nodiscard]]
size_t failedAllocationSize()
const;
329 [[nodiscard]]
size_t reservedBytes()
const;
330 [[nodiscard]]
size_t committedBytes()
const;
335 Result initializeFixedStorage(Span<char> storage);
336 void* allocateFromBlocks(
const void* owner,
size_t numBytes,
size_t alignment);
337 void releaseBlock(BlockHeader& header);
338 bool ensureCommitted(
size_t sizeInBytes);
339 void releaseVirtualMemory();
340 void recordAllocationFailure(
size_t numBytes);
343 AwaitAllocatorMode currentMode = AwaitAllocatorMode::None;
345 Span<char> fixedStorage;
346 BlockHeader* firstBlock =
nullptr;
349 void* virtualMemory =
nullptr;
350 size_t virtualReservedBytes = 0;
351 size_t virtualCommittedBytes = 0;
359 using Handle = AwaitCoroutineTypedHandle<Promise>;
371 [[nodiscard]]
bool isValid()
const;
372 [[nodiscard]]
bool isStarted()
const;
373 [[nodiscard]]
bool isCompleted()
const;
374 [[nodiscard]]
bool isActive()
const;
375 [[nodiscard]]
bool isCancellationRequested()
const;
377 [[nodiscard]] Result result()
const;
381 bool await_ready()
const;
382 bool await_suspend(Handle continuation);
383 Result await_resume()
const;
407 template <
typename First,
typename... Rest>
410 eventLoop = findEventLoop(first, rest...);
413 template <
typename... Rest>
422 template <
typename First,
typename... Rest>
425 return findEventLoop(rest...);
428 static void* allocateFrame(
size_t size,
AwaitEventLoop* eventLoop)
noexcept;
429 static void deallocateFrame(
void* frame)
noexcept;
431 static void*
operator new(
size_t size)
noexcept;
433 template <
typename First,
typename... Rest>
434 static void*
operator new(
size_t size, First& first, Rest&... rest)
noexcept
436 return allocateFrame(size, findEventLoop(first, rest...));
439 template <
typename... Rest>
440 static void*
operator new(
size_t size,
AwaitEventLoop& await, Rest&...)
noexcept
442 return allocateFrame(size, &await);
445 static void operator delete(
void* frame, size_t)
noexcept;
447 static AwaitTask get_return_object_on_allocation_failure();
451 AwaitSuspendAlways initial_suspend()
noexcept;
455 bool await_ready()
noexcept;
456 void await_suspend(AwaitTask::Handle handle)
noexcept;
457 void await_resume()
noexcept;
462 void return_value(Result newResult) noexcept;
464 void unhandled_exception() noexcept;
472 void* completionObject;
473 void (*completionCallback)(
void*
object);
477 bool cancellationRequested;
478 bool inCompletionCallback;
479 bool destroyDeferred;
561 void deferDestroy(AwaitTask::Handle handle);
562 void drainDeferredDestroys();
566 AwaitTask::Handle deferredDestroyList;
575 [[nodiscard]]
bool isActive()
const;
591 Result operationResult = Result(
true);
593 bool await_ready()
const;
594 bool await_suspend(AwaitTask::Handle continuation);
595 Result await_resume();
602 AwaitTask::Handle continuation;
616 Result operationResult = Result(
true);
618 bool await_ready()
const;
619 bool await_suspend(AwaitTask::Handle continuation);
620 Result await_resume();
627 AwaitTask::Handle continuation;
640 Result operationResult = Result(
true);
642 bool await_ready()
const;
643 bool await_suspend(AwaitTask::Handle continuation);
644 Result await_resume();
651 AwaitTask::Handle continuation;
664 Result operationResult = Result(
true);
666 bool await_ready()
const;
667 bool await_suspend(AwaitTask::Handle continuation);
668 Result await_resume();
675 AwaitTask::Handle continuation;
689 Span<const char> data;
690 Span<Span<const char>> buffers;
693 Result operationResult = Result(
true);
694 bool singleBuffer =
true;
696 bool await_ready()
const;
697 bool await_suspend(AwaitTask::Handle continuation);
698 Result await_resume();
705 AwaitTask::Handle continuation;
720 Span<const char> data;
721 Span<Span<const char>> buffers;
724 Result operationResult = Result(
true);
725 bool singleBuffer =
true;
727 bool await_ready()
const;
728 bool await_suspend(AwaitTask::Handle continuation);
729 Result await_resume();
736 AwaitTask::Handle continuation;
748 Span<const char> data;
751 Result operationResult = Result(
true);
752 size_t numBytesSent = 0;
754 bool await_ready()
const;
755 bool await_suspend(AwaitTask::Handle continuation);
756 Result await_resume();
763 AwaitTask::Handle continuation;
775 Span<Span<const char>> data;
779 Result operationResult = Result(
true);
780 size_t numBytesSent = 0;
781 size_t bufferIndex = 0;
782 size_t bufferOffset = 0;
784 bool await_ready()
const;
785 bool await_suspend(AwaitTask::Handle continuation);
786 Result await_resume();
792 bool findNextBuffer();
793 Result startCurrentBuffer();
794 Result updateRequestBuffer();
796 AwaitTask::Handle continuation;
811 Result operationResult = Result(
true);
813 bool await_ready()
const;
814 bool await_suspend(AwaitTask::Handle continuation);
815 Result await_resume();
822 AwaitTask::Handle continuation;
837 Result operationResult = Result(
true);
838 size_t numBytesReceived = 0;
840 bool await_ready()
const;
841 bool await_suspend(AwaitTask::Handle continuation);
842 Result await_resume();
848 Result startRemainingReceive();
849 Result updateRequestBuffer();
850 Result updateOutResult(
bool disconnected);
852 AwaitTask::Handle continuation;
867 Result operationResult = Result(
true);
868 size_t numBytesReceived = 0;
869 char currentByte = 0;
870 bool lineComplete =
false;
872 bool await_ready()
const;
873 bool await_suspend(AwaitTask::Handle continuation);
874 Result await_resume();
880 Result startNextByte();
881 Result updateOutResult(
bool disconnected);
883 AwaitTask::Handle continuation;
898 Result operationResult = Result(
true);
900 bool await_ready()
const;
901 bool await_suspend(AwaitTask::Handle continuation);
902 Result await_resume();
909 AwaitTask::Handle continuation;
926 Result operationResult = Result(
true);
928 bool await_ready()
const;
929 bool await_suspend(AwaitTask::Handle continuation);
930 Result await_resume();
937 AwaitTask::Handle continuation;
954 Result operationResult = Result(
true);
955 size_t numBytesRead = 0;
957 bool await_ready()
const;
958 bool await_suspend(AwaitTask::Handle continuation);
959 Result await_resume();
965 Result startRemainingRead();
966 Result updateRequestBufferAndOffset();
967 Result updateOutResult(
bool endOfFile);
969 AwaitTask::Handle continuation;
983 Span<const char> data;
984 Span<Span<const char>> buffers;
989 Result operationResult = Result(
true);
990 bool singleBuffer =
true;
992 bool await_ready()
const;
993 bool await_suspend(AwaitTask::Handle continuation);
994 Result await_resume();
1001 AwaitTask::Handle continuation;
1018 Result operationResult = Result(
true);
1020 bool await_ready()
const;
1021 bool await_suspend(AwaitTask::Handle continuation);
1022 Result await_resume();
1029 AwaitTask::Handle continuation;
1041 Result operationResult = Result(
true);
1043 bool await_ready()
const;
1044 bool await_suspend(AwaitTask::Handle continuation);
1045 Result await_resume();
1052 AwaitTask::Handle continuation;
1060 AwaitFileSystemOperationType operation, StringSpan path,
1067 AwaitFileSystemOperationType operation,
FileDescriptor& file, Span<char> buffer,
1070 AwaitFileSystemOperationType operation,
FileDescriptor& file, Span<const char> data,
1075 AwaitFileSystemOperationType operation;
1077 StringSpan otherPath;
1082 Span<char> readBuffer;
1083 Span<const char> writeBuffer;
1086 uint64_t offset = 0;
1089 Result operationResult = Result(
true);
1091 bool await_ready()
const;
1092 bool await_suspend(AwaitTask::Handle continuation);
1093 Result await_resume();
1100 AwaitTask::Handle continuation;
1108 AwaitTaskGroupCancelPolicy cancelPolicy = AwaitTaskGroupCancelPolicy::CancelChildren);
1111 Result spawnAll(Span<AwaitTask*> taskList);
1115 AwaitTaskGroupWaitAnyPolicy waitAnyPolicy = AwaitTaskGroupWaitAnyPolicy::CancelRemaining);
1119 [[nodiscard]]
size_t size()
const;
1120 [[nodiscard]]
size_t capacity()
const;
1121 [[nodiscard]]
size_t remainingCapacity()
const;
1122 [[nodiscard]]
bool isEmpty()
const;
1123 [[nodiscard]]
bool isFull()
const;
1130 Span<AwaitTask*> tasks;
1131 AwaitTaskGroupCancelPolicy cancelPolicy;
1132 size_t numTasks = 0;
1145 AwaitTaskRegistryWaitAnyPolicy waitAnyPolicy = AwaitTaskRegistryWaitAnyPolicy::CancelRemaining);
1149 [[nodiscard]]
AwaitTask* taskAt(
size_t index);
1150 [[nodiscard]]
const AwaitTask* taskAt(
size_t index)
const;
1151 [[nodiscard]]
size_t size()
const;
1152 [[nodiscard]]
size_t activeCount()
const;
1153 [[nodiscard]]
size_t completedCount()
const;
1154 [[nodiscard]]
size_t capacity()
const;
1155 [[nodiscard]]
size_t remainingCapacity()
const;
1156 [[nodiscard]]
bool isEmpty()
const;
1157 [[nodiscard]]
bool isFull()
const;
1158 [[nodiscard]]
bool hasActiveTasks()
const;
1159 [[nodiscard]]
bool hasCompletedTasks()
const;
1166 Span<AwaitTask> tasks;
1175 Result operationResult = Result(
true);
1177 bool await_ready()
const;
1178 bool await_suspend(AwaitTask::Handle continuation);
1179 Result await_resume();
1183 static void onTaskCompleted(
void*
object);
1186 void onTaskCompleted();
1187 void finish(Result result);
1188 void clearTaskCallbacks();
1189 Result collectResult()
const;
1191 AwaitTask::Handle continuation;
1192 size_t totalTasks = 0;
1193 size_t completedTasks = 0;
1194 bool finished =
false;
1201 AwaitTaskRegistryWaitAnyPolicy waitAnyPolicy);
1205 AwaitTaskRegistryWaitAnyPolicy waitAnyPolicy;
1206 Result operationResult = Result(
true);
1208 bool await_ready()
const;
1209 bool await_suspend(AwaitTask::Handle continuation);
1210 Result await_resume();
1214 static void onTaskCompleted(
void*
object);
1217 void onTaskCompleted();
1218 void finish(Result result);
1219 void clearTaskCallbacks();
1220 Result setWinner(
size_t index);
1223 AwaitTask::Handle continuation;
1224 size_t totalTasks = 0;
1225 size_t completedTasks = 0;
1226 size_t winnerIndex = size_t(-1);
1227 bool cancelling =
false;
1228 bool finished =
false;
1237 Result operationResult = Result(
true);
1239 bool await_ready()
const;
1240 bool await_suspend(AwaitTask::Handle continuation);
1241 Result await_resume();
1245 static void onTaskCompleted(
void*
object);
1248 void onTaskCompleted();
1249 void finish(Result result);
1250 void clearChildCallbacks();
1251 Result collectResult()
const;
1253 AwaitTask::Handle continuation;
1254 size_t completedTasks = 0;
1255 bool finished =
false;
1262 AwaitTaskGroupWaitAnyPolicy waitAnyPolicy);
1266 AwaitTaskGroupWaitAnyPolicy waitAnyPolicy;
1267 Result operationResult = Result(
true);
1269 bool await_ready()
const;
1270 bool await_suspend(AwaitTask::Handle continuation);
1271 Result await_resume();
1275 static void onTaskCompleted(
void*
object);
1278 void onTaskCompleted();
1279 void finish(Result result);
1280 void clearChildCallbacks();
1281 Result setWinner(
size_t index);
1284 AwaitTask::Handle continuation;
1285 size_t completedTasks = 0;
1286 size_t winnerIndex = size_t(-1);
1287 bool cancelling =
false;
1288 bool finished =
false;
1297 FileDescriptor::Handle process = FileDescriptor::Invalid;
1300 Result operationResult = Result(
true);
1302 bool await_ready()
const;
1303 bool await_suspend(AwaitTask::Handle continuation);
1304 Result await_resume();
1311 AwaitTask::Handle continuation;
1321 int signalNumber = 0;
1324 Result operationResult = Result(
true);
1326 bool await_ready()
const;
1327 bool await_suspend(AwaitTask::Handle continuation);
1328 Result await_resume();
1335 AwaitTask::Handle continuation;
1346 Result operationResult = Result(
true);
1348 bool await_ready()
const;
1349 bool await_suspend(AwaitTask::Handle continuation);
1350 Result await_resume();
1357 AwaitTask::Handle continuation;
1370 Result operationResult = Result(
true);
1372 bool await_ready()
const;
1373 bool await_suspend(AwaitTask::Handle continuation);
1374 Result await_resume();
1378 static void onTaskCompleted(
void*
object);
1381 void onTaskCompleted();
1382 void finish(Result result);
1384 AwaitTask::Handle continuation;
1386 bool cancelling =
false;
1387 bool childCompleted =
false;
1388 bool timeoutStopped =
false;
1389 bool timeoutFired =
false;
1390 bool finished =
false;
1400 Function<Result()> work;
1402 Result operationResult = Result(
true);
1404 bool await_ready()
const;
1405 bool await_suspend(AwaitTask::Handle continuation);
1406 Result await_resume();
1413 AwaitTask::Handle continuation;
Asynchronous I/O (files, sockets, timers, processes, fs events, threads wake-up) (see Async) AsyncEve...
Definition Async.h:1404
Starts an handle polling operation.
Definition Async.h:939
Starts a file read operation, reading bytes from a file (or pipe).
Definition Async.h:785
Sends file contents to a socket using zero-copy when available (sendfile, TransmitFile).
Definition Async.h:989
Starts an asynchronous file system operation (open, close, read, write, sendFile, stat,...
Definition Async.h:1203
Starts a file write operation, writing bytes to a file (or pipe).
Definition Async.h:861
Starts a Timeout that is invoked only once after expiration (relative) time has passed.
Definition Async.h:317
Options for AsyncLoopWakeUp configuration.
Definition Async.h:342
Starts a wake-up operation, allowing threads to execute callbacks on loop thread.
Definition Async.h:365
Executes work in a thread pool and then invokes a callback on the event loop thread.
Definition Async.h:1150
Starts monitoring a process, notifying about its termination.
Definition Async.h:402
Base class for all async results (argument of completion callbacks).
Definition Async.h:272
Starts monitoring a signal, notifying about its reception.
Definition Async.h:464
Starts a socket accept operation, obtaining a new socket from a listening socket.
Definition Async.h:561
Starts a socket connect operation, connecting to a remote endpoint.
Definition Async.h:581
Starts an unconnected socket receive from operation, receiving bytes from a remote endpoint.
Definition Async.h:750
Starts a socket receive operation, receiving bytes from a remote endpoint.
Definition Async.h:693
Starts an unconnected socket send to operation, sending bytes to a remote endpoint.
Definition Async.h:661
Starts a socket send operation, sending bytes to a remote endpoint.
Definition Async.h:615
An AsyncSequence using a SC::ThreadPool to execute one or more SC::AsyncRequest in a background threa...
Definition Async.h:1131
Explicit allocator used by AwaitTask coroutine frame allocation.
Definition Await.h:302
Cancellation hook installed by the awaiter currently suspending an AwaitTask.
Definition Await.h:294
Coroutine-friendly wrapper around an existing AsyncEventLoop.
Definition Await.h:484
Awaiter for a single AsyncFilePoll operation.
Definition Await.h:1035
Awaiter for a single AsyncFileRead operation.
Definition Await.h:915
Result object populated by AwaitEventLoop::fileRead.
Definition Await.h:133
Awaiter that reads until the caller buffer is full or EOF is reached.
Definition Await.h:943
Awaiter for a single AsyncFileSend operation.
Definition Await.h:1007
Awaiter for selected AsyncFileSystemOperation path operations.
Definition Await.h:1058
Awaiter for a single AsyncFileWrite operation.
Definition Await.h:975
Awaiter for a single AsyncLoopWakeUp delivery.
Definition Await.h:608
Stable wake-up object that can resume an AwaitLoopWakeUpAwaiter from another thread.
Definition Await.h:571
Awaiter for a single AsyncLoopWork operation.
Definition Await.h:1395
Awaiter for a single AsyncProcessExit operation.
Definition Await.h:1293
Awaiter for a single one-shot AsyncSignal operation.
Definition Await.h:1317
Awaiter for a single AsyncLoopTimeout operation.
Definition Await.h:585
Awaiter for a single AsyncSocketAccept operation.
Definition Await.h:633
Awaiter for a single AsyncSocketConnect operation.
Definition Await.h:657
Awaiter for a single AsyncSocketReceive operation.
Definition Await.h:802
Awaiter that reactivates AsyncSocketReceive until the whole caller buffer is filled.
Definition Await.h:828
Awaiter for a single AsyncSocketReceiveFrom operation.
Definition Await.h:889
Result object populated by AwaitEventLoop::receiveFrom.
Definition Await.h:125
Awaiter that reads a ' '-terminated line into caller-provided storage.
Definition Await.h:858
Result object populated by AwaitEventLoop::receiveLine.
Definition Await.h:117
Result object populated by AwaitEventLoop::receive.
Definition Await.h:110
Awaiter that reactivates AsyncSocketSend until the whole buffer is sent.
Definition Await.h:742
Awaiter that sends every buffer in a scatter/gather list.
Definition Await.h:769
Awaiter for a single AsyncSocketSend operation.
Definition Await.h:681
Awaiter for a single AsyncSocketSendTo operation.
Definition Await.h:711
Awaiter that waits for every active task in an AwaitTaskGroup.
Definition Await.h:1233
Awaiter that waits for the first active task in an AwaitTaskGroup to complete.
Definition Await.h:1260
Caller-storage structured group of child tasks owned by the current scope.
Definition Await.h:1106
Awaiter that waits for every valid task in an AwaitTaskRegistry.
Definition Await.h:1171
Awaiter that waits for the first valid task in an AwaitTaskRegistry to complete.
Definition Await.h:1199
Caller-owned fixed-slot registry for detached/background tasks.
Definition Await.h:1137
Awaiter that starts a child task if needed, then waits for it to complete.
Definition Await.h:1341
Awaiter that waits for a child task, cancelling it if a timeout expires first.
Definition Await.h:1362
Coroutine promise implementation used by AwaitTask.
Definition Await.h:404
Caller-owned coroutine task returning a plain SC::Result.
Definition Await.h:356
[UniqueHandleDeclaration2Snippet]
Definition File.h:130
Options used to open a file descriptor.
Definition File.h:101
A structure to describe copy flags.
Definition FileSystem.h:76
Low-level OS socket handle.
Definition Socket.h:167
Native representation of an IP Address.
Definition Socket.h:114
Simple thread pool that executes tasks in a fixed number of worker threads.
Definition ThreadPool.h:38