1// vim:set ft=cpp: -*- Mode: C++ -*- 2/** 3 * \file 4 * Unique_cap / Unique_del_cap 5 */ 6/* 7 * (c) 2017 Alexander Warg <alexander.warg@kernkonzept.com> 8 * 9 * This file is part of TUD:OS and distributed under the terms of the 10 * GNU General Public License 2. 11 * Please see the COPYING-GPL-2 file for details. 12 * 13 * As a special exception, you may use this file as part of a free software 14 * library without restriction. Specifically, if other files instantiate 15 * templates or use macros or inline functions from this file, or you compile 16 * this file and link it with other files to produce an executable, this 17 * file does not by itself cause the resulting executable to be covered by 18 * the GNU General Public License. This exception does not however 19 * invalidate any other reasons why the executable file might be covered by 20 * the GNU General Public License. 21 */ 22 23#pragma once 24 25#include <l4/re/cap_alloc> 26#include <l4/sys/cxx/smart_capability_1x> 27 28namespace L4Re { 29 30/** 31 * Unique capability that implements automatic free and unmap of the 32 * capability selector. 33 * 34 * \tparam T Type of the object the capability refers to. 35 * 36 * The ownership of the capability is managed in the same way as unique_ptr. 37 * 38 * \note This type is intended for users who implement a custom capability 39 * allocator; otherwise use L4Re::Util::Unique_cap. 40 */ 41template< typename T > 42using Unique_cap = L4::Detail::Unique_cap_impl<T, Smart_cap_auto<L4_FP_ALL_SPACES>>; 43/// \copydoc Unique_cap 44template< typename T > 45using unique_cap = L4::Detail::Unique_cap_impl<T, Smart_cap_auto<L4_FP_ALL_SPACES>>; 46 47/** 48 * Allocate a capability slot and wrap it in an Unique_cap. 49 * 50 * \tparam T Type of the object the capability refers to. 51 * \param ca Capability allocator to use. 52 * 53 * \note This function is intended for users who implement a custom capability 54 * allocator; otherwise use L4Re::Util::make_unique_cap<T>(). 55 */ 56template< typename T > 57Unique_cap<T> 58make_unique_cap(L4Re::Cap_alloc *ca) 59{ return Unique_cap<T>(ca->alloc<T>(), ca); } 60 61/** 62 * Unique capability that implements automatic free and unmap+delete of the 63 * capability selector. 64 * 65 * \tparam T Type of the object the capability refers to. 66 * 67 * The main difference to Unique_cap is that the unmap is done with the 68 * deletion flag enabled and this leads to the deletion of the object 69 * if the current task holds appropriate deletion rights. 70 * 71 * \note This type is intended for users who implement a custom capability 72 * allocator; otherwise use L4Re::Util::Unique_del_cap. 73 */ 74template< typename T > 75using Unique_del_cap = L4::Detail::Unique_cap_impl<T, Smart_cap_auto<L4_FP_DELETE_OBJ>>; 76/// \copydoc Unique_del_cap 77template<typename T> 78using unique_del_cap = L4::Detail::Unique_cap_impl<T, Smart_cap_auto<L4_FP_DELETE_OBJ>>; 79 80/** 81 * Allocate a capability slot and wrap it in an Unique_del_cap. 82 * 83 * \tparam T Type of the object the capability refers to. 84 * \param ca Capability allocator to use. 85 * 86 * \note This function is intended for users who implement a custom capability 87 * allocator; otherwise use L4Re::Util::make_unique_del_cap<T>(). 88 */ 89template< typename T > 90Unique_del_cap<T> 91make_unique_del_cap(L4Re::Cap_alloc *ca) 92{ return Unique_del_cap<T>(ca->alloc<T>(), ca); } 93 94} 95