aboutsummaryrefslogtreecommitdiffstats
path: root/vespalib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-12-09 20:42:19 +0100
committerGitHub <noreply@github.com>2021-12-09 20:42:19 +0100
commitb3bc50ae94764118518c0fea9fbdff7995b7fd63 (patch)
treefa34fb9b8c151dcbfd89a03b1cc476b0821ac6d9 /vespalib
parent1794d0117667a4345876a613778afc068fffd49e (diff)
parent06a8585e58111223b6e1c19e8c24066714c51b89 (diff)
Merge pull request #20438 from vespa-engine/balder/add-init_fun-to-vespalib_Thread-too
Add init_fun to vespalib::Thread too to figure out what the thread is…
Diffstat (limited to 'vespalib')
-rw-r--r--vespalib/src/tests/thread/thread_test.cpp8
-rw-r--r--vespalib/src/vespa/vespalib/util/simple_thread_bundle.cpp19
-rw-r--r--vespalib/src/vespa/vespalib/util/simple_thread_bundle.h10
-rw-r--r--vespalib/src/vespa/vespalib/util/thread.cpp12
-rw-r--r--vespalib/src/vespa/vespalib/util/thread.h6
5 files changed, 35 insertions, 20 deletions
diff --git a/vespalib/src/tests/thread/thread_test.cpp b/vespalib/src/tests/thread/thread_test.cpp
index 43951b4b734..ee4f97c34cc 100644
--- a/vespalib/src/tests/thread/thread_test.cpp
+++ b/vespalib/src/tests/thread/thread_test.cpp
@@ -6,6 +6,8 @@
using namespace vespalib;
+VESPA_THREAD_STACK_TAG(test_agent_thread);
+
struct Agent : public Runnable {
bool started;
int loopCnt;
@@ -22,7 +24,7 @@ struct Agent : public Runnable {
TEST("thread never started") {
Agent agent;
{
- Thread thread(agent);
+ Thread thread(agent, test_agent_thread);
}
EXPECT_TRUE(!agent.started);
EXPECT_EQUAL(0, agent.loopCnt);
@@ -31,7 +33,7 @@ TEST("thread never started") {
TEST("normal operation") {
Agent agent;
{
- Thread thread(agent);
+ Thread thread(agent, test_agent_thread);
thread.start();
std::this_thread::sleep_for(20ms);
thread.stop().join();
@@ -43,7 +45,7 @@ TEST("normal operation") {
TEST("stop before start") {
Agent agent;
{
- Thread thread(agent);
+ Thread thread(agent, test_agent_thread);
thread.stop();
thread.start();
thread.join();
diff --git a/vespalib/src/vespa/vespalib/util/simple_thread_bundle.cpp b/vespalib/src/vespa/vespalib/util/simple_thread_bundle.cpp
index 80bbb3a7ad2..ab83d4e05fd 100644
--- a/vespalib/src/vespa/vespalib/util/simple_thread_bundle.cpp
+++ b/vespalib/src/vespa/vespalib/util/simple_thread_bundle.cpp
@@ -8,6 +8,8 @@ using namespace vespalib::fixed_thread_bundle;
namespace vespalib {
+VESPA_THREAD_STACK_TAG(simple_thread_bundle_executor);
+
namespace {
struct SignalHook : Runnable {
@@ -43,7 +45,7 @@ Runnable::UP wrap(Runnable *runnable) {
}
Runnable::UP chain(Runnable::UP first, Runnable::UP second) {
- return Runnable::UP(new HookPair(std::move(first), std::move(second)));
+ return std::make_unique<HookPair>(std::move(first), std::move(second));
}
} // namespace vespalib::<unnamed>
@@ -173,4 +175,19 @@ SimpleThreadBundle::run(const std::vector<Runnable*> &targets)
latch.await();
}
+SimpleThreadBundle::Worker::Worker(Signal &s, Runnable::UP h)
+ : thread(*this, simple_thread_bundle_executor),
+ signal(s),
+ hook(std::move(h))
+{
+ thread.start();
+}
+void
+SimpleThreadBundle::Worker::run() {
+ for (size_t gen = 0; signal.wait(gen) > 0; ) {
+ hook->run();
+}
+
+}
+
} // namespace vespalib
diff --git a/vespalib/src/vespa/vespalib/util/simple_thread_bundle.h b/vespalib/src/vespa/vespalib/util/simple_thread_bundle.h
index f0aaccc2525..d9a29ee7bef 100644
--- a/vespalib/src/vespa/vespalib/util/simple_thread_bundle.h
+++ b/vespalib/src/vespa/vespalib/util/simple_thread_bundle.h
@@ -112,14 +112,8 @@ private:
Thread thread;
Signal &signal;
Runnable::UP hook;
- Worker(Signal &s, Runnable::UP h) : thread(*this), signal(s), hook(std::move(h)) {
- thread.start();
- }
- void run() override {
- for (size_t gen = 0; signal.wait(gen) > 0; ) {
- hook->run();
- }
- }
+ Worker(Signal &s, Runnable::UP h);
+ void run() override;
};
Work _work;
diff --git a/vespalib/src/vespa/vespalib/util/thread.cpp b/vespalib/src/vespa/vespalib/util/thread.cpp
index c02a7a3b063..c3230bf313d 100644
--- a/vespalib/src/vespa/vespalib/util/thread.cpp
+++ b/vespalib/src/vespa/vespalib/util/thread.cpp
@@ -9,9 +9,9 @@ namespace vespalib {
__thread Thread *Thread::_currentThread = nullptr;
-Thread::Proxy::Proxy(Thread &parent, Runnable &target)
- : thread(parent), runnable(target),
- start(), started(), cancel(false)
+Thread::Proxy::Proxy(Thread &parent, Runnable &target, init_fun_t init_fun_in)
+ : thread(parent), runnable(target), init_fun(std::move(init_fun_in)),
+ start(), started(), cancel(false)
{ }
void
@@ -22,7 +22,7 @@ Thread::Proxy::Run(FastOS_ThreadInterface *, void *)
start.await();
if (!cancel) {
started.countDown();
- runnable.run();
+ init_fun(runnable);
}
assert(_currentThread == &thread);
_currentThread = nullptr;
@@ -30,8 +30,8 @@ Thread::Proxy::Run(FastOS_ThreadInterface *, void *)
Thread::Proxy::~Proxy() = default;
-Thread::Thread(Runnable &runnable)
- : _proxy(*this, runnable),
+Thread::Thread(Runnable &runnable, init_fun_t init_fun_in)
+ : _proxy(*this, runnable, std::move(init_fun_in)),
_pool(STACK_SIZE, 1),
_lock(),
_cond(),
diff --git a/vespalib/src/vespa/vespalib/util/thread.h b/vespalib/src/vespa/vespalib/util/thread.h
index 8873f23ee98..e08f3ca1100 100644
--- a/vespalib/src/vespa/vespalib/util/thread.h
+++ b/vespalib/src/vespa/vespalib/util/thread.h
@@ -15,17 +15,19 @@ namespace vespalib {
class Thread : public Active
{
private:
+ using init_fun_t = Runnable::init_fun_t;
enum { STACK_SIZE = 256*1024 };
static __thread Thread *_currentThread;
struct Proxy : FastOS_Runnable {
Thread &thread;
Runnable &runnable;
+ init_fun_t init_fun;
vespalib::Gate start;
vespalib::Gate started;
bool cancel;
- Proxy(Thread &parent, Runnable &target);
+ Proxy(Thread &parent, Runnable &target, init_fun_t init_fun_in);
~Proxy() override;
void Run(FastOS_ThreadInterface *thisThread, void *arguments) override;
@@ -39,7 +41,7 @@ private:
bool _woken;
public:
- Thread(Runnable &runnable);
+ Thread(Runnable &runnable, init_fun_t init_fun_in);
~Thread() override;
void start() override;
Thread &stop() override;