Skip to content

Commit 70480be

Browse files
committed
fix: dependency updates and internal optimizations.
1 parent 5b338de commit 70480be

File tree

9 files changed

+39
-44
lines changed

9 files changed

+39
-44
lines changed

CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
cmake_minimum_required(VERSION 3.28)
22
project(
33
CppNet
4-
VERSION 0.5.0
4+
VERSION 0.6.0
55
LANGUAGES CXX)
66

77
# net requires at least C++20
@@ -23,7 +23,7 @@ CPMAddPackage(
2323

2424
# Add AsyncBerkeley as a dependency.
2525
CPMAddPackage(
26-
URI "gh:kcexn/async-berkeley@0.3.1"
26+
URI "gh:kcexn/async-berkeley@0.3.2"
2727
OPTIONS
2828
"IO_BUILD_TESTING OFF"
2929
"IO_BUILD_EXAMPLES OFF"

include/net/service/context_thread.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,6 @@ struct async_context : detail::immovable {
5555
/** @brief Assigns a function to the underlying interrupt. */
5656
inline auto
5757
operator=(std::function<void()> func) noexcept -> interrupt_type &;
58-
/** @brief Tests to see if the interrupt has been assigned to. */
59-
inline explicit operator bool() const noexcept;
6058

6159
private:
6260
/** @brief The underlying interrupt function. */
@@ -67,13 +65,15 @@ struct async_context : detail::immovable {
6765

6866
/** @brief An enum of all valid async context signals. */
6967
enum signals : std::uint8_t { terminate = 0, user1, END };
68+
/** @brief An enum of valid context states. */
69+
enum context_states : std::uint8_t { PENDING = 0, STARTED, STOPPED };
7070

7171
/** @brief The asynchronous scope. */
7272
async_scope scope;
7373
/** @brief The poll triggers. */
7474
triggers poller;
75-
/** @brief A flag that determines whether the context has stopped. */
76-
std::atomic<bool> stopped;
75+
/** @brief A counter that tracks the context state. */
76+
std::atomic<context_states> state{PENDING};
7777
/** @brief The active signal mask. */
7878
std::atomic<signal_mask> sigmask;
7979
/** @brief The event loop interrupt. */

include/net/service/impl/async_context_impl.hpp

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,15 @@ inline auto async_context::signal(int signum) -> void
3131
{
3232
assert(signum >= 0 && signum < END && "signum must be a valid signal.");
3333
sigmask.fetch_or(1 << signum);
34-
if (interrupt)
35-
interrupt();
34+
interrupt();
3635
}
3736

3837
inline auto async_context::interrupt_type::operator()() const -> void
3938
{
4039
using namespace detail;
4140
auto func = with_lock(std::unique_lock{mtx_}, [&] { return fn_; });
42-
func();
41+
if (func)
42+
func();
4343
}
4444

4545
inline auto async_context::interrupt_type::operator=(
@@ -49,11 +49,5 @@ inline auto async_context::interrupt_type::operator=(
4949
fn_ = std::move(func);
5050
return *this;
5151
}
52-
53-
inline async_context::interrupt_type::operator bool() const noexcept
54-
{
55-
std::lock_guard lock{mtx_};
56-
return static_cast<bool>(fn_);
57-
}
5852
} // namespace net::service
5953
#endif // CPPNET_ASYNC_CONTEXT_IMPL_HPP

include/net/service/impl/context_thread_impl.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ auto context_thread<Service>::stop(socket_type socket) noexcept -> void
6060
interrupt = std::function<void()>{};
6161
if (socket != io::socket::INVALID_SOCKET)
6262
io::socket::close(socket);
63-
stopped = true;
63+
state = STOPPED;
6464
}
6565

6666
template <ServiceLike Service>
@@ -99,6 +99,8 @@ auto context_thread<Service>::start(std::mutex &mtx,
9999
}
100100
return !(sigmask_ & (1 << terminate));
101101
});
102+
103+
state = STARTED;
102104
cvar.notify_all();
103105

104106
service.start(static_cast<async_context &>(*this));

tests/test_async_context.cpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -70,15 +70,15 @@ TEST_F(AsyncContextTest, AsyncServiceTest)
7070
service.start(mtx, cvar);
7171
{
7272
auto lock = std::unique_lock{mtx};
73-
cvar.wait(lock, [&] { return service.interrupt || service.stopped; });
73+
cvar.wait(lock, [&] { return service.state != service.PENDING; });
7474
}
75-
ASSERT_FALSE(service.stopped.load());
75+
ASSERT_EQ(service.state, service.STARTED);
7676
service.signal(service.terminate);
7777
{
7878
auto lock = std::unique_lock{mtx};
79-
cvar.wait(lock, [&] { return service.stopped.load(); });
79+
cvar.wait(lock, [&] { return service.state != service.STARTED; });
8080
}
81-
EXPECT_TRUE(service.stopped);
81+
ASSERT_EQ(service.state, service.STOPPED);
8282
}
8383

8484
TEST_F(AsyncContextTest, StartTwiceTest)
@@ -92,14 +92,15 @@ TEST_F(AsyncContextTest, StartTwiceTest)
9292
EXPECT_THROW(service.start(mtx, cvar), std::invalid_argument);
9393
{
9494
auto lock = std::unique_lock{mtx};
95-
cvar.wait(lock, [&] { return service.interrupt || service.stopped; });
95+
cvar.wait(lock, [&] { return service.state != service.PENDING; });
9696
}
97-
ASSERT_FALSE(service.stopped.load());
97+
ASSERT_EQ(service.state, service.STARTED);
9898
service.signal(service.terminate);
9999
{
100100
auto lock = std::unique_lock{mtx};
101-
cvar.wait(lock, [&] { return service.stopped.load(); });
101+
cvar.wait(lock, [&] { return service.state != service.STARTED; });
102102
}
103+
ASSERT_EQ(service.state, service.STOPPED);
103104
}
104105

105106
TEST_F(AsyncContextTest, TestUser1Signal)
@@ -113,9 +114,9 @@ TEST_F(AsyncContextTest, TestUser1Signal)
113114
service.start(mtx, cvar);
114115
{
115116
auto lock = std::unique_lock{mtx};
116-
cvar.wait(lock, [&] { return static_cast<bool>(service.interrupt); });
117+
cvar.wait(lock, [&] { return service.state != service.PENDING; });
117118
}
118-
ASSERT_TRUE(static_cast<bool>(service.interrupt));
119+
ASSERT_EQ(service.state, service.STARTED);
119120
service.signal(service.user1);
120121
{
121122
auto lock = std::unique_lock{test_mtx};

tests/test_async_tcp_service.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -202,9 +202,9 @@ TEST_F(AsyncTcpServiceV4Test, AsyncServiceTest)
202202
service.start(mtx, cvar, addr);
203203
{
204204
auto lock = std::unique_lock{mtx};
205-
cvar.wait(lock, [&] { return service.interrupt || service.stopped; });
205+
cvar.wait(lock, [&] { return service.state != service.PENDING; });
206206
}
207-
ASSERT_TRUE(static_cast<bool>(service.interrupt));
207+
ASSERT_EQ(service.state, service.STARTED);
208208
{
209209
using namespace io;
210210
auto sock = socket_handle(AF_INET, SOCK_STREAM, IPPROTO_TCP);
@@ -231,8 +231,9 @@ TEST_F(AsyncTcpServiceV4Test, AsyncServiceTest)
231231
service.signal(service.terminate);
232232
{
233233
auto lock = std::unique_lock{mtx};
234-
cvar.wait(lock, [&] { return service.stopped.load(); });
234+
cvar.wait(lock, [&] { return service.state != service.STARTED; });
235235
}
236+
ASSERT_EQ(service.state, service.STOPPED);
236237

237238
ASSERT_NE(flag, stopped.load());
238239
}
@@ -364,9 +365,9 @@ TEST_F(AsyncTcpServiceV6Test, AsyncServiceTest)
364365
service.start(mtx, cvar, addr);
365366
{
366367
auto lock = std::unique_lock{mtx};
367-
cvar.wait(lock, [&] { return service.interrupt || service.stopped; });
368+
cvar.wait(lock, [&] { return service.state != service.PENDING; });
368369
}
369-
ASSERT_TRUE(static_cast<bool>(service.interrupt));
370+
ASSERT_EQ(service.state, service.STARTED);
370371
{
371372
using namespace io;
372373
auto sock = socket_handle(AF_INET6, SOCK_STREAM, 0);
@@ -393,9 +394,9 @@ TEST_F(AsyncTcpServiceV6Test, AsyncServiceTest)
393394
service.signal(service.terminate);
394395
{
395396
auto lock = std::unique_lock{mtx};
396-
cvar.wait(lock, [&] { return service.stopped.load(); });
397+
cvar.wait(lock, [&] { return service.state != service.STARTED; });
397398
}
398-
399+
ASSERT_EQ(service.state, service.STOPPED);
399400
ASSERT_NE(flag, stopped.load());
400401
}
401402
// NOLINTEND

tests/test_async_udp_service.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -205,9 +205,9 @@ TEST_F(AsyncUdpServiceV4Test, AsyncServiceTest)
205205
service.start(mtx, cvar, addr);
206206
{
207207
auto lock = std::unique_lock{mtx};
208-
cvar.wait(lock, [&] { return service.interrupt || service.stopped; });
208+
cvar.wait(lock, [&] { return service.state != service.PENDING; });
209209
}
210-
ASSERT_FALSE(service.stopped.load());
210+
ASSERT_EQ(service.state, service.STARTED);
211211
{
212212
using namespace io;
213213
auto sock = socket_handle(AF_INET, SOCK_DGRAM, 0);
@@ -362,9 +362,9 @@ TEST_F(AsyncUdpServiceV6Test, AsyncServiceTest)
362362
service.start(mtx, cvar, addr);
363363
{
364364
auto lock = std::unique_lock{mtx};
365-
cvar.wait(lock, [&] { return service.interrupt || service.stopped; });
365+
cvar.wait(lock, [&] { return service.state != service.PENDING; });
366366
}
367-
ASSERT_FALSE(service.stopped.load());
367+
ASSERT_EQ(service.state, service.STARTED);
368368
{
369369
using namespace io;
370370
auto sock = socket_handle(AF_INET6, SOCK_DGRAM, 0);

tests/test_mock_setsockopt.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,9 @@ TEST_F(AsyncTcpServiceTest, ServiceNoHang)
126126
service.start(mtx, cvar, addr);
127127
{
128128
auto lock = std::unique_lock{mtx};
129-
cvar.wait(lock, [&] { return service.stopped.load(); });
129+
cvar.wait(lock, [&] { return service.state != service.PENDING; });
130130
}
131+
ASSERT_EQ(service.state, service.STARTED);
131132
}
132133

133134
class AsyncUdpServiceTest : public ::testing::Test {};

tests/test_mock_socketpair.cpp

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
#include <gtest/gtest.h>
2121

2222
#include <condition_variable>
23-
#include <list>
2423
#include <mutex>
2524

2625
using namespace net::service;
@@ -53,18 +52,15 @@ struct test_service {
5352

5453
TEST_F(AsyncServiceTest, StartTest)
5554
{
56-
auto list = std::list<context_thread<test_service>>{};
57-
auto &service = list.emplace_back();
58-
ASSERT_FALSE(static_cast<bool>(service.interrupt));
59-
55+
auto service = context_thread<test_service>();
6056
std::mutex mtx;
6157
std::condition_variable cvar;
6258

6359
service.start(mtx, cvar);
6460
{
6561
auto lock = std::unique_lock{mtx};
66-
cvar.wait(lock, [&] { return service.interrupt || service.stopped; });
62+
cvar.wait(lock, [&] { return service.state != service.PENDING; });
6763
}
68-
EXPECT_TRUE(service.stopped);
64+
ASSERT_EQ(service.state, service.STOPPED);
6965
}
7066
// NOLINTEND

0 commit comments

Comments
 (0)