mirror of
https://github.com/matrix-construct/construct
synced 2024-12-26 15:33:54 +01:00
ircd::fs::aio: Add custom allocator at descriptor site for the sigfd operation.
This commit is contained in:
parent
3225c1fdfe
commit
334484c4bc
2 changed files with 33 additions and 6 deletions
|
@ -781,12 +781,7 @@ try
|
||||||
std::bind(&system::handle, this, ph::_1, ph::_2)
|
std::bind(&system::handle, this, ph::_1, ph::_2)
|
||||||
};
|
};
|
||||||
|
|
||||||
static ios::descriptor descriptor
|
resfd.async_read_some(bufs, ios::handle(handle_descriptor, std::move(handler)));
|
||||||
{
|
|
||||||
"ircd::fs::aio sigfd"
|
|
||||||
};
|
|
||||||
|
|
||||||
resfd.async_read_some(bufs, ios::handle(descriptor, std::move(handler)));
|
|
||||||
}
|
}
|
||||||
catch(...)
|
catch(...)
|
||||||
{
|
{
|
||||||
|
@ -794,6 +789,34 @@ catch(...)
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
decltype(ircd::fs::aio::system::handle_descriptor)
|
||||||
|
ircd::fs::aio::system::handle_descriptor
|
||||||
|
{
|
||||||
|
"ircd::fs::aio sigfd",
|
||||||
|
|
||||||
|
// allocator; custom allocation strategy because this handler
|
||||||
|
// appears to excessively allocate and deallocate 120 bytes; this
|
||||||
|
// is a simple asynchronous operation, we can do better (and perhaps
|
||||||
|
// even better than this below).
|
||||||
|
[](auto &handler, const size_t &size)
|
||||||
|
{
|
||||||
|
assert(ircd::fs::aio::system);
|
||||||
|
auto &system(*ircd::fs::aio::system);
|
||||||
|
|
||||||
|
if(unlikely(!system.handle_data))
|
||||||
|
{
|
||||||
|
system.handle_size = size;
|
||||||
|
system.handle_data = std::make_unique<uint8_t[]>(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(system.handle_size == size);
|
||||||
|
return system.handle_data.get();
|
||||||
|
},
|
||||||
|
|
||||||
|
// no deallocation; satisfied by class member unique_ptr
|
||||||
|
[](auto &handler, void *const &ptr, const auto &size) {}
|
||||||
|
};
|
||||||
|
|
||||||
/// Handle notifications that requests are complete.
|
/// Handle notifications that requests are complete.
|
||||||
void
|
void
|
||||||
ircd::fs::aio::system::handle(const boost::system::error_code &ec,
|
ircd::fs::aio::system::handle(const boost::system::error_code &ec,
|
||||||
|
|
|
@ -44,6 +44,10 @@ struct ircd::fs::aio::system
|
||||||
size_t in_flight {0};
|
size_t in_flight {0};
|
||||||
bool handle_set {false};
|
bool handle_set {false};
|
||||||
|
|
||||||
|
size_t handle_size {0};
|
||||||
|
std::unique_ptr<uint8_t[]> handle_data;
|
||||||
|
static ios::descriptor handle_descriptor;
|
||||||
|
|
||||||
/// An eventfd which will be notified by the system; we integrate this with
|
/// An eventfd which will be notified by the system; we integrate this with
|
||||||
/// the ircd io_service core epoll() event loop. The EFD_SEMAPHORE flag is
|
/// the ircd io_service core epoll() event loop. The EFD_SEMAPHORE flag is
|
||||||
/// not used to reduce the number of triggers. The semaphore value is the
|
/// not used to reduce the number of triggers. The semaphore value is the
|
||||||
|
|
Loading…
Reference in a new issue