Merge bitcoin/bitcoin#19033: http: Release work queue after event base finish

4e353cb618 http: Release work queue after event base finish (João Barbosa)

Pull request description:

  This fixes a race between `http_request_cb` and `StopHTTPServer` where
  the work queue is used after release.

  Fixes #18856.

ACKs for top commit:
  fjahr:
    Code review ACK 4e353cb618
  achow101:
    ACK 4e353cb618
  LarryRuane:
    ACK 4e353cb618
  hebasto:
    ACK 4e353cb618, tested (rebased on top of master 9313c4e6aa) on Linux Mint 20.1 (x86_64) using MarcoFalke's [patch](https://github.com/bitcoin/bitcoin/pull/19033#issuecomment-640106647), including different `-rpcthreads`/`-rpcworkqueue` cases. The bug is fixed. The code is correct.

Tree-SHA512: 185d2a9744d0d5134d782bf321ac9958ba17b11a5b3d70b4897c8243e6b146dfd3f23c57aef8e10ae9484374120b64389c1949a9cf0a21dccc47ffc934c20930
pull/826/head
W. J. van der Laan 3 years ago
commit 6a67366fdc
No known key found for this signature in database
GPG Key ID: 1E4AED62986CD25D

@ -83,7 +83,7 @@ public:
bool Enqueue(WorkItem* item)
{
LOCK(cs);
if (queue.size() >= maxDepth) {
if (!running || queue.size() >= maxDepth) {
return false;
}
queue.emplace_back(std::unique_ptr<WorkItem>(item));
@ -99,7 +99,7 @@ public:
WAIT_LOCK(cs, lock);
while (running && queue.empty())
cond.wait(lock);
if (!running)
if (!running && queue.empty())
break;
i = std::move(queue.front());
queue.pop_front();
@ -448,8 +448,6 @@ void StopHTTPServer()
thread.join();
}
g_thread_http_workers.clear();
delete workQueue;
workQueue = nullptr;
}
// Unlisten sockets, these are what make the event loop running, which means
// that after this and all connections are closed the event loop will quit.
@ -469,6 +467,10 @@ void StopHTTPServer()
event_base_free(eventBase);
eventBase = nullptr;
}
if (workQueue) {
delete workQueue;
workQueue = nullptr;
}
LogPrint(BCLog::HTTP, "Stopped HTTP server\n");
}

Loading…
Cancel
Save