Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 1 addition & 10 deletions .github/compilers.json
Original file line number Diff line number Diff line change
Expand Up @@ -130,21 +130,12 @@
"version": "*",
"cxxstd": "20,23",
"latest_cxxstd": "23",
"runs_on": "macos-14",
"runs_on": "macos-15",
"cxx": "clang++",
"cc": "clang",
"b2_toolset": "clang",
"is_earliest": true
},
{
"version": "*",
"cxxstd": "20,23",
"latest_cxxstd": "23",
"runs_on": "macos-15",
"cxx": "clang++",
"cc": "clang",
"b2_toolset": "clang"
},
{
"version": "*",
"cxxstd": "20,23",
Expand Down
2 changes: 1 addition & 1 deletion include/boost/corosio/io/io_signal_set.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ class BOOST_COROSIO_DECL io_signal_set : public io_object
capy::io_result<int> await_resume() const noexcept
{
if (token_.stop_requested())
return {capy::error::canceled};
return {capy::error::canceled, 0};
return {ec_, signal_number_};
}

Expand Down
2 changes: 1 addition & 1 deletion include/boost/corosio/native/native_signal_set.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ class native_signal_set : public signal_set
capy::io_result<int> await_resume() const noexcept
{
if (token_.stop_requested())
return {capy::error::canceled};
return {capy::error::canceled, 0};
return {ec_, signal_number_};
}

Expand Down
6 changes: 4 additions & 2 deletions src/openssl/src/openssl_stream.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -374,9 +374,10 @@ struct openssl_stream::impl
break;

{
auto [lec, guard] = co_await io_cm_.scoped_lock();
auto [lec] = co_await io_cm_.lock();
if (lec)
co_return lec;
capy::async_mutex::lock_guard io_guard(&io_cm_);
auto [ec, n] = co_await capy::write(
s_, capy::const_buffer(out_buf_.data(), got));
if (ec)
Expand All @@ -388,9 +389,10 @@ struct openssl_stream::impl

capy::task<std::error_code> read_input()
{
auto [lec, guard] = co_await io_cm_.scoped_lock();
auto [lec] = co_await io_cm_.lock();
if (lec)
co_return lec;
capy::async_mutex::lock_guard io_guard(&io_cm_);
auto [ec, n] = co_await s_.read_some(
capy::mutable_buffer(in_buf_.data(), in_buf_.size()));
if (ec)
Expand Down
42 changes: 30 additions & 12 deletions src/wolfssl/src/wolfssl_stream.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -494,12 +494,13 @@ struct wolfssl_stream::impl
read_in_buf_.data() + read_in_len_,
read_in_buf_.size() - read_in_len_);

auto [lec, guard] = co_await io_cm_.scoped_lock();
auto [lec] = co_await io_cm_.lock();
if (lec)
{
current_op_ = nullptr;
co_return {lec, total_read};
}
capy::async_mutex::lock_guard io_guard(&io_cm_);
auto [rec, rn] = co_await s_.read_some(rbuf);
if (rec)
{
Expand All @@ -526,12 +527,13 @@ struct wolfssl_stream::impl
// Renegotiation
if (read_out_len_ > 0)
{
auto [lec, guard] = co_await io_cm_.scoped_lock();
auto [lec] = co_await io_cm_.lock();
if (lec)
{
current_op_ = nullptr;
co_return {lec, total_read};
}
capy::async_mutex::lock_guard io_guard(&io_cm_);
auto [wec, wn] = co_await capy::write(
s_,
capy::const_buffer(
Expand Down Expand Up @@ -604,12 +606,13 @@ struct wolfssl_stream::impl
// Flush any pending output
if (write_out_len_ > 0)
{
auto [lec, guard] = co_await io_cm_.scoped_lock();
auto [lec] = co_await io_cm_.lock();
if (lec)
{
current_op_ = nullptr;
co_return {lec, total_written};
}
capy::async_mutex::lock_guard io_guard(&io_cm_);
auto [wec, wn] = co_await capy::write(
s_,
capy::const_buffer(
Expand All @@ -633,12 +636,13 @@ struct wolfssl_stream::impl
{
if (write_out_len_ > 0)
{
auto [lec, guard] = co_await io_cm_.scoped_lock();
auto [lec] = co_await io_cm_.lock();
if (lec)
{
current_op_ = nullptr;
co_return {lec, total_written};
}
capy::async_mutex::lock_guard io_guard(&io_cm_);
auto [wec, wn] = co_await capy::write(
s_,
capy::const_buffer(
Expand All @@ -662,12 +666,13 @@ struct wolfssl_stream::impl
capy::mutable_buffer rbuf(
write_in_buf_.data() + write_in_len_,
write_in_buf_.size() - write_in_len_);
auto [lec, guard] = co_await io_cm_.scoped_lock();
auto [lec] = co_await io_cm_.lock();
if (lec)
{
current_op_ = nullptr;
co_return {lec, total_written};
}
capy::async_mutex::lock_guard io_guard(&io_cm_);
auto [rec, rn] = co_await s_.read_some(rbuf);
if (rec)
{
Expand Down Expand Up @@ -729,12 +734,13 @@ struct wolfssl_stream::impl
// Flush any remaining output
if (read_out_len_ > 0)
{
auto [lec, guard] = co_await io_cm_.scoped_lock();
auto [lec] = co_await io_cm_.lock();
if (lec)
{
ec = lec;
break;
}
capy::async_mutex::lock_guard io_guard(&io_cm_);
auto [wec, wn] = co_await capy::write(
s_,
capy::const_buffer(
Expand All @@ -754,12 +760,13 @@ struct wolfssl_stream::impl
// Must flush (e.g. ClientHello) before reading ServerHello
if (read_out_len_ > 0)
{
auto [lec, guard] = co_await io_cm_.scoped_lock();
auto [lec] = co_await io_cm_.lock();
if (lec)
{
ec = lec;
break;
}
capy::async_mutex::lock_guard io_guard(&io_cm_);
auto [wec, wn] = co_await capy::write(
s_,
capy::const_buffer(
Expand All @@ -780,12 +787,13 @@ struct wolfssl_stream::impl
capy::mutable_buffer rbuf(
read_in_buf_.data() + read_in_len_,
read_in_buf_.size() - read_in_len_);
auto [lec, guard] = co_await io_cm_.scoped_lock();
auto [lec] = co_await io_cm_.lock();
if (lec)
{
ec = lec;
break;
}
capy::async_mutex::lock_guard io_guard(&io_cm_);
auto [rec, rn] = co_await s_.read_some(rbuf);
if (rec)
{
Expand All @@ -798,12 +806,13 @@ struct wolfssl_stream::impl
{
if (read_out_len_ > 0)
{
auto [lec, guard] = co_await io_cm_.scoped_lock();
auto [lec] = co_await io_cm_.lock();
if (lec)
{
ec = lec;
break;
}
capy::async_mutex::lock_guard io_guard(&io_cm_);
auto [wec, wn] = co_await capy::write(
s_,
capy::const_buffer(
Expand Down Expand Up @@ -853,12 +862,13 @@ struct wolfssl_stream::impl
// Bidirectional shutdown complete - flush any remaining output
if (read_out_len_ > 0)
{
auto [lec, guard] = co_await io_cm_.scoped_lock();
auto [lec] = co_await io_cm_.lock();
if (lec)
{
ec = lec;
break;
}
capy::async_mutex::lock_guard io_guard(&io_cm_);
auto [wec, wn] = co_await capy::write(
s_,
capy::const_buffer(
Expand All @@ -874,9 +884,13 @@ struct wolfssl_stream::impl
// First, flush any pending output (sends our close_notify)
if (read_out_len_ > 0)
{
auto [lec, guard] = co_await io_cm_.scoped_lock();
auto [lec] = co_await io_cm_.lock();
if (lec)
{
ec = lec;
break;
}
capy::async_mutex::lock_guard io_guard(&io_cm_);
auto [wec, wn] = co_await capy::write(
s_,
capy::const_buffer(
Expand All @@ -897,9 +911,13 @@ struct wolfssl_stream::impl
capy::mutable_buffer rbuf(
read_in_buf_.data() + read_in_len_,
read_in_buf_.size() - read_in_len_);
auto [lec, guard] = co_await io_cm_.scoped_lock();
auto [lec] = co_await io_cm_.lock();
if (lec)
{
ec = lec;
break;
}
capy::async_mutex::lock_guard io_guard(&io_cm_);
auto [rec, rn] = co_await s_.read_some(rbuf);
if (rec)
break; // EOF or socket error during shutdown read - acceptable
Expand Down
9 changes: 6 additions & 3 deletions test/unit/io_context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -543,16 +543,19 @@ struct io_context_test
}
}

static capy::task<void> set_event_task(capy::async_event& evt)
static capy::task<capy::io_result<>> set_event_task(capy::async_event& evt)
{
evt.set();
co_return;
co_return capy::io_result<>{{}};
}

static capy::task<void> when_all_set_event_main(bool& finished)
{
capy::async_event evt;
co_await capy::when_all(evt.wait(), set_event_task(evt));
auto [ec, a, b] = co_await capy::when_all(evt.wait(), set_event_task(evt));
(void)a;
(void)b;
BOOST_TEST(!ec);
finished = true;
}

Expand Down
Loading