Put Arena destructor and move constructors in header
This commit is contained in:
@@ -5,36 +5,6 @@
|
|||||||
#include <limits>
|
#include <limits>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
Arena::~Arena() {
|
|
||||||
while (current_block_) {
|
|
||||||
Block *prev = current_block_->prev;
|
|
||||||
std::free(current_block_);
|
|
||||||
current_block_ = prev;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Arena::Arena(Arena &&other) noexcept
|
|
||||||
: initial_block_size_(other.initial_block_size_),
|
|
||||||
current_block_(other.current_block_) {
|
|
||||||
other.current_block_ = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
Arena &Arena::operator=(Arena &&other) noexcept {
|
|
||||||
if (this != &other) {
|
|
||||||
while (current_block_) {
|
|
||||||
Block *prev = current_block_->prev;
|
|
||||||
std::free(current_block_);
|
|
||||||
current_block_ = prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
initial_block_size_ = other.initial_block_size_;
|
|
||||||
current_block_ = other.current_block_;
|
|
||||||
|
|
||||||
other.current_block_ = nullptr;
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Arena::reset() {
|
void Arena::reset() {
|
||||||
if (!current_block_) {
|
if (!current_block_) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -154,7 +154,13 @@ public:
|
|||||||
* Traverses the intrusive linked list backwards from current_block_,
|
* Traverses the intrusive linked list backwards from current_block_,
|
||||||
* freeing each block. This ensures no memory leaks.
|
* freeing each block. This ensures no memory leaks.
|
||||||
*/
|
*/
|
||||||
~Arena();
|
~Arena() {
|
||||||
|
while (current_block_) {
|
||||||
|
Block *prev = current_block_->prev;
|
||||||
|
std::free(current_block_);
|
||||||
|
current_block_ = prev;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Copy construction is not allowed (would be expensive and error-prone)
|
/// Copy construction is not allowed (would be expensive and error-prone)
|
||||||
Arena(const Arena &) = delete;
|
Arena(const Arena &) = delete;
|
||||||
@@ -173,7 +179,11 @@ public:
|
|||||||
* - used_bytes(), total_bytes() return 0
|
* - used_bytes(), total_bytes() return 0
|
||||||
* - Destructor is safe to call
|
* - Destructor is safe to call
|
||||||
*/
|
*/
|
||||||
Arena(Arena &&other) noexcept;
|
Arena(Arena &&other) noexcept
|
||||||
|
: initial_block_size_(other.initial_block_size_),
|
||||||
|
current_block_(other.current_block_) {
|
||||||
|
other.current_block_ = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Move assignment operator - transfers ownership of all blocks.
|
* @brief Move assignment operator - transfers ownership of all blocks.
|
||||||
@@ -191,7 +201,21 @@ public:
|
|||||||
* - used_bytes(), total_bytes() return 0
|
* - used_bytes(), total_bytes() return 0
|
||||||
* - Destructor is safe to call
|
* - Destructor is safe to call
|
||||||
*/
|
*/
|
||||||
Arena &operator=(Arena &&other) noexcept;
|
Arena &operator=(Arena &&other) noexcept {
|
||||||
|
if (this != &other) {
|
||||||
|
while (current_block_) {
|
||||||
|
Block *prev = current_block_->prev;
|
||||||
|
std::free(current_block_);
|
||||||
|
current_block_ = prev;
|
||||||
|
}
|
||||||
|
|
||||||
|
initial_block_size_ = other.initial_block_size_;
|
||||||
|
current_block_ = other.current_block_;
|
||||||
|
|
||||||
|
other.current_block_ = nullptr;
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Allocate raw memory with the specified size and alignment.
|
* @brief Allocate raw memory with the specified size and alignment.
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ private:
|
|||||||
|
|
||||||
// Lock-free pipeline configuration
|
// Lock-free pipeline configuration
|
||||||
static constexpr int lg_size = 16; // Ring buffer size (2^16 slots)
|
static constexpr int lg_size = 16; // Ring buffer size (2^16 slots)
|
||||||
static constexpr auto wait_strategy = WaitStrategy::WaitIfUpstreamIdle;
|
static constexpr auto wait_strategy = WaitStrategy::WaitIfStageEmpty;
|
||||||
|
|
||||||
// 4-stage pipeline: sequence -> resolve -> persist -> release
|
// 4-stage pipeline: sequence -> resolve -> persist -> release
|
||||||
StaticThreadPipeline<PipelineEntry, wait_strategy, 1, 1, 1, 1> pipeline_;
|
StaticThreadPipeline<PipelineEntry, wait_strategy, 1, 1, 1, 1> pipeline_;
|
||||||
|
|||||||
@@ -210,17 +210,7 @@ void HttpHandler::on_batch_complete(std::span<Connection *const> batch) {
|
|||||||
|
|
||||||
void HttpHandler::on_data_arrived(std::string_view data, Connection &conn) {
|
void HttpHandler::on_data_arrived(std::string_view data, Connection &conn) {
|
||||||
auto *state = static_cast<HttpConnectionState *>(conn.user_data);
|
auto *state = static_cast<HttpConnectionState *>(conn.user_data);
|
||||||
if (!state) {
|
assert(state);
|
||||||
// Create a temporary arena and add error response directly to avoid
|
|
||||||
// sequence issues
|
|
||||||
auto json_response = R"({"error":"Internal server error"})";
|
|
||||||
auto http_response =
|
|
||||||
format_json_response(500, json_response, state->pending.arena, 0, true);
|
|
||||||
state->send_ordered_response(conn, state->get_next_sequence_id(),
|
|
||||||
http_response, std::move(state->pending.arena),
|
|
||||||
true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Enforce the configured max_request_size_bytes limit here.
|
// TODO: Enforce the configured max_request_size_bytes limit here.
|
||||||
// Should track cumulative bytes received for the current HTTP request
|
// Should track cumulative bytes received for the current HTTP request
|
||||||
|
|||||||
@@ -27,3 +27,6 @@ request_id_retention_versions = 100000000
|
|||||||
max_buffer_size_bytes = 10485760 # 10MB
|
max_buffer_size_bytes = 10485760 # 10MB
|
||||||
# Interval for sending keepalive comments to prevent idle timeouts (seconds)
|
# Interval for sending keepalive comments to prevent idle timeouts (seconds)
|
||||||
keepalive_interval_seconds = 30
|
keepalive_interval_seconds = 30
|
||||||
|
|
||||||
|
[benchmark]
|
||||||
|
ok_resolve_iterations = 0
|
||||||
|
|||||||
Reference in New Issue
Block a user