Skip to content

Commit a000cb0

Browse files
author
MarcoFalke
committed
Merge bitcoin/bitcoin#22361: refactor: Make httpserver work queue a unique_ptr
fa92e60 refactor: Make httpserver work queue a unique_ptr (MarcoFalke) Pull request description: This simplifies the code a bit because `if (p) { delete p; p = nullptr; }` can be replaced by a call to the `reset()` member. ACKs for top commit: promag: Core review ACK fa92e60. jonatack: ACK fa92e60 code review, debug build clean, ran test/functional/interface*.py tests locally as a sanity check hebasto: ACK fa92e60, I have reviewed the code and it looks OK, I agree it can be merged. Tree-SHA512: 6b122162317dd4ad6889341745c7ac1903a3ee510f6548f46dc356308442a6eff13eb8dc604c38ba18783e7a66d2b836d641a8594ff980a010c12c97f3856684
2 parents e0face9 + fa92e60 commit a000cb0

File tree

1 file changed

+12
-14
lines changed

1 file changed

+12
-14
lines changed

src/httpserver.cpp

+12-14
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ static struct evhttp* eventHTTP = nullptr;
136136
//! List of subnets to allow RPC connections from
137137
static std::vector<CSubNet> rpc_allow_subnets;
138138
//! Work queue for handling longer requests off the event loop thread
139-
static WorkQueue<HTTPClosure>* workQueue = nullptr;
139+
static std::unique_ptr<WorkQueue<HTTPClosure>> g_work_queue{nullptr};
140140
//! Handlers for (sub)paths
141141
static std::vector<HTTPPathHandler> pathHandlers;
142142
//! Bound listening sockets
@@ -256,10 +256,10 @@ static void http_request_cb(struct evhttp_request* req, void* arg)
256256
// Dispatch to worker thread
257257
if (i != iend) {
258258
std::unique_ptr<HTTPWorkItem> item(new HTTPWorkItem(std::move(hreq), path, i->handler));
259-
assert(workQueue);
260-
if (workQueue->Enqueue(item.get()))
259+
assert(g_work_queue);
260+
if (g_work_queue->Enqueue(item.get())) {
261261
item.release(); /* if true, queue took ownership */
262-
else {
262+
} else {
263263
LogPrintf("WARNING: request rejected because http work queue depth exceeded, it can be increased with the -rpcworkqueue= setting\n");
264264
item->req->WriteReply(HTTP_SERVICE_UNAVAILABLE, "Work queue depth exceeded");
265265
}
@@ -392,7 +392,7 @@ bool InitHTTPServer()
392392
int workQueueDepth = std::max((long)gArgs.GetArg("-rpcworkqueue", DEFAULT_HTTP_WORKQUEUE), 1L);
393393
LogPrintf("HTTP: creating work queue of depth %d\n", workQueueDepth);
394394

395-
workQueue = new WorkQueue<HTTPClosure>(workQueueDepth);
395+
g_work_queue = std::make_unique<WorkQueue<HTTPClosure>>(workQueueDepth);
396396
// transfer ownership to eventBase/HTTP via .release()
397397
eventBase = base_ctr.release();
398398
eventHTTP = http_ctr.release();
@@ -424,7 +424,7 @@ void StartHTTPServer()
424424
g_thread_http = std::thread(ThreadHTTP, eventBase);
425425

426426
for (int i = 0; i < rpcThreads; i++) {
427-
g_thread_http_workers.emplace_back(HTTPWorkQueueRun, workQueue, i);
427+
g_thread_http_workers.emplace_back(HTTPWorkQueueRun, g_work_queue.get(), i);
428428
}
429429
}
430430

@@ -435,16 +435,17 @@ void InterruptHTTPServer()
435435
// Reject requests on current connections
436436
evhttp_set_gencb(eventHTTP, http_reject_request_cb, nullptr);
437437
}
438-
if (workQueue)
439-
workQueue->Interrupt();
438+
if (g_work_queue) {
439+
g_work_queue->Interrupt();
440+
}
440441
}
441442

442443
void StopHTTPServer()
443444
{
444445
LogPrint(BCLog::HTTP, "Stopping HTTP server\n");
445-
if (workQueue) {
446+
if (g_work_queue) {
446447
LogPrint(BCLog::HTTP, "Waiting for HTTP worker threads to exit\n");
447-
for (auto& thread: g_thread_http_workers) {
448+
for (auto& thread : g_thread_http_workers) {
448449
thread.join();
449450
}
450451
g_thread_http_workers.clear();
@@ -467,10 +468,7 @@ void StopHTTPServer()
467468
event_base_free(eventBase);
468469
eventBase = nullptr;
469470
}
470-
if (workQueue) {
471-
delete workQueue;
472-
workQueue = nullptr;
473-
}
471+
g_work_queue.reset();
474472
LogPrint(BCLog::HTTP, "Stopped HTTP server\n");
475473
}
476474

0 commit comments

Comments
 (0)