WIP
This commit is contained in:
@@ -87,9 +87,9 @@ void Connection::close() {
|
||||
connections_active.dec();
|
||||
}
|
||||
|
||||
// May be called off the io thread!
|
||||
void Connection::append_message(std::span<std::string_view> data_parts,
|
||||
Arena arena, bool close_after_send) {
|
||||
// Called from I/O thread only
|
||||
void Connection::append_bytes(std::span<std::string_view> data_parts,
|
||||
Arena arena, bool close_after_send) {
|
||||
// Calculate total bytes for this message. Don't need to hold the lock yet.
|
||||
size_t total_bytes = 0;
|
||||
for (const auto &part : data_parts) {
|
||||
@@ -124,6 +124,30 @@ void Connection::append_message(std::span<std::string_view> data_parts,
|
||||
}
|
||||
}
|
||||
|
||||
void Connection::send_response(void *protocol_context,
|
||||
std::string_view response_json, Arena arena) {
|
||||
std::unique_lock lock(mutex_);
|
||||
|
||||
// Store response in queue for protocol handler processing
|
||||
pending_response_queue_.emplace_back(
|
||||
PendingResponse{protocol_context, response_json, std::move(arena)});
|
||||
|
||||
// Mark that we have pending responses and trigger epoll interest
|
||||
if (!has_pending_responses_) {
|
||||
has_pending_responses_ = true;
|
||||
|
||||
auto server = server_.lock();
|
||||
if (fd_ >= 0 && server) {
|
||||
// Add EPOLLOUT interest to trigger on_preprocess_writes
|
||||
struct epoll_event event;
|
||||
event.data.fd = fd_;
|
||||
event.events = EPOLLIN | EPOLLOUT;
|
||||
tsan_release();
|
||||
epoll_ctl(server->epoll_fds_[epoll_index_], EPOLL_CTL_MOD, fd_, &event);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int Connection::readBytes(char *buf, size_t buffer_size) {
|
||||
int r;
|
||||
for (;;) {
|
||||
|
||||
Reference in New Issue
Block a user