From 5440cd4b50ef29b0d0b1e0817c024e21b400e304 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Fri, 24 Jan 2020 14:22:05 +0100 Subject: [PATCH] base: use blockade in thread Issue #3612 --- repos/base-fiasco/src/core/thread_start.cc | 2 +- repos/base-foc/src/lib/base/thread_bootstrap.cc | 2 +- repos/base-hw/src/lib/base/thread_bootstrap.cc | 2 +- repos/base-linux/src/core/thread_linux.cc | 2 +- repos/base-linux/src/lib/base/thread_linux.cc | 2 +- repos/base-linux/src/lib/lx_hybrid/lx_hybrid.cc | 2 +- repos/base-nova/src/lib/base/thread_start.cc | 2 +- repos/base-okl4/src/core/thread_start.cc | 2 +- repos/base-pistachio/src/core/thread_start.cc | 2 +- repos/base/include/base/thread.h | 6 +++--- repos/base/src/lib/base/thread.cc | 5 ++--- repos/base/src/lib/base/thread_start.cc | 2 +- 12 files changed, 15 insertions(+), 16 deletions(-) diff --git a/repos/base-fiasco/src/core/thread_start.cc b/repos/base-fiasco/src/core/thread_start.cc index 53eebe162d..13ee042645 100644 --- a/repos/base-fiasco/src/core/thread_start.cc +++ b/repos/base-fiasco/src/core/thread_start.cc @@ -29,7 +29,7 @@ void Thread::_thread_start() { Thread::myself()->_thread_bootstrap(); Thread::myself()->entry(); - Thread::myself()->_join_lock.unlock(); + Thread::myself()->_join.wakeup(); sleep_forever(); } diff --git a/repos/base-foc/src/lib/base/thread_bootstrap.cc b/repos/base-foc/src/lib/base/thread_bootstrap.cc index 19b94367c0..7035467efe 100644 --- a/repos/base-foc/src/lib/base/thread_bootstrap.cc +++ b/repos/base-foc/src/lib/base/thread_bootstrap.cc @@ -59,6 +59,6 @@ void Genode::Thread::_thread_start() Thread::myself()->_thread_bootstrap(); Thread::myself()->entry(); - Thread::myself()->_join_lock.unlock(); + Thread::myself()->_join.wakeup(); sleep_forever(); } diff --git a/repos/base-hw/src/lib/base/thread_bootstrap.cc b/repos/base-hw/src/lib/base/thread_bootstrap.cc index 506ae2231d..48e0754f4a 100644 --- a/repos/base-hw/src/lib/base/thread_bootstrap.cc +++ b/repos/base-hw/src/lib/base/thread_bootstrap.cc @@ -75,7 +75,7 @@ void Thread::_thread_start() { Thread::myself()->_thread_bootstrap(); Thread::myself()->entry(); - Thread::myself()->_join_lock.unlock(); + Thread::myself()->_join.wakeup(); Genode::sleep_forever(); } diff --git a/repos/base-linux/src/core/thread_linux.cc b/repos/base-linux/src/core/thread_linux.cc index b272a0ac0a..0b36d43b21 100644 --- a/repos/base-linux/src/core/thread_linux.cc +++ b/repos/base-linux/src/core/thread_linux.cc @@ -53,7 +53,7 @@ void Thread::_thread_start() lx_sigsetmask(LX_SIGCHLD, false); Thread::myself()->entry(); - Thread::myself()->_join_lock.unlock(); + Thread::myself()->_join.wakeup(); sleep_forever(); } diff --git a/repos/base-linux/src/lib/base/thread_linux.cc b/repos/base-linux/src/lib/base/thread_linux.cc index 0d3e9a41d1..8c682bc8a1 100644 --- a/repos/base-linux/src/lib/base/thread_linux.cc +++ b/repos/base-linux/src/lib/base/thread_linux.cc @@ -80,7 +80,7 @@ void Thread::_thread_start() thread->entry(); /* unblock caller of 'join()' */ - thread->_join_lock.unlock(); + thread->_join.wakeup(); sleep_forever(); } diff --git a/repos/base-linux/src/lib/lx_hybrid/lx_hybrid.cc b/repos/base-linux/src/lib/lx_hybrid/lx_hybrid.cc index 085f437663..6cfe12fad3 100644 --- a/repos/base-linux/src/lib/lx_hybrid/lx_hybrid.cc +++ b/repos/base-linux/src/lib/lx_hybrid/lx_hybrid.cc @@ -496,7 +496,7 @@ Native_thread &Thread::native_thread() { return *_native_thread; } Thread::Thread(size_t weight, const char *name, size_t /* stack size */, Type, Cpu_session * cpu_sess, Affinity::Location) -: _cpu_session(cpu_sess), _affinity(), _join_lock() +: _cpu_session(cpu_sess), _affinity() { Native_thread::Meta_data *meta_data = new (global_alloc()) Thread_meta_data_created(this); diff --git a/repos/base-nova/src/lib/base/thread_start.cc b/repos/base-nova/src/lib/base/thread_start.cc index fa42b0b6bd..eb41a4179e 100644 --- a/repos/base-nova/src/lib/base/thread_start.cc +++ b/repos/base-nova/src/lib/base/thread_start.cc @@ -59,7 +59,7 @@ void Thread::_thread_start() throw; } - Thread::myself()->_join_lock.unlock(); + Thread::myself()->_join.wakeup(); /* sleep silently */ Genode::sleep_forever(); diff --git a/repos/base-okl4/src/core/thread_start.cc b/repos/base-okl4/src/core/thread_start.cc index 6567188e08..dd2ebbc65a 100644 --- a/repos/base-okl4/src/core/thread_start.cc +++ b/repos/base-okl4/src/core/thread_start.cc @@ -29,7 +29,7 @@ void Thread::_thread_start() { Thread::myself()->_thread_bootstrap(); Thread::myself()->entry(); - Thread::myself()->_join_lock.unlock(); + Thread::myself()->_join.wakeup(); sleep_forever(); } diff --git a/repos/base-pistachio/src/core/thread_start.cc b/repos/base-pistachio/src/core/thread_start.cc index 53eebe162d..13ee042645 100644 --- a/repos/base-pistachio/src/core/thread_start.cc +++ b/repos/base-pistachio/src/core/thread_start.cc @@ -29,7 +29,7 @@ void Thread::_thread_start() { Thread::myself()->_thread_bootstrap(); Thread::myself()->entry(); - Thread::myself()->_join_lock.unlock(); + Thread::myself()->_join.wakeup(); sleep_forever(); } diff --git a/repos/base/include/base/thread.h b/repos/base/include/base/thread.h index a4b408d9a7..c8cda8f2b2 100644 --- a/repos/base/include/base/thread.h +++ b/repos/base/include/base/thread.h @@ -16,7 +16,7 @@ /* Genode includes */ #include -#include +#include #include #include #include @@ -129,9 +129,9 @@ class Genode::Thread Native_thread *_native_thread = nullptr; /** - * Lock used for synchronizing the finalization of the thread + * Blockade used for synchronizing the finalization of the thread */ - Lock _join_lock; + Blockade _join { }; /** * Thread type diff --git a/repos/base/src/lib/base/thread.cc b/repos/base/src/lib/base/thread.cc index 769ce2421d..f089d478f9 100644 --- a/repos/base/src/lib/base/thread.cc +++ b/repos/base/src/lib/base/thread.cc @@ -140,7 +140,7 @@ void Thread::name(char *dst, size_t dst_len) Thread::Name Thread::name() const { return _stack->name(); } -void Thread::join() { _join_lock.lock(); } +void Thread::join() { _join.block(); } void *Thread::alloc_secondary_stack(char const *name, size_t stack_size) @@ -204,8 +204,7 @@ Thread::Thread(size_t weight, const char *name, size_t stack_size, _affinity(affinity), _trace_control(nullptr), _stack(type == REINITIALIZED_MAIN ? - _stack : _alloc_stack(stack_size, name, type == MAIN)), - _join_lock(Lock::LOCKED) + _stack : _alloc_stack(stack_size, name, type == MAIN)) { _init_platform_thread(weight, type); } diff --git a/repos/base/src/lib/base/thread_start.cc b/repos/base/src/lib/base/thread_start.cc index 7d60fae59a..63ccd88375 100644 --- a/repos/base/src/lib/base/thread_start.cc +++ b/repos/base/src/lib/base/thread_start.cc @@ -46,7 +46,7 @@ void Thread::_thread_start() throw; } - Thread::myself()->_join_lock.unlock(); + Thread::myself()->_join.wakeup(); /* sleep silently */ Genode::sleep_forever();