From 523791b361d76ade81f7fe9b3d0cbc31ebbc1f1d Mon Sep 17 00:00:00 2001 From: Martin Stein Date: Fri, 31 Jan 2014 14:12:28 +0100 Subject: [PATCH] base: generic implementation of Context_allocator ref #989 --- base-codezero/lib/mk/base-common.mk | 2 +- base-fiasco/lib/mk/base-common.mk | 1 + base-foc/lib/mk/base-common.inc | 1 + base-foc/src/base/thread/thread.cc | 79 -------------------- base-hw/lib/mk/base-common.mk | 1 + base-linux/lib/mk/base-common.mk | 2 +- base-nova/lib/mk/base-common.inc | 2 +- base-okl4/lib/mk/base-common.mk | 1 + base-pistachio/lib/mk/base-common.mk | 1 + base/src/base/thread/context_allocator.cc | 88 +++++++++++++++++++++++ base/src/base/thread/thread.cc | 78 -------------------- 11 files changed, 96 insertions(+), 160 deletions(-) create mode 100644 base/src/base/thread/context_allocator.cc diff --git a/base-codezero/lib/mk/base-common.mk b/base-codezero/lib/mk/base-common.mk index b63958767..3fc1a41b9 100644 --- a/base-codezero/lib/mk/base-common.mk +++ b/base-codezero/lib/mk/base-common.mk @@ -21,7 +21,7 @@ SRC_CC += lock/lock.cc SRC_CC += signal/signal.cc signal/common.cc SRC_CC += server/server.cc server/common.cc SRC_CC += thread/thread.cc thread/thread_bootstrap.cc thread/trace.cc -SRC_CC += env/utcb.cc +SRC_CC += thread/context_allocator.cc env/utcb.cc SRC_CC += lock/cmpxchg.cc INC_DIR += $(REP_DIR)/src/base/lock diff --git a/base-fiasco/lib/mk/base-common.mk b/base-fiasco/lib/mk/base-common.mk index c410304b3..eaaa37078 100644 --- a/base-fiasco/lib/mk/base-common.mk +++ b/base-fiasco/lib/mk/base-common.mk @@ -21,6 +21,7 @@ SRC_CC += lock/lock.cc SRC_CC += signal/signal.cc signal/common.cc SRC_CC += server/server.cc server/common.cc SRC_CC += thread/thread.cc thread/thread_bootstrap.cc thread/trace.cc +SRC_CC += thread/context_allocator.cc INC_DIR += $(REP_DIR)/src/base/lock INC_DIR += $(BASE_DIR)/src/base/thread diff --git a/base-foc/lib/mk/base-common.inc b/base-foc/lib/mk/base-common.inc index fedf554e9..3b124c936 100644 --- a/base-foc/lib/mk/base-common.inc +++ b/base-foc/lib/mk/base-common.inc @@ -21,6 +21,7 @@ SRC_CC += env/spin_lock.cc env/cap_map.cc SRC_CC += signal/signal.cc signal/common.cc SRC_CC += server/server.cc server/common.cc SRC_CC += thread/thread.cc thread/thread_bootstrap.cc thread/trace.cc +SRC_CC += thread/context_allocator.cc INC_DIR += $(REP_DIR)/src/base/lock INC_DIR += $(BASE_DIR)/src/base/lock diff --git a/base-foc/src/base/thread/thread.cc b/base-foc/src/base/thread/thread.cc index a6f78a4ab..fd06c7155 100644 --- a/base-foc/src/base/thread/thread.cc +++ b/base-foc/src/base/thread/thread.cc @@ -31,85 +31,6 @@ namespace Genode { } -/****************************** - ** Thread-context allocator ** - ******************************/ - -Thread_base::Context *Thread_base::Context_allocator::base_to_context(addr_t base) -{ - addr_t result = base + Native_config::context_virtual_size() - - sizeof(Context); - return reinterpret_cast(result); -} - - -addr_t Thread_base::Context_allocator::addr_to_base(void *addr) -{ - return ((addr_t)addr) & ~(Native_config::context_virtual_size() - 1); -} - - -size_t Thread_base::Context_allocator::base_to_idx(addr_t base) -{ - /* the first context isn't managed through the indices */ - return ((base - Native_config::context_area_virtual_base()) / - Native_config::context_virtual_size()) - 1; -} - - -addr_t Thread_base::Context_allocator::idx_to_base(size_t idx) -{ - /* the first context isn't managed through the indices */ - return Native_config::context_area_virtual_base() + - Native_config::context_virtual_size() + - idx * Native_config::context_virtual_size(); -} - - -Thread_base::Context * -Thread_base::Context_allocator::alloc(Thread_base *thread_base, bool main_thread) -{ - Lock::Guard _lock_guard(_threads_lock); - try { - addr_t base; - if (main_thread) { - /* the main-thread context isn't managed by '_alloc' */ - base = Native_config::context_area_virtual_base(); - } else { - /* contexts besides main-thread context are managed by '_alloc' */ - base = idx_to_base(_alloc.alloc()); - } - return base_to_context(base); - } catch(Bit_allocator::Out_of_indices) { - return 0; - } -} - - -void Thread_base::Context_allocator::free(Context *context) -{ - Lock::Guard _lock_guard(_threads_lock); - addr_t const base = addr_to_base(context); - - /* the main-thread context isn't managed by '_alloc' */ - if (base == Native_config::context_area_virtual_base()) { return; } - - /* contexts besides main-thread context are managed by '_alloc' */ - _alloc.free(base_to_idx(base)); -} - - -/***************** - ** Thread base ** - *****************/ - -Thread_base::Context_allocator *Thread_base::_context_allocator() -{ - static Context_allocator context_allocator_inst; - return &context_allocator_inst; -} - - Thread_base::Context * Thread_base::_alloc_context(size_t stack_size, bool main_thread) { diff --git a/base-hw/lib/mk/base-common.mk b/base-hw/lib/mk/base-common.mk index add6e4176..ac4a2233d 100644 --- a/base-hw/lib/mk/base-common.mk +++ b/base-hw/lib/mk/base-common.mk @@ -19,6 +19,7 @@ SRC_CC += lock/lock.cc SRC_CC += signal/signal.cc signal/common.cc SRC_CC += server/server.cc server/common.cc SRC_CC += thread/thread_bootstrap.cc thread/trace.cc +SRC_CC += thread/context_allocator.cc INC_DIR += $(REP_DIR)/src/base/lock INC_DIR += $(BASE_DIR)/src/base/lock diff --git a/base-linux/lib/mk/base-common.mk b/base-linux/lib/mk/base-common.mk index 9ae7d5509..5077a5d61 100644 --- a/base-linux/lib/mk/base-common.mk +++ b/base-linux/lib/mk/base-common.mk @@ -19,7 +19,7 @@ SRC_CC += lock/lock.cc SRC_CC += env/rm_session_mmap.cc env/debug.cc SRC_CC += signal/signal.cc signal/common.cc SRC_CC += server/server.cc server/common.cc -SRC_CC += thread/trace.cc thread/thread_env.cc +SRC_CC += thread/trace.cc thread/thread_env.cc thread/context_allocator.cc INC_DIR += $(REP_DIR)/src/base/lock $(BASE_DIR)/src/base/lock INC_DIR += $(REP_DIR)/src/base/ipc diff --git a/base-nova/lib/mk/base-common.inc b/base-nova/lib/mk/base-common.inc index 66d3581f6..9834b3d47 100644 --- a/base-nova/lib/mk/base-common.inc +++ b/base-nova/lib/mk/base-common.inc @@ -19,7 +19,7 @@ SRC_CC += lock/lock.cc SRC_CC += signal/signal.cc signal/common.cc SRC_CC += server/server.cc SRC_CC += thread/thread.cc thread/thread_context.cc thread/trace.cc -SRC_CC += env/cap_map.cc +SRC_CC += thread/context_allocator.cc env/cap_map.cc INC_DIR += $(REP_DIR)/src/base/lock INC_DIR += $(BASE_DIR)/src/base/lock diff --git a/base-okl4/lib/mk/base-common.mk b/base-okl4/lib/mk/base-common.mk index c410304b3..eaaa37078 100644 --- a/base-okl4/lib/mk/base-common.mk +++ b/base-okl4/lib/mk/base-common.mk @@ -21,6 +21,7 @@ SRC_CC += lock/lock.cc SRC_CC += signal/signal.cc signal/common.cc SRC_CC += server/server.cc server/common.cc SRC_CC += thread/thread.cc thread/thread_bootstrap.cc thread/trace.cc +SRC_CC += thread/context_allocator.cc INC_DIR += $(REP_DIR)/src/base/lock INC_DIR += $(BASE_DIR)/src/base/thread diff --git a/base-pistachio/lib/mk/base-common.mk b/base-pistachio/lib/mk/base-common.mk index 320e7540b..31e529137 100644 --- a/base-pistachio/lib/mk/base-common.mk +++ b/base-pistachio/lib/mk/base-common.mk @@ -21,6 +21,7 @@ SRC_CC += lock/lock.cc SRC_CC += signal/signal.cc signal/common.cc SRC_CC += server/server.cc server/common.cc SRC_CC += thread/thread.cc thread/trace.cc thread/thread_bootstrap.cc +SRC_CC += thread/context_allocator.cc INC_DIR += $(REP_DIR)/src/base/lock INC_DIR += $(BASE_DIR)/src/base/thread diff --git a/base/src/base/thread/context_allocator.cc b/base/src/base/thread/context_allocator.cc new file mode 100644 index 000000000..d83f45543 --- /dev/null +++ b/base/src/base/thread/context_allocator.cc @@ -0,0 +1,88 @@ +/* + * \brief Context-allocator implementation for the Genode Thread API + * \author Norman Feske + * \author Martin Stein + * \date 2014-01-26 + */ + +/* + * Copyright (C) 2010-2014 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU General Public License version 2. + */ + +/* Genode includes */ +#include + +using namespace Genode; + + +Thread_base::Context *Thread_base::Context_allocator::base_to_context(addr_t base) +{ + addr_t result = base + Native_config::context_virtual_size() + - sizeof(Context); + return reinterpret_cast(result); +} + + +addr_t Thread_base::Context_allocator::addr_to_base(void *addr) +{ + return ((addr_t)addr) & ~(Native_config::context_virtual_size() - 1); +} + + +size_t Thread_base::Context_allocator::base_to_idx(addr_t base) +{ + /* the first context isn't managed through the indices */ + return ((base - Native_config::context_area_virtual_base()) / + Native_config::context_virtual_size()) - 1; +} + + +addr_t Thread_base::Context_allocator::idx_to_base(size_t idx) +{ + /* the first context isn't managed through the indices */ + return Native_config::context_area_virtual_base() + + (idx + 1) * Native_config::context_virtual_size(); +} + + +Thread_base::Context * +Thread_base::Context_allocator::alloc(Thread_base *thread_base, bool main_thread) +{ + Lock::Guard _lock_guard(_threads_lock); + try { + addr_t base; + if (main_thread) { + /* the main-thread context isn't managed by '_alloc' */ + base = Native_config::context_area_virtual_base(); + } else { + /* contexts besides main-thread context are managed by '_alloc' */ + base = idx_to_base(_alloc.alloc()); + } + return base_to_context(base); + } catch(Bit_allocator::Out_of_indices) { + return 0; + } +} + + +void Thread_base::Context_allocator::free(Context *context) +{ + Lock::Guard _lock_guard(_threads_lock); + addr_t const base = addr_to_base(context); + + /* the main-thread context isn't managed by '_alloc' */ + if (base == Native_config::context_area_virtual_base()) { return; } + + /* contexts besides main-thread context are managed by '_alloc' */ + _alloc.free(base_to_idx(base)); +} + + +Thread_base::Context_allocator *Thread_base::_context_allocator() +{ + static Context_allocator context_allocator_inst; + return &context_allocator_inst; +} diff --git a/base/src/base/thread/thread.cc b/base/src/base/thread/thread.cc index 43ccda3c0..ff1938ea7 100644 --- a/base/src/base/thread/thread.cc +++ b/base/src/base/thread/thread.cc @@ -31,84 +31,6 @@ namespace Genode { } -/****************************** - ** Thread-context allocator ** - ******************************/ - -Thread_base::Context *Thread_base::Context_allocator::base_to_context(addr_t base) -{ - addr_t result = base + Native_config::context_virtual_size() - - sizeof(Context); - return reinterpret_cast(result); -} - - -addr_t Thread_base::Context_allocator::addr_to_base(void *addr) -{ - return ((addr_t)addr) & ~(Native_config::context_virtual_size() - 1); -} - - -size_t Thread_base::Context_allocator::base_to_idx(addr_t base) -{ - /* the first context isn't managed through the indices */ - return ((base - Native_config::context_area_virtual_base()) / - Native_config::context_virtual_size()) - 1; -} - - -addr_t Thread_base::Context_allocator::idx_to_base(size_t idx) -{ - /* the first context isn't managed through the indices */ - return Native_config::context_area_virtual_base() + - (idx + 1) * Native_config::context_virtual_size(); -} - - -Thread_base::Context * -Thread_base::Context_allocator::alloc(Thread_base *thread_base, bool main_thread) -{ - Lock::Guard _lock_guard(_threads_lock); - try { - addr_t base; - if (main_thread) { - /* the main-thread context isn't managed by '_alloc' */ - base = Native_config::context_area_virtual_base(); - } else { - /* contexts besides main-thread context are managed by '_alloc' */ - base = idx_to_base(_alloc.alloc()); - } - return base_to_context(base); - } catch(Bit_allocator::Out_of_indices) { - return 0; - } -} - - -void Thread_base::Context_allocator::free(Context *context) -{ - Lock::Guard _lock_guard(_threads_lock); - addr_t const base = addr_to_base(context); - - /* the main-thread context isn't managed by '_alloc' */ - if (base == Native_config::context_area_virtual_base()) { return; } - - /* contexts besides main-thread context are managed by '_alloc' */ - _alloc.free(base_to_idx(base)); -} - - -/***************** - ** Thread base ** - *****************/ - -Thread_base::Context_allocator *Thread_base::_context_allocator() -{ - static Context_allocator context_allocator_inst; - return &context_allocator_inst; -} - - Thread_base::Context * Thread_base::_alloc_context(size_t stack_size, bool main_thread) {