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;
129 bool disconnected =
false;
136 bool endOfFile =
false;
148 bool useOffset =
false;
155 bool useOffset =
false;
168 size_t bytesTransferred = 0;
169 bool usedZeroCopy =
false;
170 bool complete =
false;
175 bool timedOut =
false;
185 int signalNumber = 0;
186 uint32_t deliveryCount = 0;
191 uint32_t deliveryCount = 0;
196 size_t index = size_t(-1);
203 size_t numCompleted = 0;
204 size_t numSucceeded = 0;
205 size_t numFailed = 0;
206 size_t firstFailureIndex = size_t(-1);
208 Result firstFailure = Result(
true);
213 size_t index = size_t(-1);
219 size_t index = size_t(-1);
223enum class AwaitTaskGroupCancelPolicy : uint8_t
226 LeaveChildrenRunning,
229enum class AwaitTaskGroupWaitAnyPolicy : uint8_t
232 LeaveRemainingRunning,
235enum class AwaitTaskRegistryWaitAnyPolicy : uint8_t
238 LeaveRemainingRunning,
241enum class AwaitAllocatorMode : uint8_t
252 size_t numAllocations = 0;
253 size_t numReleases = 0;
255 size_t requestedBytesAllocated = 0;
256 size_t requestedBytesReleased = 0;
258 size_t bytesInUse = 0;
259 size_t peakBytesInUse = 0;
260 size_t largestRequestedAllocationSize = 0;
262 size_t numAllocationFailures = 0;
263 size_t lastFailedAllocationSize = 0;
264 size_t largestFailedAllocationSize = 0;
269 size_t reserveBytes = 0;
270 size_t initialCommitBytes = 0;
275 virtual void* allocateImpl(
const void* owner,
size_t numBytes,
size_t alignment) = 0;
276 virtual void releaseImpl(
void* memory) = 0;
280enum class AwaitFileSystemOperationType : uint8_t
289 RemoveEmptyDirectory,
296 void*
object =
nullptr;
298 Result (*cancel)(
void* object,
AwaitEventLoop& eventLoop) =
nullptr;
311 [[nodiscard]] Result createFixed(Span<char> storage);
313 [[nodiscard]] Result createMalloc();
315 [[nodiscard]] Result close();
317 [[nodiscard]]
void* allocate(
const void* owner,
size_t numBytes,
size_t alignment);
318 void release(
void* memory);
319 static void releaseFromAnyAllocator(
void* memory);
321 [[nodiscard]] AwaitAllocatorMode mode()
const;
323 [[nodiscard]]
bool isOpen()
const;
325 [[nodiscard]]
size_t used()
const;
326 [[nodiscard]]
size_t capacity()
const;
327 [[nodiscard]]
size_t peakUsed()
const;
328 [[nodiscard]]
size_t largestAllocationSize()
const;
329 [[nodiscard]]
size_t failedAllocationSize()
const;
330 [[nodiscard]]
size_t reservedBytes()
const;
331 [[nodiscard]]
size_t committedBytes()
const;
336 Result initializeFixedStorage(Span<char> storage);
337 void* allocateFromBlocks(
const void* owner,
size_t numBytes,
size_t alignment);
338 void releaseBlock(BlockHeader& header);
339 bool ensureCommitted(
size_t sizeInBytes);
340 void releaseVirtualMemory();
341 void recordAllocationFailure(
size_t numBytes);
344 AwaitAllocatorMode currentMode = AwaitAllocatorMode::None;
346 Span<char> fixedStorage;
347 BlockHeader* firstBlock =
nullptr;
350 void* virtualMemory =
nullptr;
351 size_t virtualReservedBytes = 0;
352 size_t virtualCommittedBytes = 0;
360 using Handle = AwaitCoroutineTypedHandle<Promise>;
372 [[nodiscard]]
bool isValid()
const;
373 [[nodiscard]]
bool isStarted()
const;
374 [[nodiscard]]
bool isCompleted()
const;
375 [[nodiscard]]
bool isActive()
const;
376 [[nodiscard]]
bool isCancellationRequested()
const;
378 [[nodiscard]] Result result()
const;
382 bool await_ready()
const;
383 bool await_suspend(Handle continuation);
384 Result await_resume()
const;
408 template <
typename First,
typename... Rest>
411 eventLoop = findEventLoop(first, rest...);
414 template <
typename... Rest>
423 template <
typename First,
typename... Rest>
426 return findEventLoop(rest...);
429 static void* allocateFrame(
size_t size,
AwaitEventLoop* eventLoop)
noexcept;
430 static void deallocateFrame(
void* frame)
noexcept;
432 static void*
operator new(
size_t size)
noexcept;
434 template <
typename First,
typename... Rest>
435 static void*
operator new(
size_t size, First& first, Rest&... rest)
noexcept
437 return allocateFrame(size, findEventLoop(first, rest...));
440 template <
typename... Rest>
441 static void*
operator new(
size_t size,
AwaitEventLoop& await, Rest&...)
noexcept
443 return allocateFrame(size, &await);
446 static void operator delete(
void* frame, size_t)
noexcept;
448 static AwaitTask get_return_object_on_allocation_failure();
452 AwaitSuspendAlways initial_suspend()
noexcept;
456 bool await_ready()
noexcept;
457 void await_suspend(AwaitTask::Handle handle)
noexcept;
458 void await_resume()
noexcept;
463 void return_value(Result newResult) noexcept;
465 void unhandled_exception() noexcept;
473 void* completionObject;
474 void (*completionCallback)(
void*
object);
478 bool cancellationRequested;
479 bool inCompletionCallback;
480 bool destroyDeferred;
567 void deferDestroy(AwaitTask::Handle handle);
568 void drainDeferredDestroys();
572 AwaitTask::Handle deferredDestroyList;
581 [[nodiscard]]
bool isActive()
const;
597 Result operationResult = Result(
true);
599 bool await_ready()
const;
600 bool await_suspend(AwaitTask::Handle continuation);
601 Result await_resume();
608 AwaitTask::Handle continuation;
622 Result operationResult = Result(
true);
624 bool await_ready()
const;
625 bool await_suspend(AwaitTask::Handle continuation);
626 Result await_resume();
633 AwaitTask::Handle continuation;
646 Result operationResult = Result(
true);
648 bool await_ready()
const;
649 bool await_suspend(AwaitTask::Handle continuation);
650 Result await_resume();
657 AwaitTask::Handle continuation;
671 Result operationResult = Result(
true);
673 bool await_ready()
const;
674 bool await_suspend(AwaitTask::Handle continuation);
675 Result await_resume();
682 AwaitTask::Handle continuation;
696 Span<const char> data;
697 Span<Span<const char>> buffers;
700 Result operationResult = Result(
true);
701 bool singleBuffer =
true;
703 bool await_ready()
const;
704 bool await_suspend(AwaitTask::Handle continuation);
705 Result await_resume();
712 AwaitTask::Handle continuation;
731 Span<const char> data;
732 Span<Span<const char>> buffers;
735 Result operationResult = Result(
true);
736 bool singleBuffer =
true;
738 bool await_ready()
const;
739 bool await_suspend(AwaitTask::Handle continuation);
740 Result await_resume();
747 AwaitTask::Handle continuation;
759 Span<const char> data;
762 Result operationResult = Result(
true);
763 size_t numBytesSent = 0;
765 bool await_ready()
const;
766 bool await_suspend(AwaitTask::Handle continuation);
767 Result await_resume();
774 AwaitTask::Handle continuation;
786 Span<Span<const char>> data;
790 Result operationResult = Result(
true);
791 size_t numBytesSent = 0;
792 size_t bufferIndex = 0;
793 size_t bufferOffset = 0;
795 bool await_ready()
const;
796 bool await_suspend(AwaitTask::Handle continuation);
797 Result await_resume();
803 bool findNextBuffer();
804 Result startCurrentBuffer();
805 Result updateRequestBuffer();
807 AwaitTask::Handle continuation;
822 Result operationResult = Result(
true);
824 bool await_ready()
const;
825 bool await_suspend(AwaitTask::Handle continuation);
826 Result await_resume();
833 AwaitTask::Handle continuation;
848 Result operationResult = Result(
true);
849 size_t numBytesReceived = 0;
851 bool await_ready()
const;
852 bool await_suspend(AwaitTask::Handle continuation);
853 Result await_resume();
859 Result startRemainingReceive();
860 Result updateRequestBuffer();
861 Result updateOutResult(
bool disconnected);
863 AwaitTask::Handle continuation;
878 Result operationResult = Result(
true);
879 size_t numBytesReceived = 0;
880 char currentByte = 0;
881 bool lineComplete =
false;
883 bool await_ready()
const;
884 bool await_suspend(AwaitTask::Handle continuation);
885 Result await_resume();
891 Result startNextByte();
892 Result updateOutResult(
bool disconnected);
894 AwaitTask::Handle continuation;
909 Result operationResult = Result(
true);
911 bool await_ready()
const;
912 bool await_suspend(AwaitTask::Handle continuation);
913 Result await_resume();
920 AwaitTask::Handle continuation;
937 Result operationResult = Result(
true);
939 bool await_ready()
const;
940 bool await_suspend(AwaitTask::Handle continuation);
941 Result await_resume();
948 AwaitTask::Handle continuation;
965 Result operationResult = Result(
true);
966 size_t numBytesRead = 0;
968 bool await_ready()
const;
969 bool await_suspend(AwaitTask::Handle continuation);
970 Result await_resume();
976 Result startRemainingRead();
977 Result updateRequestBufferAndOffset();
978 Result updateOutResult(
bool endOfFile);
980 AwaitTask::Handle continuation;
994 Span<const char> data;
995 Span<Span<const char>> buffers;
1000 Result operationResult = Result(
true);
1001 bool singleBuffer =
true;
1003 bool await_ready()
const;
1004 bool await_suspend(AwaitTask::Handle continuation);
1005 Result await_resume();
1012 AwaitTask::Handle continuation;
1029 Result operationResult = Result(
true);
1031 bool await_ready()
const;
1032 bool await_suspend(AwaitTask::Handle continuation);
1033 Result await_resume();
1040 AwaitTask::Handle continuation;
1052 Result operationResult = Result(
true);
1054 bool await_ready()
const;
1055 bool await_suspend(AwaitTask::Handle continuation);
1056 Result await_resume();
1063 AwaitTask::Handle continuation;
1071 AwaitFileSystemOperationType operation, StringSpan path,
1078 AwaitFileSystemOperationType operation,
FileDescriptor& file, Span<char> buffer,
1081 AwaitFileSystemOperationType operation,
FileDescriptor& file, Span<const char> data,
1086 AwaitFileSystemOperationType operation;
1088 StringSpan otherPath;
1093 Span<char> readBuffer;
1094 Span<const char> writeBuffer;
1097 uint64_t offset = 0;
1100 Result operationResult = Result(
true);
1102 bool await_ready()
const;
1103 bool await_suspend(AwaitTask::Handle continuation);
1104 Result await_resume();
1111 AwaitTask::Handle continuation;
1119 AwaitTaskGroupCancelPolicy cancelPolicy = AwaitTaskGroupCancelPolicy::CancelChildren);
1122 Result spawnAll(Span<AwaitTask*> taskList);
1126 AwaitTaskGroupWaitAnyPolicy waitAnyPolicy = AwaitTaskGroupWaitAnyPolicy::CancelRemaining);
1130 [[nodiscard]]
size_t size()
const;
1131 [[nodiscard]]
size_t capacity()
const;
1132 [[nodiscard]]
size_t remainingCapacity()
const;
1133 [[nodiscard]]
bool isEmpty()
const;
1134 [[nodiscard]]
bool isFull()
const;
1141 Span<AwaitTask*> tasks;
1142 AwaitTaskGroupCancelPolicy cancelPolicy;
1143 size_t numTasks = 0;
1156 AwaitTaskRegistryWaitAnyPolicy waitAnyPolicy = AwaitTaskRegistryWaitAnyPolicy::CancelRemaining);
1160 [[nodiscard]]
AwaitTask* taskAt(
size_t index);
1161 [[nodiscard]]
const AwaitTask* taskAt(
size_t index)
const;
1162 [[nodiscard]]
size_t size()
const;
1163 [[nodiscard]]
size_t activeCount()
const;
1164 [[nodiscard]]
size_t completedCount()
const;
1165 [[nodiscard]]
size_t capacity()
const;
1166 [[nodiscard]]
size_t remainingCapacity()
const;
1167 [[nodiscard]]
bool isEmpty()
const;
1168 [[nodiscard]]
bool isFull()
const;
1169 [[nodiscard]]
bool hasActiveTasks()
const;
1170 [[nodiscard]]
bool hasCompletedTasks()
const;
1177 Span<AwaitTask> tasks;
1186 Result operationResult = Result(
true);
1188 bool await_ready()
const;
1189 bool await_suspend(AwaitTask::Handle continuation);
1190 Result await_resume();
1194 static void onTaskCompleted(
void*
object);
1197 void onTaskCompleted();
1198 void finish(Result result);
1199 void clearTaskCallbacks();
1200 Result collectResult()
const;
1202 AwaitTask::Handle continuation;
1203 size_t totalTasks = 0;
1204 size_t completedTasks = 0;
1205 bool finished =
false;
1212 AwaitTaskRegistryWaitAnyPolicy waitAnyPolicy);
1216 AwaitTaskRegistryWaitAnyPolicy waitAnyPolicy;
1217 Result operationResult = Result(
true);
1219 bool await_ready()
const;
1220 bool await_suspend(AwaitTask::Handle continuation);
1221 Result await_resume();
1225 static void onTaskCompleted(
void*
object);
1228 void onTaskCompleted();
1229 void finish(Result result);
1230 void clearTaskCallbacks();
1231 Result setWinner(
size_t index);
1234 AwaitTask::Handle continuation;
1235 size_t totalTasks = 0;
1236 size_t completedTasks = 0;
1237 size_t winnerIndex = size_t(-1);
1238 bool cancelling =
false;
1239 bool finished =
false;
1248 Result operationResult = Result(
true);
1250 bool await_ready()
const;
1251 bool await_suspend(AwaitTask::Handle continuation);
1252 Result await_resume();
1256 static void onTaskCompleted(
void*
object);
1259 void onTaskCompleted();
1260 void finish(Result result);
1261 void clearChildCallbacks();
1262 Result collectResult()
const;
1264 AwaitTask::Handle continuation;
1265 size_t completedTasks = 0;
1266 bool finished =
false;
1273 AwaitTaskGroupWaitAnyPolicy waitAnyPolicy);
1277 AwaitTaskGroupWaitAnyPolicy waitAnyPolicy;
1278 Result operationResult = Result(
true);
1280 bool await_ready()
const;
1281 bool await_suspend(AwaitTask::Handle continuation);
1282 Result await_resume();
1286 static void onTaskCompleted(
void*
object);
1289 void onTaskCompleted();
1290 void finish(Result result);
1291 void clearChildCallbacks();
1292 Result setWinner(
size_t index);
1295 AwaitTask::Handle continuation;
1296 size_t completedTasks = 0;
1297 size_t winnerIndex = size_t(-1);
1298 bool cancelling =
false;
1299 bool finished =
false;
1308 FileDescriptor::Handle process = FileDescriptor::Invalid;
1311 Result operationResult = Result(
true);
1313 bool await_ready()
const;
1314 bool await_suspend(AwaitTask::Handle continuation);
1315 Result await_resume();
1322 AwaitTask::Handle continuation;
1332 int signalNumber = 0;
1335 Result operationResult = Result(
true);
1337 bool await_ready()
const;
1338 bool await_suspend(AwaitTask::Handle continuation);
1339 Result await_resume();
1346 AwaitTask::Handle continuation;
1357 Result operationResult = Result(
true);
1359 bool await_ready()
const;
1360 bool await_suspend(AwaitTask::Handle continuation);
1361 Result await_resume();
1368 AwaitTask::Handle continuation;
1381 Result operationResult = Result(
true);
1383 bool await_ready()
const;
1384 bool await_suspend(AwaitTask::Handle continuation);
1385 Result await_resume();
1389 static void onTaskCompleted(
void*
object);
1392 void onTaskCompleted();
1393 void finish(Result result);
1395 AwaitTask::Handle continuation;
1397 bool cancelling =
false;
1398 bool childCompleted =
false;
1399 bool timeoutStopped =
false;
1400 bool timeoutFired =
false;
1401 bool finished =
false;
1411 Function<Result()> work;
1413 Result operationResult = Result(
true);
1415 bool await_ready()
const;
1416 bool await_suspend(AwaitTask::Handle continuation);
1417 Result await_resume();
1424 AwaitTask::Handle continuation;
Asynchronous I/O (files, sockets, timers, processes, fs events, threads wake-up) (see Async) AsyncEve...
Definition Async.h:1506
Starts a file read operation, reading bytes from a file (or pipe).
Definition Async.h:839
Starts a file descriptor readiness operation.
Definition Async.h:996
Sends file contents to a socket using zero-copy when available (sendfile, TransmitFile).
Definition Async.h:1087
Starts an asynchronous file system operation (open, close, read, write, sendFile, stat,...
Definition Async.h:1303
Starts a file write operation, writing bytes to a file (or pipe).
Definition Async.h:919
Starts a Timeout that is invoked only once after expiration (relative) time has passed.
Definition Async.h:332
Options for AsyncLoopWakeUp configuration.
Definition Async.h:362
Starts a wake-up operation, allowing threads to execute callbacks on loop thread.
Definition Async.h:388
Executes work in a thread pool and then invokes a callback on the event loop thread.
Definition Async.h:1250
Starts monitoring a process, notifying about its termination.
Definition Async.h:425
Base class for all async results (argument of completion callbacks).
Definition Async.h:287
Starts monitoring a signal, notifying about its reception.
Definition Async.h:502
Starts a socket accept operation, obtaining a new socket from a listening socket.
Definition Async.h:599
Starts a socket connect operation, connecting to a remote endpoint.
Definition Async.h:619
Starts an unconnected socket receive from operation, receiving bytes from a remote endpoint.
Definition Async.h:800
Starts a socket receive operation, receiving bytes from a remote endpoint.
Definition Async.h:738
Starts an unconnected socket send to operation, sending bytes to a remote endpoint.
Definition Async.h:700
Starts a socket send operation, sending bytes to a remote endpoint.
Definition Async.h:654
An AsyncSequence using a SC::ThreadPool to execute one or more SC::AsyncRequest in a background threa...
Definition Async.h:1231
Explicit allocator used by AwaitTask coroutine frame allocation.
Definition Await.h:303
Cancellation hook installed by the awaiter currently suspending an AwaitTask.
Definition Await.h:295
Coroutine-friendly wrapper around an existing AsyncEventLoop.
Definition Await.h:485
Awaiter for a single AsyncFileReadiness operation.
Definition Await.h:1046
Awaiter for a single AsyncFileRead operation.
Definition Await.h:926
Result object populated by AwaitEventLoop::fileRead.
Definition Await.h:134
Awaiter that reads until the caller buffer is full or EOF is reached.
Definition Await.h:954
Awaiter for a single AsyncFileSend operation.
Definition Await.h:1018
Awaiter for selected AsyncFileSystemOperation path operations.
Definition Await.h:1069
Awaiter for a single AsyncFileWrite operation.
Definition Await.h:986
Awaiter for a single AsyncLoopWakeUp delivery.
Definition Await.h:614
Stable wake-up object that can resume an AwaitLoopWakeUpAwaiter from another thread.
Definition Await.h:577
Awaiter for a single AsyncLoopWork operation.
Definition Await.h:1406
Awaiter for a single AsyncProcessExit operation.
Definition Await.h:1304
Awaiter for a single one-shot AsyncSignal operation.
Definition Await.h:1328
Awaiter for a single AsyncLoopTimeout operation.
Definition Await.h:591
Awaiter for a single AsyncSocketAccept operation.
Definition Await.h:639
Awaiter for a single AsyncSocketConnect operation.
Definition Await.h:663
Awaiter for a single AsyncSocketReceive operation.
Definition Await.h:813
Awaiter that reactivates AsyncSocketReceive until the whole caller buffer is filled.
Definition Await.h:839
Awaiter for a single AsyncSocketReceiveFrom operation.
Definition Await.h:900
Result object populated by AwaitEventLoop::receiveFrom.
Definition Await.h:125
SocketAddress sourceSocketAddress
Family-neutral source address.
Definition Await.h:128
SocketIPAddress sourceAddress
IPv4/IPv6 compatibility result.
Definition Await.h:127
Awaiter that reads a ' '-terminated line into caller-provided storage.
Definition Await.h:869
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:753
Awaiter that sends every buffer in a scatter/gather list.
Definition Await.h:780
Awaiter for a single AsyncSocketSend operation.
Definition Await.h:688
Awaiter for a single AsyncSocketSendTo operation.
Definition Await.h:718
Awaiter that waits for every active task in an AwaitTaskGroup.
Definition Await.h:1244
Awaiter that waits for the first active task in an AwaitTaskGroup to complete.
Definition Await.h:1271
Caller-storage structured group of child tasks owned by the current scope.
Definition Await.h:1117
Awaiter that waits for every valid task in an AwaitTaskRegistry.
Definition Await.h:1182
Awaiter that waits for the first valid task in an AwaitTaskRegistry to complete.
Definition Await.h:1210
Caller-owned fixed-slot registry for detached/background tasks.
Definition Await.h:1148
Awaiter that starts a child task if needed, then waits for it to complete.
Definition Await.h:1352
Awaiter that waits for a child task, cancelling it if a timeout expires first.
Definition Await.h:1373
Coroutine promise implementation used by AwaitTask.
Definition Await.h:405
Caller-owned coroutine task returning a plain SC::Result.
Definition Await.h:357
[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
Family-neutral native socket address.
Definition Socket.h:168
Low-level OS socket handle.
Definition Socket.h:207
Native representation of an IP Address.
Definition Socket.h:117
Simple thread pool that executes tasks in a fixed number of worker threads.
Definition ThreadPool.h:38