1/* 2 * Copyright 2020, Haiku, Inc. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5#ifndef _AUTO_DELETER_DRIVERS_H 6#define _AUTO_DELETER_DRIVERS_H 7 8 9#include <AutoDeleter.h> 10#include <driver_settings.h> 11 12#if defined(_KERNEL_MODE) && !defined(_BOOT_MODE) 13#include <vfs.h> 14#include <fs/fd.h> 15#include <vm/VMAddressSpace.h> 16#include <device_manager.h> 17#endif 18 19 20namespace BPrivate { 21 22 23typedef CObjectDeleter<void, status_t, unload_driver_settings> 24 DriverSettingsUnloader; 25 26#if defined(_KERNEL_MODE) && !defined(_BOOT_MODE) 27 28typedef CObjectDeleter<struct vnode, void, vfs_put_vnode> VnodePutter; 29typedef CObjectDeleter<file_descriptor, void, put_fd> FileDescriptorPutter; 30typedef MethodDeleter<VMAddressSpace, void, &VMAddressSpace::Put> 31 VMAddressSpacePutter; 32 33#if __GNUC__ >= 4 34 35template <device_manager_info **deviceManager> 36using DeviceNodePutter = MethodObjectDeleter<device_node, device_manager_info, 37 deviceManager, void, &device_manager_info::put_node>; 38 39#else 40 41template <device_manager_info **deviceManager> 42struct DeviceNodePutter : MethodObjectDeleter<device_node, device_manager_info, 43 deviceManager, void, &device_manager_info::put_node> 44{ 45 typedef MethodObjectDeleter<device_node, device_manager_info, 46 deviceManager, void, &device_manager_info::put_node> Base; 47 48 DeviceNodePutter() : Base() {} 49 DeviceNodePutter(device_node* object) : Base(object) {} 50}; 51 52#endif 53 54#endif 55 56 57} 58 59 60using ::BPrivate::DriverSettingsUnloader; 61 62#if defined(_KERNEL_MODE) && !defined(_BOOT_MODE) 63 64using ::BPrivate::VnodePutter; 65using ::BPrivate::FileDescriptorPutter; 66using ::BPrivate::VMAddressSpacePutter; 67using ::BPrivate::DeviceNodePutter; 68 69#endif 70 71 72#endif // _AUTO_DELETER_DRIVERS_H 73