/* * \brief Kernel object handling in core * \author Stefan Kalkowski * \date 2015-04-21 */ /* * Copyright (C) 2015 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. */ #ifndef _CORE__INCLUDE__OBJECT_H_ #define _CORE__INCLUDE__OBJECT_H_ #include #include #include #include namespace Genode { /** * Represents a kernel object in core * * \param T type of the kernel object */ template class Kernel_object; } template class Genode::Kernel_object { private: uint8_t _data[sizeof(Kernel::Core_object)] __attribute__((aligned(sizeof(addr_t)))); 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(syscall ? T::syscall_create(&_data, args...) : Kernel::cap_id_invalid()) { if (!syscall) construct_at(&_data, args...); } ~Kernel_object() { T::syscall_destroy(kernel_object()); } T * kernel_object() { return reinterpret_cast(_data); } /** * Create the kernel object explicitely via this function */ template bool create(ARGS &&... args) { if (_cap.valid()) return false; _cap = T::syscall_create(&_data, args...); return _cap.valid(); } }; #endif /* _CORE__INCLUDE__OBJECT_H_ */