Skip to content

Commit 62481a2

Browse files
committed
Add config parameters for reactor locking spin counts.
Added: "reactor" / "registration_locking_spin_count" (int) "reactor" / "io_locking_spin_count" (int) Both values default to 0.
1 parent 13a6d87 commit 62481a2

File tree

7 files changed

+45
-17
lines changed

7 files changed

+45
-17
lines changed

asio/include/asio/detail/conditionally_enabled_mutex.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,12 @@ class conditionally_enabled_mutex
129129
return enabled_;
130130
}
131131

132+
// Get the spin count.
133+
int spin_count() const
134+
{
135+
return spin_count_;
136+
}
137+
132138
// Lock the mutex.
133139
void lock()
134140
{

asio/include/asio/detail/epoll_reactor.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ class epoll_reactor
7171
bool try_speculative_[max_ops];
7272
bool shutdown_;
7373

74-
ASIO_DECL descriptor_state(bool locking);
74+
ASIO_DECL descriptor_state(bool locking, int spin_count);
7575
void set_ready_events(uint32_t events) { task_result_ = events; }
7676
void add_ready_events(uint32_t events) { task_result_ |= events; }
7777
ASIO_DECL operation* perform_io(uint32_t events);
@@ -272,6 +272,9 @@ class epoll_reactor
272272
// Whether I/O locking is enabled.
273273
const bool io_locking_;
274274

275+
// How any times to spin waiting for the I/O mutex.
276+
const int io_locking_spin_count_;
277+
275278
// Mutex to protect access to the registered descriptors.
276279
mutex registered_descriptors_mutex_;
277280

asio/include/asio/detail/impl/epoll_reactor.ipp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,19 @@ namespace detail {
3939
epoll_reactor::epoll_reactor(asio::execution_context& ctx)
4040
: execution_context_service_base<epoll_reactor>(ctx),
4141
scheduler_(use_service<scheduler>(ctx)),
42-
mutex_(config(ctx).get("reactor", "registration_locking", true)),
42+
mutex_(config(ctx).get("reactor", "registration_locking", true),
43+
config(ctx).get("reactor", "registration_locking_spin_count", 0)),
4344
interrupter_(),
4445
epoll_fd_(do_epoll_create()),
4546
timer_fd_(do_timerfd_create()),
4647
shutdown_(false),
4748
io_locking_(config(ctx).get("reactor", "io_locking", true)),
48-
registered_descriptors_mutex_(mutex_.enabled()),
49+
io_locking_spin_count_(
50+
config(ctx).get("reactor", "io_locking_spin_count", 0)),
51+
registered_descriptors_mutex_(mutex_.enabled(), mutex_.spin_count()),
4952
registered_descriptors_(
50-
config(ctx).get("reactor", "preallocated_io_objects", 0U), io_locking_)
53+
config(ctx).get("reactor", "preallocated_io_objects", 0U),
54+
io_locking_, io_locking_spin_count_)
5155
{
5256
// Add the interrupter's descriptor to epoll.
5357
epoll_event ev = { 0, { 0 } };
@@ -670,7 +674,7 @@ int epoll_reactor::do_timerfd_create()
670674
epoll_reactor::descriptor_state* epoll_reactor::allocate_descriptor_state()
671675
{
672676
mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_);
673-
return registered_descriptors_.alloc(io_locking_);
677+
return registered_descriptors_.alloc(io_locking_, io_locking_spin_count_);
674678
}
675679

676680
void epoll_reactor::free_descriptor_state(epoll_reactor::descriptor_state* s)
@@ -762,9 +766,9 @@ struct epoll_reactor::perform_io_cleanup_on_block_exit
762766
operation* first_op_;
763767
};
764768

765-
epoll_reactor::descriptor_state::descriptor_state(bool locking)
769+
epoll_reactor::descriptor_state::descriptor_state(bool locking, int spin_count)
766770
: operation(&epoll_reactor::descriptor_state::do_complete),
767-
mutex_(locking)
771+
mutex_(locking, spin_count)
768772
{
769773
}
770774

asio/include/asio/detail/impl/io_uring_service.ipp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,21 @@ namespace detail {
3535
io_uring_service::io_uring_service(asio::execution_context& ctx)
3636
: execution_context_service_base<io_uring_service>(ctx),
3737
scheduler_(use_service<scheduler>(ctx)),
38-
mutex_(config(ctx).get("reactor", "registration_locking", true)),
38+
mutex_(config(ctx).get("reactor", "registration_locking", true),
39+
config(ctx).get("reactor", "registration_locking_spin_count", 0)),
3940
outstanding_work_(0),
4041
submit_sqes_op_(this),
4142
pending_sqes_(0),
4243
pending_submit_sqes_op_(false),
4344
shutdown_(false),
4445
io_locking_(config(ctx).get("reactor", "io_locking", true)),
46+
io_locking_spin_count_(
47+
config(ctx).get("reactor", "io_locking_spin_count", 0)),
4548
timeout_(),
4649
registration_mutex_(mutex_.enabled()),
4750
registered_io_objects_(
48-
config(ctx).get("reactor", "preallocated_io_objects", 0U), io_locking_),
51+
config(ctx).get("reactor", "preallocated_io_objects", 0U),
52+
io_locking_, io_locking_spin_count_),
4953
reactor_(use_service<reactor>(ctx)),
5054
reactor_data_(),
5155
event_fd_(-1)
@@ -614,7 +618,7 @@ void io_uring_service::register_with_reactor()
614618
io_uring_service::io_object* io_uring_service::allocate_io_object()
615619
{
616620
mutex::scoped_lock registration_lock(registration_mutex_);
617-
return registered_io_objects_.alloc(io_locking_);
621+
return registered_io_objects_.alloc(io_locking_, io_locking_spin_count_);
618622
}
619623

620624
void io_uring_service::free_io_object(io_uring_service::io_object* io_obj)
@@ -899,8 +903,8 @@ void io_uring_service::io_queue::do_complete(void* owner, operation* base,
899903
}
900904
}
901905

902-
io_uring_service::io_object::io_object(bool locking)
903-
: mutex_(locking)
906+
io_uring_service::io_object::io_object(bool locking, int spin_count)
907+
: mutex_(locking, spin_count)
904908
{
905909
}
906910

asio/include/asio/detail/impl/kqueue_reactor.ipp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,18 @@ namespace detail {
4747
kqueue_reactor::kqueue_reactor(asio::execution_context& ctx)
4848
: execution_context_service_base<kqueue_reactor>(ctx),
4949
scheduler_(use_service<scheduler>(ctx)),
50-
mutex_(config(ctx).get("reactor", "registration_locking", true)),
50+
mutex_(config(ctx).get("reactor", "registration_locking", true),
51+
config(ctx).get("reactor", "registration_locking_spin_count", 0)),
5152
kqueue_fd_(do_kqueue_create()),
5253
interrupter_(),
5354
shutdown_(false),
5455
io_locking_(config(ctx).get("reactor", "io_locking", true)),
56+
io_locking_spin_count_(
57+
config(ctx).get("reactor", "io_locking_spin_count", 0)),
5558
registered_descriptors_mutex_(mutex_.enabled()),
5659
registered_descriptors_(
57-
config(ctx).get("reactor", "preallocated_io_objects", 0U), io_locking_)
60+
config(ctx).get("reactor", "preallocated_io_objects", 0U),
61+
io_locking_, io_locking_spin_count_)
5862
{
5963
struct kevent events[1];
6064
ASIO_KQUEUE_EV_SET(&events[0], interrupter_.read_descriptor(),
@@ -565,7 +569,7 @@ int kqueue_reactor::do_kqueue_create()
565569
kqueue_reactor::descriptor_state* kqueue_reactor::allocate_descriptor_state()
566570
{
567571
mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_);
568-
return registered_descriptors_.alloc(io_locking_);
572+
return registered_descriptors_.alloc(io_locking_, io_locking_spin_count_);
569573
}
570574

571575
void kqueue_reactor::free_descriptor_state(kqueue_reactor::descriptor_state* s)

asio/include/asio/detail/io_uring_service.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ class io_uring_service
8282
io_queue queues_[max_ops];
8383
bool shutdown_;
8484

85-
ASIO_DECL io_object(bool locking);
85+
ASIO_DECL io_object(bool locking, int spin_count);
8686
};
8787

8888
// Per I/O object data.
@@ -280,6 +280,9 @@ class io_uring_service
280280
// Whether I/O locking is enabled.
281281
const bool io_locking_;
282282

283+
// How any times to spin waiting for the I/O mutex.
284+
const int io_locking_spin_count_;
285+
283286
// The timer queues.
284287
timer_queue_set timer_queues_;
285288

asio/include/asio/detail/kqueue_reactor.hpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ class kqueue_reactor
6565
// Per-descriptor queues.
6666
struct descriptor_state
6767
{
68-
descriptor_state(bool locking) : mutex_(locking) {}
68+
descriptor_state(bool locking, int spin_count)
69+
: mutex_(locking, spin_count) {}
6970

7071
friend class kqueue_reactor;
7172
friend class object_pool_access;
@@ -252,6 +253,9 @@ class kqueue_reactor
252253
// Whether I/O locking is enabled.
253254
const bool io_locking_;
254255

256+
// How any times to spin waiting for the I/O mutex.
257+
const int io_locking_spin_count_;
258+
255259
// Mutex to protect access to the registered descriptors.
256260
mutex registered_descriptors_mutex_;
257261

0 commit comments

Comments
 (0)