/* * \brief Kernel object handling in core * \author Stefan Kalkowski * \date 2015-04-21 */ /* * Copyright (C) 2015-2017 Genode Labs GmbH * * This file is part of the Genode OS framework, which is distributed * under the terms of the GNU Affero General Public License version 3. */ #ifndef _CORE__OBJECT_H_ #define _CORE__OBJECT_H_ /* Genode includes */ #include /* base-internal includes */ #include /* base-hw includes */ #include #include "kernel/object.h" namespace Genode { /** * Represents a kernel object in core * * \param T type of the kernel object */ template class Kernel_object; } template class Genode::Kernel_object : public Genode::Constructible> { protected: Untyped_capability _cap { }; public: Kernel_object() {} /** * Creates a kernel object either via a syscall or directly */ template Kernel_object(bool syscall, ARGS &&... args) : _cap(Capability_space::import(syscall ? T::syscall_create(*this, args...) : Kernel::cap_id_invalid())) { if (!syscall) Genode::Constructible>::construct(args...); } ~Kernel_object() { if (Genode::Constructible>::constructed()) T::syscall_destroy(*this); } Untyped_capability cap() { return _cap; } /** * Create the kernel object explicitely via this function */ template bool create(ARGS &&... args) { if (Genode::Constructible>::constructed()) return false; _cap = Capability_space::import(T::syscall_create(*this, args...)); return _cap.valid(); } }; #endif /* _CORE__OBJECT_H_ */