diff --git a/base-hw/src/core/kernel.cc b/base-hw/src/core/kernel.cc index 3391405e8..550545e69 100644 --- a/base-hw/src/core/kernel.cc +++ b/base-hw/src/core/kernel.cc @@ -57,6 +57,15 @@ namespace Kernel */ static void idle_main() { while (1) ; } + Pd_ids * pd_ids() { return unsynchronized_singleton(); } + Thread_ids * thread_ids() { return unsynchronized_singleton(); } + Signal_context_ids * signal_context_ids() { return unsynchronized_singleton(); } + Signal_receiver_ids * signal_receiver_ids() { return unsynchronized_singleton(); } + + Pd_pool * pd_pool() { return unsynchronized_singleton(); } + Thread_pool * thread_pool() { return unsynchronized_singleton(); } + Signal_context_pool * signal_context_pool() { return unsynchronized_singleton(); } + Signal_receiver_pool * signal_receiver_pool() { return unsynchronized_singleton(); } /** * Access to static kernel timer @@ -91,7 +100,14 @@ namespace Kernel namespace Kernel { - class Vm : public Object, + class Vm; + typedef Id_allocator Vm_ids; + typedef Object_pool Vm_pool; + + Vm_ids * vm_ids(); + Vm_pool * vm_pool(); + + class Vm : public Object, public Execution_context { private: @@ -139,6 +155,8 @@ namespace Kernel void proceed() { mtc()->continue_vm(_state); } }; + Vm_ids * vm_ids() { return unsynchronized_singleton(); } + Vm_pool * vm_pool() { return unsynchronized_singleton(); } /** * Access to static CPU scheduler diff --git a/base-hw/src/core/kernel/object.h b/base-hw/src/core/kernel/object.h index 3c8f82eb8..2b2b018c6 100644 --- a/base-hw/src/core/kernel/object.h +++ b/base-hw/src/core/kernel/object.h @@ -47,8 +47,16 @@ namespace Kernel /** * Make all objects of a deriving class findable through unique IDs + * + * \param T object type + * \param MAX_INSTANCES max amount of coincidently living objects + * \param ID_ALLOC accessor function of object-name allocator + * \param POOL accessor function of object pool */ - template + template * (*ID_ALLOC)(), + Kernel::Object_pool * (* POOL)()> + class Object; } @@ -190,21 +198,12 @@ class Kernel::Id_allocator } }; -template +template * (* ID_ALLOC)(), + Kernel::Object_pool * (* POOL)()> + class Kernel::Object : public Object_pool::Item { - private : - - class Id_allocator : public Kernel::Id_allocator { }; - - /** - * Unique-ID allocator for objects of T - */ - static Id_allocator * _id_allocator() - { - return unsynchronized_singleton(); - } - public: typedef Object_pool Pool; @@ -212,16 +211,16 @@ class Kernel::Object : public Object_pool::Item /** * Map of unique IDs to objects of T */ - static Pool * pool() { return unsynchronized_singleton(); } + static Pool * pool() { return POOL(); } protected: /** * Constructor */ - Object() : Pool::Item(_id_allocator()->alloc()) + Object() : Pool::Item(ID_ALLOC()->alloc()) { - pool()->insert(static_cast(this)); + POOL()->insert(static_cast(this)); } /** @@ -229,8 +228,8 @@ class Kernel::Object : public Object_pool::Item */ ~Object() { - pool()->remove(static_cast(this)); - _id_allocator()->free(Pool::Item::id()); + POOL()->remove(static_cast(this)); + ID_ALLOC()->free(Pool::Item::id()); } }; diff --git a/base-hw/src/core/kernel/pd.h b/base-hw/src/core/kernel/pd.h index 662d8d35f..9f0e2bd3c 100644 --- a/base-hw/src/core/kernel/pd.h +++ b/base-hw/src/core/kernel/pd.h @@ -53,6 +53,12 @@ namespace Kernel * Kernel backend of protection domains */ class Pd; + + typedef Id_allocator Pd_ids; + typedef Object_pool Pd_pool; + + Pd_ids * pd_ids(); + Pd_pool * pd_pool(); } class Kernel::Mode_transition_control @@ -138,7 +144,7 @@ class Kernel::Mode_transition_control } }; -class Kernel::Pd : public Object +class Kernel::Pd : public Object { private: diff --git a/base-hw/src/core/kernel/signal_receiver.h b/base-hw/src/core/kernel/signal_receiver.h index d42c00b85..72d9e51dd 100644 --- a/base-hw/src/core/kernel/signal_receiver.h +++ b/base-hw/src/core/kernel/signal_receiver.h @@ -48,6 +48,16 @@ namespace Kernel * Combines signal contexts to an entity that handlers can listen to */ class Signal_receiver; + + typedef Id_allocator Signal_context_ids; + typedef Object_pool Signal_context_pool; + typedef Id_allocator Signal_receiver_ids; + typedef Object_pool Signal_receiver_pool; + + Signal_context_ids * signal_context_ids(); + Signal_context_pool * signal_context_pool(); + Signal_receiver_ids * signal_receiver_ids(); + Signal_receiver_pool * signal_receiver_pool(); } class Kernel::Signal_handler @@ -183,7 +193,8 @@ class Kernel::Signal_receiver_killer class Kernel::Signal_context : - public Object + public Object { friend class Signal_receiver; friend class Signal_context_killer; @@ -301,7 +312,8 @@ class Kernel::Signal_context class Kernel::Signal_receiver : - public Object, + public Object, public Signal_context_killer { friend class Signal_context; diff --git a/base-hw/src/core/kernel/thread.h b/base-hw/src/core/kernel/thread.h index 45800c320..a296f6048 100644 --- a/base-hw/src/core/kernel/thread.h +++ b/base-hw/src/core/kernel/thread.h @@ -1,5 +1,5 @@ /* - * \brief Kernel backend for userland execution-contexts + * \brief Kernel backend for execution contexts in userland * \author Martin Stein * \date 2012-11-30 */ @@ -57,6 +57,12 @@ namespace Kernel * Kernel backend for userland execution-contexts */ class Thread; + + typedef Id_allocator Thread_ids; + typedef Object_pool Thread_pool; + + Thread_ids * thread_ids(); + Thread_pool * thread_pool(); } class Kernel::Execution_context : public Cpu_scheduler::Item @@ -85,7 +91,7 @@ class Kernel::Execution_context : public Cpu_scheduler::Item class Kernel::Thread : public Cpu::User_context, - public Object, + public Object, public Execution_context, public Ipc_node, public Irq_receiver, @@ -335,7 +341,7 @@ class Kernel::Thread /* join a protection domain */ Pd * const pd = Pd::pool()->object(_pd_id); - assert(pd) + assert(pd); addr_t const tlb = pd->tlb()->base(); /* initialize CPU context */