From 2a6bffadffd1ad317f28c992355f5548a6d3ccb4 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Wed, 14 Jan 2026 10:22:24 -0800 Subject: [PATCH 1/4] feat: add CancelIoEx support for accept operations on Windows - Add virtual do_cancel() hook to overlapped_op base class - Implement accept_op::do_cancel() calling CancelIoEx on listen socket - Wire canceller to invoke do_cancel() after request_cancel() --- src/detail/win_iocp_sockets.cpp | 12 ++++++++++++ src/detail/win_iocp_sockets.hpp | 3 +++ src/detail/win_overlapped_op.hpp | 11 ++++++++++- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/detail/win_iocp_sockets.cpp b/src/detail/win_iocp_sockets.cpp index 6d8e2cc..efbac9f 100644 --- a/src/detail/win_iocp_sockets.cpp +++ b/src/detail/win_iocp_sockets.cpp @@ -75,6 +75,18 @@ operator()() d(h).resume(); } +void +accept_op:: +do_cancel() noexcept +{ + if (listen_socket != INVALID_SOCKET) + { + ::CancelIoEx( + reinterpret_cast(listen_socket), + this); + } +} + win_socket_impl:: win_socket_impl(win_iocp_sockets& svc) noexcept : svc_(svc) diff --git a/src/detail/win_iocp_sockets.hpp b/src/detail/win_iocp_sockets.hpp index 9182a1f..ca76252 100644 --- a/src/detail/win_iocp_sockets.hpp +++ b/src/detail/win_iocp_sockets.hpp @@ -73,6 +73,9 @@ struct accept_op : overlapped_op /** Resume the coroutine after accept completes. */ void operator()() override; + + /** Cancel the pending accept via CancelIoEx. */ + void do_cancel() noexcept override; }; //------------------------------------------------------------------------------ diff --git a/src/detail/win_overlapped_op.hpp b/src/detail/win_overlapped_op.hpp index 399e5b3..3798746 100644 --- a/src/detail/win_overlapped_op.hpp +++ b/src/detail/win_overlapped_op.hpp @@ -36,7 +36,11 @@ struct overlapped_op struct canceller { overlapped_op* op; - void operator()() const noexcept { op->request_cancel(); } + void operator()() const noexcept + { + op->request_cancel(); + op->do_cancel(); + } }; capy::any_coro h; @@ -108,6 +112,11 @@ struct overlapped_op cancelled.store(true, std::memory_order_release); } + /** Hook for derived classes to perform actual I/O cancellation. */ + virtual void do_cancel() noexcept + { + } + void start(std::stop_token token) { cancelled.store(false, std::memory_order_release); From 791cbb621313b3358b69a2c36938e602ee70ddf2 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Wed, 14 Jan 2026 11:49:02 -0800 Subject: [PATCH 2/4] feat: implement cancellation for read and write socket operations - Add do_cancel() implementation for read_op using CancelIoEx - Add do_cancel() implementation for write_op using CancelIoEx - Add win_socket_impl reference to read_op and write_op structs - Initialize read and write operations with socket impl in constructor --- src/detail/win_iocp_sockets.cpp | 26 ++++++++++++++++++++++++++ src/detail/win_iocp_sockets.hpp | 9 +++++++++ 2 files changed, 35 insertions(+) diff --git a/src/detail/win_iocp_sockets.cpp b/src/detail/win_iocp_sockets.cpp index efbac9f..cb3cdbb 100644 --- a/src/detail/win_iocp_sockets.cpp +++ b/src/detail/win_iocp_sockets.cpp @@ -87,9 +87,35 @@ do_cancel() noexcept } } +void +read_op:: +do_cancel() noexcept +{ + if (impl.is_open()) + { + ::CancelIoEx( + reinterpret_cast(impl.native_handle()), + this); + } +} + +void +write_op:: +do_cancel() noexcept +{ + if (impl.is_open()) + { + ::CancelIoEx( + reinterpret_cast(impl.native_handle()), + this); + } +} + win_socket_impl:: win_socket_impl(win_iocp_sockets& svc) noexcept : svc_(svc) + , rd_(*this) + , wr_(*this) { } diff --git a/src/detail/win_iocp_sockets.hpp b/src/detail/win_iocp_sockets.hpp index ca76252..9dfbe81 100644 --- a/src/detail/win_iocp_sockets.hpp +++ b/src/detail/win_iocp_sockets.hpp @@ -49,8 +49,12 @@ struct read_op : overlapped_op WSABUF wsabufs[max_buffers]; DWORD wsabuf_count = 0; DWORD flags = 0; + win_socket_impl& impl; + + explicit read_op(win_socket_impl& impl_) noexcept : impl(impl_) {} bool is_read_operation() const noexcept override { return true; } + void do_cancel() noexcept override; }; /** Write operation state with buffer descriptors. */ @@ -59,6 +63,11 @@ struct write_op : overlapped_op static constexpr std::size_t max_buffers = 16; WSABUF wsabufs[max_buffers]; DWORD wsabuf_count = 0; + win_socket_impl& impl; + + explicit write_op(win_socket_impl& impl_) noexcept : impl(impl_) {} + + void do_cancel() noexcept override; }; /** Accept operation state. */ From f32951cdd94f0b3753c1fd7b8c8c4422d2a2aded Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Wed, 14 Jan 2026 11:57:05 -0800 Subject: [PATCH 3/4] fix: add cancellation support for Windows socket connect - Add impl reference and do_cancel() override to connect_op struct - Implement connect_op::do_cancel() calling CancelIoEx on the socket - Initialize conn_ member with socket impl reference in constructor --- src/detail/win_iocp_sockets.cpp | 13 +++++++++++++ src/detail/win_iocp_sockets.hpp | 5 +++++ 2 files changed, 18 insertions(+) diff --git a/src/detail/win_iocp_sockets.cpp b/src/detail/win_iocp_sockets.cpp index cb3cdbb..33b5b95 100644 --- a/src/detail/win_iocp_sockets.cpp +++ b/src/detail/win_iocp_sockets.cpp @@ -111,9 +111,22 @@ do_cancel() noexcept } } +void +connect_op:: +do_cancel() noexcept +{ + if (impl.is_open()) + { + ::CancelIoEx( + reinterpret_cast(impl.native_handle()), + this); + } +} + win_socket_impl:: win_socket_impl(win_iocp_sockets& svc) noexcept : svc_(svc) + , conn_(*this) , rd_(*this) , wr_(*this) { diff --git a/src/detail/win_iocp_sockets.hpp b/src/detail/win_iocp_sockets.hpp index 9dfbe81..021f6a4 100644 --- a/src/detail/win_iocp_sockets.hpp +++ b/src/detail/win_iocp_sockets.hpp @@ -40,6 +40,11 @@ class win_acceptor_impl; /** Connect operation state. */ struct connect_op : overlapped_op { + win_socket_impl& impl; + + explicit connect_op(win_socket_impl& impl_) noexcept : impl(impl_) {} + + void do_cancel() noexcept override; }; /** Read operation state with buffer descriptors. */ From a9285eee196faccbeb34eec620b2c2dd4ce9519a Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Wed, 14 Jan 2026 16:19:59 -0800 Subject: [PATCH 4/4] chore: relocate sources and add build presets - move implementation sources under src/corosio/src and adjust build files - add CMakePresets.json default Ninja configure to out/build - note portable capy::cond comparisons in docs and public API comments - refresh ignore rules to keep build scripts while ignoring outputs --- .gitignore | 11 ++++++----- CMakeLists.txt | 13 ++++++------- CMakePresets.json | 16 ++++++++++++++++ build/Jamfile | 12 ++++-------- doc/modules/ROOT/pages/io/acceptor.adoc | 2 +- doc/modules/ROOT/pages/io/sockets.adoc | 6 +++--- include/boost/corosio/acceptor.hpp | 4 +++- include/boost/corosio/io_stream.hpp | 9 ++++++--- include/boost/corosio/resolver.hpp | 1 + include/boost/corosio/socket.hpp | 4 +++- src/{ => corosio/src}/acceptor.cpp | 0 .../src}/detail/endpoint_convert.hpp | 0 src/{ => corosio/src}/detail/except.cpp | 0 src/{ => corosio/src}/detail/posix_op.hpp | 0 .../src}/detail/posix_resolver_service.hpp | 0 src/{ => corosio/src}/detail/posix_scheduler.cpp | 0 src/{ => corosio/src}/detail/posix_scheduler.hpp | 0 src/{ => corosio/src}/detail/posix_sockets.hpp | 0 .../src}/detail/win_iocp_resolver_service.cpp | 0 .../src}/detail/win_iocp_resolver_service.hpp | 0 .../src}/detail/win_iocp_scheduler.cpp | 0 .../src}/detail/win_iocp_scheduler.hpp | 0 .../src}/detail/win_iocp_sockets.cpp | 0 .../src}/detail/win_iocp_sockets.hpp | 0 src/{ => corosio/src}/detail/win_mutex.hpp | 0 .../src}/detail/win_overlapped_op.hpp | 0 src/{ => corosio/src}/detail/win_wsa_init.cpp | 0 src/{ => corosio/src}/detail/win_wsa_init.hpp | 0 src/{ => corosio/src}/detail/windows.hpp | 0 src/{ => corosio/src}/io_context.cpp | 0 src/{ => corosio/src}/resolver.cpp | 0 src/{ => corosio/src}/socket.cpp | 0 32 files changed, 49 insertions(+), 29 deletions(-) create mode 100644 CMakePresets.json rename src/{ => corosio/src}/acceptor.cpp (100%) rename src/{ => corosio/src}/detail/endpoint_convert.hpp (100%) rename src/{ => corosio/src}/detail/except.cpp (100%) rename src/{ => corosio/src}/detail/posix_op.hpp (100%) rename src/{ => corosio/src}/detail/posix_resolver_service.hpp (100%) rename src/{ => corosio/src}/detail/posix_scheduler.cpp (100%) rename src/{ => corosio/src}/detail/posix_scheduler.hpp (100%) rename src/{ => corosio/src}/detail/posix_sockets.hpp (100%) rename src/{ => corosio/src}/detail/win_iocp_resolver_service.cpp (100%) rename src/{ => corosio/src}/detail/win_iocp_resolver_service.hpp (100%) rename src/{ => corosio/src}/detail/win_iocp_scheduler.cpp (100%) rename src/{ => corosio/src}/detail/win_iocp_scheduler.hpp (100%) rename src/{ => corosio/src}/detail/win_iocp_sockets.cpp (100%) rename src/{ => corosio/src}/detail/win_iocp_sockets.hpp (100%) rename src/{ => corosio/src}/detail/win_mutex.hpp (100%) rename src/{ => corosio/src}/detail/win_overlapped_op.hpp (100%) rename src/{ => corosio/src}/detail/win_wsa_init.cpp (100%) rename src/{ => corosio/src}/detail/win_wsa_init.hpp (100%) rename src/{ => corosio/src}/detail/windows.hpp (100%) rename src/{ => corosio/src}/io_context.cpp (100%) rename src/{ => corosio/src}/resolver.cpp (100%) rename src/{ => corosio/src}/socket.cpp (100%) diff --git a/.gitignore b/.gitignore index 23585bf..d41f09f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ -/build-*/ -/bin64/ -.cache/ -/output/ -/.temp +/.vscode/ +/build/ +!/build/Jamfile +!/build/wolfssl.jam +/out/ +CMakeUserPresets.json diff --git a/CMakeLists.txt b/CMakeLists.txt index 391a240..44cafa0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -130,20 +130,19 @@ file(GLOB_RECURSE BOOST_COROSIO_HEADERS CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/include/boost/corosio/*.hpp" "${CMAKE_CURRENT_SOURCE_DIR}/include/boost/corosio.hpp") file(GLOB_RECURSE BOOST_COROSIO_SOURCES CONFIGURE_DEPENDS - "${CMAKE_CURRENT_SOURCE_DIR}/src/*.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp") -# Exclude wolfssl files from main library (they are added separately when WolfSSL is found) -list(FILTER BOOST_COROSIO_HEADERS EXCLUDE REGEX ".*/wolfssl/.*") -list(FILTER BOOST_COROSIO_SOURCES EXCLUDE REGEX ".*/wolfssl/.*") + "${CMAKE_CURRENT_SOURCE_DIR}/src/corosio/src/*.hpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/corosio/src/*.cpp") source_group("" FILES "include/boost/corosio.hpp") source_group(TREE "${CMAKE_CURRENT_SOURCE_DIR}/include/boost/corosio" PREFIX "include" FILES ${BOOST_COROSIO_HEADERS}) -source_group(TREE "${CMAKE_CURRENT_SOURCE_DIR}/src" PREFIX "src" FILES ${BOOST_COROSIO_SOURCES}) +source_group(TREE "${CMAKE_CURRENT_SOURCE_DIR}/src/corosio/src" PREFIX "src" FILES ${BOOST_COROSIO_SOURCES}) function(boost_corosio_setup_properties target) target_compile_features(${target} PUBLIC cxx_std_20) target_include_directories(${target} PUBLIC "${PROJECT_SOURCE_DIR}/include") - target_include_directories(${target} PRIVATE "${PROJECT_SOURCE_DIR}/src") + target_include_directories(${target} PRIVATE + "${PROJECT_SOURCE_DIR}/src/corosio" + "${PROJECT_SOURCE_DIR}/src/corosio/src") target_link_libraries(${target} PUBLIC ${BOOST_COROSIO_DEPENDENCIES} diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 0000000..ca4abfb --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,16 @@ +{ + "version": 8, + "configurePresets": [ + { + "name": "Custom configure preset", + "displayName": "Custom configure preset", + "description": "Sets Ninja generator, build and install directory", + "generator": "Ninja", + "binaryDir": "${sourceDir}/out/build/${presetName}", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}" + } + } + ] +} \ No newline at end of file diff --git a/build/Jamfile b/build/Jamfile index e35d514..63c607f 100644 --- a/build/Jamfile +++ b/build/Jamfile @@ -31,16 +31,11 @@ project boost/corosio : source-location $(COROSIO_ROOT) ; -local COROSIO_SRC = - [ glob $(COROSIO_ROOT)/src/*.cpp ] - [ glob $(COROSIO_ROOT)/src/detail/*.cpp ] - ; - -alias corosio_sources : $(COROSIO_SRC) ; - # System libraries lib ws2_32 ; +alias corosio_sources : [ glob-tree-ex $(COROSIO_ROOT)/src/corosio/src : *.cpp ] ; + lib boost_corosio : corosio_sources : requirements @@ -50,7 +45,8 @@ lib boost_corosio windows:ws2_32 windows:_WIN32_WINNT=0x0602 $(COROSIO_ROOT)/include - $(COROSIO_ROOT)/src + $(COROSIO_ROOT)/src/corosio + $(COROSIO_ROOT)/src/corosio/src : usage-requirements /boost/capy//boost_capy /boost/url//boost_url diff --git a/doc/modules/ROOT/pages/io/acceptor.adoc b/doc/modules/ROOT/pages/io/acceptor.adoc index ecfed31..0a12ca6 100644 --- a/doc/modules/ROOT/pages/io/acceptor.adoc +++ b/doc/modules/ROOT/pages/io/acceptor.adoc @@ -115,7 +115,7 @@ capy::task accept_loop(corosio::io_context& ioc) if (ec) { - if (ec == boost::system::errc::operation_canceled) + if (ec == capy::cond::canceled) break; // Acceptor was closed std::cerr << "Accept error: " << ec.message() << "\n"; continue; diff --git a/doc/modules/ROOT/pages/io/sockets.adoc b/doc/modules/ROOT/pages/io/sockets.adoc index 57b8537..ad6805e 100644 --- a/doc/modules/ROOT/pages/io/sockets.adoc +++ b/doc/modules/ROOT/pages/io/sockets.adoc @@ -94,7 +94,7 @@ auto [ec, n] = co_await s.read_some( if (ec) { - if (ec == capy::error::eof) + if (ec == capy::cond::eof) std::cout << "Peer closed connection\n"; else std::cerr << "Read error: " << ec.message() << "\n"; @@ -213,11 +213,11 @@ auto [ec, n] = co_await s.read_some(buf); if (ec) { - if (ec == capy::error::eof) + if (ec == capy::cond::eof) { // Normal disconnect (end of stream) } - else if (ec == boost::system::errc::operation_canceled) + else if (ec == capy::cond::canceled) { // We called cancel() } diff --git a/include/boost/corosio/acceptor.hpp b/include/boost/corosio/acceptor.hpp index aec9e65..01cd10b 100644 --- a/include/boost/corosio/acceptor.hpp +++ b/include/boost/corosio/acceptor.hpp @@ -235,7 +235,8 @@ class BOOST_COROSIO_DECL acceptor : public io_object @return An awaitable that completes with `io_result<>`. Returns success on successful accept, or an error code on failure including: - - operation_canceled: Cancelled via stop_token or cancel() + - operation_canceled: Cancelled via stop_token or cancel(). + Check `ec == cond::canceled` for portable comparison. @par Preconditions The acceptor must be listening (`is_open() == true`). @@ -259,6 +260,7 @@ class BOOST_COROSIO_DECL acceptor : public io_object /** Cancel any pending asynchronous operations. All outstanding operations complete with `errc::operation_canceled`. + Check `ec == cond::canceled` for portable comparison. */ void cancel(); diff --git a/include/boost/corosio/io_stream.hpp b/include/boost/corosio/io_stream.hpp index 6293828..45ee5ca 100644 --- a/include/boost/corosio/io_stream.hpp +++ b/include/boost/corosio/io_stream.hpp @@ -43,8 +43,10 @@ class BOOST_COROSIO_DECL io_stream : public io_object @return An awaitable that completes with a pair of `{error_code, bytes_transferred}`. Returns success with the number of bytes read, or an error code on failure including: - - capy::error::eof: End of stream reached - - operation_canceled: Cancelled via stop_token or cancel() + - capy::error::eof: End of stream reached. + Check `ec == cond::eof` for portable comparison. + - operation_canceled: Cancelled via stop_token or cancel(). + Check `ec == cond::canceled` for portable comparison. @par Preconditions The socket must be open and connected. @@ -75,7 +77,8 @@ class BOOST_COROSIO_DECL io_stream : public io_object `{error_code, bytes_transferred}`. Returns success with the number of bytes written, or an error code on failure including: - broken_pipe: Connection closed by peer - - operation_canceled: Cancelled via stop_token or cancel() + - operation_canceled: Cancelled via stop_token or cancel(). + Check `ec == cond::canceled` for portable comparison. @par Preconditions The socket must be open and connected. diff --git a/include/boost/corosio/resolver.hpp b/include/boost/corosio/resolver.hpp index 2b67e18..06166bd 100644 --- a/include/boost/corosio/resolver.hpp +++ b/include/boost/corosio/resolver.hpp @@ -310,6 +310,7 @@ class BOOST_COROSIO_DECL resolver : public io_object /** Cancel any pending asynchronous operations. All outstanding operations complete with `errc::operation_canceled`. + Check `ec == cond::canceled` for portable comparison. */ void cancel(); diff --git a/include/boost/corosio/socket.hpp b/include/boost/corosio/socket.hpp index 7600c62..6a4df19 100644 --- a/include/boost/corosio/socket.hpp +++ b/include/boost/corosio/socket.hpp @@ -241,7 +241,8 @@ class BOOST_COROSIO_DECL socket : public io_stream - connection_refused: No server listening at endpoint - timed_out: Connection attempt timed out - network_unreachable: No route to host - - operation_canceled: Cancelled via stop_token or cancel() + - operation_canceled: Cancelled via stop_token or cancel(). + Check `ec == cond::canceled` for portable comparison. @par Preconditions The socket must be open (`is_open() == true`). @@ -265,6 +266,7 @@ class BOOST_COROSIO_DECL socket : public io_stream /** Cancel any pending asynchronous operations. All outstanding operations complete with `errc::operation_canceled`. + Check `ec == cond::canceled` for portable comparison. */ void cancel(); diff --git a/src/acceptor.cpp b/src/corosio/src/acceptor.cpp similarity index 100% rename from src/acceptor.cpp rename to src/corosio/src/acceptor.cpp diff --git a/src/detail/endpoint_convert.hpp b/src/corosio/src/detail/endpoint_convert.hpp similarity index 100% rename from src/detail/endpoint_convert.hpp rename to src/corosio/src/detail/endpoint_convert.hpp diff --git a/src/detail/except.cpp b/src/corosio/src/detail/except.cpp similarity index 100% rename from src/detail/except.cpp rename to src/corosio/src/detail/except.cpp diff --git a/src/detail/posix_op.hpp b/src/corosio/src/detail/posix_op.hpp similarity index 100% rename from src/detail/posix_op.hpp rename to src/corosio/src/detail/posix_op.hpp diff --git a/src/detail/posix_resolver_service.hpp b/src/corosio/src/detail/posix_resolver_service.hpp similarity index 100% rename from src/detail/posix_resolver_service.hpp rename to src/corosio/src/detail/posix_resolver_service.hpp diff --git a/src/detail/posix_scheduler.cpp b/src/corosio/src/detail/posix_scheduler.cpp similarity index 100% rename from src/detail/posix_scheduler.cpp rename to src/corosio/src/detail/posix_scheduler.cpp diff --git a/src/detail/posix_scheduler.hpp b/src/corosio/src/detail/posix_scheduler.hpp similarity index 100% rename from src/detail/posix_scheduler.hpp rename to src/corosio/src/detail/posix_scheduler.hpp diff --git a/src/detail/posix_sockets.hpp b/src/corosio/src/detail/posix_sockets.hpp similarity index 100% rename from src/detail/posix_sockets.hpp rename to src/corosio/src/detail/posix_sockets.hpp diff --git a/src/detail/win_iocp_resolver_service.cpp b/src/corosio/src/detail/win_iocp_resolver_service.cpp similarity index 100% rename from src/detail/win_iocp_resolver_service.cpp rename to src/corosio/src/detail/win_iocp_resolver_service.cpp diff --git a/src/detail/win_iocp_resolver_service.hpp b/src/corosio/src/detail/win_iocp_resolver_service.hpp similarity index 100% rename from src/detail/win_iocp_resolver_service.hpp rename to src/corosio/src/detail/win_iocp_resolver_service.hpp diff --git a/src/detail/win_iocp_scheduler.cpp b/src/corosio/src/detail/win_iocp_scheduler.cpp similarity index 100% rename from src/detail/win_iocp_scheduler.cpp rename to src/corosio/src/detail/win_iocp_scheduler.cpp diff --git a/src/detail/win_iocp_scheduler.hpp b/src/corosio/src/detail/win_iocp_scheduler.hpp similarity index 100% rename from src/detail/win_iocp_scheduler.hpp rename to src/corosio/src/detail/win_iocp_scheduler.hpp diff --git a/src/detail/win_iocp_sockets.cpp b/src/corosio/src/detail/win_iocp_sockets.cpp similarity index 100% rename from src/detail/win_iocp_sockets.cpp rename to src/corosio/src/detail/win_iocp_sockets.cpp diff --git a/src/detail/win_iocp_sockets.hpp b/src/corosio/src/detail/win_iocp_sockets.hpp similarity index 100% rename from src/detail/win_iocp_sockets.hpp rename to src/corosio/src/detail/win_iocp_sockets.hpp diff --git a/src/detail/win_mutex.hpp b/src/corosio/src/detail/win_mutex.hpp similarity index 100% rename from src/detail/win_mutex.hpp rename to src/corosio/src/detail/win_mutex.hpp diff --git a/src/detail/win_overlapped_op.hpp b/src/corosio/src/detail/win_overlapped_op.hpp similarity index 100% rename from src/detail/win_overlapped_op.hpp rename to src/corosio/src/detail/win_overlapped_op.hpp diff --git a/src/detail/win_wsa_init.cpp b/src/corosio/src/detail/win_wsa_init.cpp similarity index 100% rename from src/detail/win_wsa_init.cpp rename to src/corosio/src/detail/win_wsa_init.cpp diff --git a/src/detail/win_wsa_init.hpp b/src/corosio/src/detail/win_wsa_init.hpp similarity index 100% rename from src/detail/win_wsa_init.hpp rename to src/corosio/src/detail/win_wsa_init.hpp diff --git a/src/detail/windows.hpp b/src/corosio/src/detail/windows.hpp similarity index 100% rename from src/detail/windows.hpp rename to src/corosio/src/detail/windows.hpp diff --git a/src/io_context.cpp b/src/corosio/src/io_context.cpp similarity index 100% rename from src/io_context.cpp rename to src/corosio/src/io_context.cpp diff --git a/src/resolver.cpp b/src/corosio/src/resolver.cpp similarity index 100% rename from src/resolver.cpp rename to src/corosio/src/resolver.cpp diff --git a/src/socket.cpp b/src/corosio/src/socket.cpp similarity index 100% rename from src/socket.cpp rename to src/corosio/src/socket.cpp