diff --git a/repos/base-hw/src/core/include/kernel/object.h b/repos/base-hw/src/core/include/kernel/object.h index 0a4f60688..e043f13ec 100644 --- a/repos/base-hw/src/core/include/kernel/object.h +++ b/repos/base-hw/src/core/include/kernel/object.h @@ -54,6 +54,9 @@ namespace Kernel using Object_identity_reference_list = Genode::List; + using Object_identity_list + = Genode::List; + /** * This class represents kernel object's identities including the * corresponding object identity reference for core @@ -68,14 +71,15 @@ namespace Kernel } -struct Kernel::Object +struct Kernel::Object : public Kernel::Object_identity_list { - virtual ~Object() { } + virtual ~Object(); }; class Kernel::Object_identity -: public Kernel::Object_identity_reference_list +: public Object_identity_list::Element, + public Kernel::Object_identity_reference_list { private: @@ -88,6 +92,8 @@ class Kernel::Object_identity template KOBJECT * object() { return dynamic_cast(&_object); } + + void invalidate(); }; @@ -165,8 +171,6 @@ class Kernel::Core_object_identity : public Object_identity, : Object_identity(object), Object_identity_reference(this, *core_pd()) { } - virtual void destroy() { this->~Object_identity(); } - capid_t core_capid() { return capid(); } }; @@ -179,11 +183,6 @@ class Kernel::Core_object : public T, public Kernel::Core_object_identity template Core_object(ARGS &&... args) : T(args...), Core_object_identity(*static_cast(this)) { } - - void destroy() { - Core_object_identity::destroy(); - this->~T(); - } }; #endif /* _KERNEL__OBJECT_H_ */ diff --git a/repos/base-hw/src/core/kernel/object.cc b/repos/base-hw/src/core/kernel/object.cc index 77b46710f..83bdefb69 100644 --- a/repos/base-hw/src/core/kernel/object.cc +++ b/repos/base-hw/src/core/kernel/object.cc @@ -6,16 +6,41 @@ using namespace Kernel; -Object_identity::Object_identity(Object & object) : _object(object) { } + +/************ + ** Object ** + ************/ + +Object::~Object() +{ + for (Object_identity * oi = first(); oi; oi = first()) + oi->invalidate(); +} -Object_identity::~Object_identity() +/********************* + ** Object_identity ** + *********************/ + +void Object_identity::invalidate() { for (Object_identity_reference * oir = first(); oir; oir = first()) oir->invalidate(); + _object.remove(this); } +Object_identity::Object_identity(Object & object) +: _object(object) { _object.insert(this); } + + +Object_identity::~Object_identity() { invalidate(); } + + +/******************************* + ** Object_identity_reference ** + *******************************/ + Object_identity_reference * Object_identity_reference::find(Pd * pd) { @@ -50,7 +75,9 @@ Object_identity_reference * Object_identity_reference::factory(void * dst, void Object_identity_reference::invalidate() { - if (_identity) _identity->remove(this); } + if (_identity) _identity->remove(this); + _identity = nullptr; +} Object_identity_reference::Object_identity_reference(Object_identity *oi,