| 2013 | }; |
| 2014 | |
| 2015 | void SC::AsyncEventLoop::Internal::prepareTeardown(AsyncEventLoop& eventLoop, AsyncRequest& async, |
| 2016 | AsyncTeardown& teardown) |
| 2017 | { |
| 2018 | teardown.eventLoop = &eventLoop; |
| 2019 | teardown.type = async.type; |
| 2020 | teardown.flags = async.flags; |
| 2021 | teardown.sequence = async.sequence; |
| 2022 | #if SC_ASYNC_ENABLE_LOG |
| 2023 | #if SC_COMPILER_MSVC || SC_COMPILER_CLANG_CL |
| 2024 | ::strncpy_s(teardown.debugName, async.debugName, sizeof(teardown.debugName)); |
| 2025 | #else |
| 2026 | ::strncpy(teardown.debugName, async.debugName, sizeof(teardown.debugName)); |
| 2027 | #endif |
| 2028 | #endif |
| 2029 | // clang-format off |
| 2030 | switch (async.type) |
| 2031 | { |
| 2032 | // Loop |
| 2033 | case AsyncRequest::Type::LoopTimeout: break; |
| 2034 | case AsyncRequest::Type::LoopWakeUp: break; |
| 2035 | case AsyncRequest::Type::LoopWork: break; |
| 2036 | |
| 2037 | // Process |
| 2038 | case AsyncRequest::Type::ProcessExit: |
| 2039 | #if SC_PLATFORM_LINUX |
| 2040 | (void)static_cast<AsyncProcessExit&>(async).pidFd.get(teardown.fileHandle, Result::Error("missing pidfd")); |
| 2041 | static_cast<AsyncProcessExit&>(async).pidFd.detach(); |
| 2042 | #endif |
| 2043 | teardown.processHandle = static_cast<AsyncProcessExit&>(async).handle; |
| 2044 | break; |
| 2045 | |
| 2046 | case AsyncRequest::Type::Signal: |
| 2047 | #if SC_PLATFORM_WINDOWS |
| 2048 | teardown.signalNumber = static_cast<AsyncSignal&>(async).signalNumber; |
| 2049 | #elif SC_PLATFORM_LINUX |
| 2050 | (void)static_cast<AsyncSignal&>(async).signalFd.get(teardown.fileHandle, Result::Error("missing signalfd")); |
| 2051 | static_cast<AsyncSignal&>(async).signalFd.detach(); |
| 2052 | #elif SC_PLATFORM_APPLE |
| 2053 | teardown.signalNumber = static_cast<AsyncSignal&>(async).signalNumber; |
| 2054 | #endif |
| 2055 | break; |
| 2056 | |
| 2057 | // Socket |
| 2058 | case AsyncRequest::Type::SocketAccept: teardown.socketHandle = static_cast<AsyncSocketAccept&>(async).handle; break; |
| 2059 | case AsyncRequest::Type::SocketConnect: teardown.socketHandle = static_cast<AsyncSocketConnect&>(async).handle; break; |
| 2060 | case AsyncRequest::Type::SocketSend: teardown.socketHandle = static_cast<AsyncSocketSend&>(async).handle; break; |
| 2061 | case AsyncRequest::Type::SocketSendTo: teardown.socketHandle = static_cast<AsyncSocketSendTo&>(async).handle; break; |
| 2062 | case AsyncRequest::Type::SocketReceive: teardown.socketHandle = static_cast<AsyncSocketReceive&>(async).handle; break; |
| 2063 | case AsyncRequest::Type::SocketReceiveFrom: teardown.socketHandle = static_cast<AsyncSocketReceiveFrom&>(async).handle; break; |
| 2064 | |
| 2065 | // File |
| 2066 | case AsyncRequest::Type::FileRead: teardown.fileHandle = static_cast<AsyncFileRead&>(async).handle; break; |
| 2067 | case AsyncRequest::Type::FileWrite: teardown.fileHandle = static_cast<AsyncFileWrite&>(async).handle; break; |
| 2068 | case AsyncRequest::Type::FileSend: teardown.fileHandle = static_cast<AsyncFileSend&>(async).fileHandle; break; |
| 2069 | case AsyncRequest::Type::FileReadiness: teardown.fileHandle = static_cast<AsyncFileReadiness&>(async).handle; break; |
| 2070 | case AsyncRequest::Type::ExternalCompletion: teardown.fileHandle = static_cast<AsyncExternalCompletion&>(async).handle; break; |
| 2071 | |
| 2072 | // FileSystemOperation |