From 070fc34cee07db023824c76995bba43f2262d6c1 Mon Sep 17 00:00:00 2001 From: HÃ¥vard Pettersen Date: Wed, 15 Feb 2023 13:10:31 +0000 Subject: use std::thread directly also add very simple ThreadPool class to run multiple threads at once make an effort to only join once --- vbench/src/apps/vbench/vbench.cpp | 3 ++- vbench/src/tests/dispatcher/dispatcher_test.cpp | 4 ++-- vbench/src/vbench/core/handler_thread.h | 2 +- vbench/src/vbench/core/handler_thread.hpp | 6 ++++-- vbench/src/vbench/vbench/request_scheduler.cpp | 2 +- vbench/src/vbench/vbench/request_scheduler.h | 2 +- vbench/src/vbench/vbench/vbench.cpp | 2 +- vbench/src/vbench/vbench/vbench.h | 2 +- vbench/src/vbench/vbench/worker.cpp | 2 +- vbench/src/vbench/vbench/worker.h | 2 +- 10 files changed, 15 insertions(+), 12 deletions(-) (limited to 'vbench') diff --git a/vbench/src/apps/vbench/vbench.cpp b/vbench/src/apps/vbench/vbench.cpp index b5c2897207f..c73f38adaf2 100644 --- a/vbench/src/apps/vbench/vbench.cpp +++ b/vbench/src/apps/vbench/vbench.cpp @@ -44,12 +44,13 @@ int run(const std::string &cfg_name) { VBench vbench(cfg); NotifyDone notify(done); vespalib::RunnablePair runBoth(vbench, notify); - auto thread = vespalib::Thread::start(runBoth, vbench_thread); + auto thread = vespalib::thread::start(runBoth, vbench_thread); while (!SIG::INT.check() && !SIG::TERM.check() && !done.await(1s)) {} if (!done.await(vespalib::duration::zero())) { vbench.abort(); done.await(); } + thread.join(); if (vbench.tainted()) { fprintf(stderr, "vbench failed: %s\n", vbench.tainted().reason().c_str()); diff --git a/vbench/src/tests/dispatcher/dispatcher_test.cpp b/vbench/src/tests/dispatcher/dispatcher_test.cpp index 6a3fb8d0c7c..49a41508c7b 100644 --- a/vbench/src/tests/dispatcher/dispatcher_test.cpp +++ b/vbench/src/tests/dispatcher/dispatcher_test.cpp @@ -30,9 +30,9 @@ TEST("dispatcher") { Dispatcher dispatcher(dropped); Fetcher fetcher1(dispatcher, handler1); Fetcher fetcher2(dispatcher, handler2); - auto thread1 = vespalib::Thread::start(fetcher1, fetcher1_thread); + auto thread1 = vespalib::thread::start(fetcher1, fetcher1_thread); EXPECT_TRUE(dispatcher.waitForThreads(1, 512)); - auto thread2 = vespalib::Thread::start(fetcher2, fetcher2_thread); + auto thread2 = vespalib::thread::start(fetcher2, fetcher2_thread); EXPECT_TRUE(dispatcher.waitForThreads(2, 512)); EXPECT_EQUAL(-1, dropped.value); EXPECT_EQUAL(-1, handler1.value); diff --git a/vbench/src/vbench/core/handler_thread.h b/vbench/src/vbench/core/handler_thread.h index 8ece1389dfc..81a0a720720 100644 --- a/vbench/src/vbench/core/handler_thread.h +++ b/vbench/src/vbench/core/handler_thread.h @@ -26,7 +26,7 @@ private: std::condition_variable _cond; vespalib::ArrayQueue > _queue; Handler &_next; - vespalib::Thread _thread; + std::thread _thread; bool _done; void run() override; diff --git a/vbench/src/vbench/core/handler_thread.hpp b/vbench/src/vbench/core/handler_thread.hpp index 1a99861ea81..3373e196ab7 100644 --- a/vbench/src/vbench/core/handler_thread.hpp +++ b/vbench/src/vbench/core/handler_thread.hpp @@ -31,13 +31,15 @@ HandlerThread::HandlerThread(Handler &next, init_fun_t init_fun) _thread(), _done(false) { - _thread = vespalib::Thread::start(*this, init_fun); + _thread = vespalib::thread::start(*this, init_fun); } template HandlerThread::~HandlerThread() { - join(); + if (!_done) { + join(); + } assert(_queue.empty()); } diff --git a/vbench/src/vbench/vbench/request_scheduler.cpp b/vbench/src/vbench/vbench/request_scheduler.cpp index cde31ec07b8..136f2bed98b 100644 --- a/vbench/src/vbench/vbench/request_scheduler.cpp +++ b/vbench/src/vbench/vbench/request_scheduler.cpp @@ -71,7 +71,7 @@ void RequestScheduler::start() { _timer.reset(); - _thread = vespalib::Thread::start(*this, vbench_request_scheduler_thread); + _thread = vespalib::thread::start(*this, vbench_request_scheduler_thread); } RequestScheduler & diff --git a/vbench/src/vbench/vbench/request_scheduler.h b/vbench/src/vbench/vbench/request_scheduler.h index b1d525eb691..1483a86a458 100644 --- a/vbench/src/vbench/vbench/request_scheduler.h +++ b/vbench/src/vbench/vbench/request_scheduler.h @@ -26,7 +26,7 @@ private: TimeQueue _queue; DroppedTagger _droppedTagger; Dispatcher _dispatcher; - vespalib::Thread _thread; + std::thread _thread; HttpConnectionPool _connectionPool; std::vector _workers; std::mutex _lock; diff --git a/vbench/src/vbench/vbench/vbench.cpp b/vbench/src/vbench/vbench/vbench.cpp index 8a8bceccefb..58d0f9e0345 100644 --- a/vbench/src/vbench/vbench/vbench.cpp +++ b/vbench/src/vbench/vbench/vbench.cpp @@ -100,7 +100,7 @@ VBench::run() { _scheduler->start(); for (size_t i = 0; i < _inputs.size(); ++i) { - _inputs[i]->thread = vespalib::Thread::start(*_inputs[i]->generator, vbench_inputchain_generator); + _inputs[i]->thread = vespalib::thread::start(*_inputs[i]->generator, vbench_inputchain_generator); } for (size_t i = 0; i < _inputs.size(); ++i) { _inputs[i]->thread.join(); diff --git a/vbench/src/vbench/vbench/vbench.h b/vbench/src/vbench/vbench/vbench.h index 2b7fcf0cd88..f355beddce5 100644 --- a/vbench/src/vbench/vbench/vbench.h +++ b/vbench/src/vbench/vbench/vbench.h @@ -26,7 +26,7 @@ private: using UP = std::unique_ptr; std::vector taggers; Generator::UP generator; - vespalib::Thread thread; + std::thread thread; }; NativeFactory _factory; std::vector _analyzers; diff --git a/vbench/src/vbench/vbench/worker.cpp b/vbench/src/vbench/vbench/worker.cpp index eabd17ae73f..d9ba039eb53 100644 --- a/vbench/src/vbench/vbench/worker.cpp +++ b/vbench/src/vbench/vbench/worker.cpp @@ -30,7 +30,7 @@ Worker::Worker(Provider &provider, Handler &next, _pool(pool), _timer(timer) { - _thread = vespalib::Thread::start(*this, vbench_worker_thread); + _thread = vespalib::thread::start(*this, vbench_worker_thread); } } // namespace vbench diff --git a/vbench/src/vbench/vbench/worker.h b/vbench/src/vbench/vbench/worker.h index d2bcfae637b..9cd7b04fdfe 100644 --- a/vbench/src/vbench/vbench/worker.h +++ b/vbench/src/vbench/vbench/worker.h @@ -20,7 +20,7 @@ namespace vbench { class Worker : public vespalib::Runnable { private: - vespalib::Thread _thread; + std::thread _thread; Provider &_provider; Handler &_next; HttpConnectionPool &_pool; -- cgit v1.2.3