[haiku-commits] haiku: hrev54773 - headers/private/shared src src/add-ons/kernel/file_systems/packagefs/volume src/system/libroot/os src/system/kernel

  • From: Adrien Destugues <pulkomandy@xxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Thu, 10 Dec 2020 06:39:55 -0500 (EST)

hrev54773 adds 7 changesets to branch 'master'
old head: 6f243905bf192369b15cacfb54f19d79fb1756a5
new head: 6467297a1b2e6aed10add9aadae941d66d3451fe
overview: 
https://git.haiku-os.org/haiku/log/?qt=range&q=6467297a1b2e+%5E6f243905bf19

----------------------------------------------------------------------------

7d775e7925da: AutoDeleter: move destructor function in CObjectDeleter from 
constructor to template argument
  
  It allows to make typedef of pointer types and declaring pointers in headers.
  
  Store of destructor function pointer in CObjectDeleter is no longer needed.
  
  Change-Id: Ic629fd10b28b09f4190edf8ba6b911ca3108ab0e
  Reviewed-on: https://review.haiku-os.org/c/haiku/+/3455
  Reviewed-by: Adrien Destugues <pulkomandy@xxxxxxxxx>

aecba91311ee: AutoDeleter: move destructor function in MethodDeleter from 
constructor to template argument
  
  The same as CObjectDeleter.
  
  Change-Id: I85c4cb3635f01f13e529ca087324cc2fcb42cfc0
  Reviewed-on: https://review.haiku-os.org/c/haiku/+/3456
  Reviewed-by: Adrien Destugues <pulkomandy@xxxxxxxxx>

ab57ee42cb5d: fix build after MethodDeleter interface change
  
  Change-Id: Iadb9e37772fd6588636085944c1455249ac0f926
  Reviewed-on: https://review.haiku-os.org/c/haiku/+/3457
  Reviewed-by: Adrien Destugues <pulkomandy@xxxxxxxxx>

76ab85671d6d: AutoDeleter: fix AutoDeleter size
  
  C++ don't allow zero size class fields. If field with empty class field
  is used, it's size will be 1 byte.
  
  Create DeleteFunc instance as local variable at each use instead.
  
  Fixes #16638.
  
  Change-Id: Ifb76c45ea02e9fed014751542ee5f16f41e11d15
  Reviewed-on: https://review.haiku-os.org/c/haiku/+/3458
  Reviewed-by: Adrien Destugues <pulkomandy@xxxxxxxxx>

71e79db9b8c5: fix build after AutoDeleter change
  
  Change-Id: Id6ffc8d58821159b1d570bf5ac17d8347d88f7f5
  Reviewed-on: https://review.haiku-os.org/c/haiku/+/3459
  Reviewed-by: Adrien Destugues <pulkomandy@xxxxxxxxx>

36aafa560b2c: fix build after CObjectDeleter interface change
  
  Change-Id: I76e217abcd13c22c4d68170e07333cdde4d7a891
  Reviewed-on: https://review.haiku-os.org/c/haiku/+/3461
  Reviewed-by: Adrien Destugues <pulkomandy@xxxxxxxxx>

6467297a1b2e: simplify AutoDeleter code by using typedef
  
  Change-Id: I726c3aee794b91ed51970853db3921d17a5f795e
  Reviewed-on: https://review.haiku-os.org/c/haiku/+/3462
  Reviewed-by: Adrien Destugues <pulkomandy@xxxxxxxxx>

                                              [ X512 <danger_mail@xxxxxxx> ]

----------------------------------------------------------------------------

33 files changed, 96 insertions(+), 144 deletions(-)
headers/private/shared/AutoDeleter.h             | 71 +++++++-------------
.../kernel/file_systems/bfs/kernel_interface.cpp |  2 +-
src/add-ons/kernel/file_systems/bindfs/Utils.h   | 19 +-----
.../kernel/file_systems/bindfs/Volume.cpp        |  4 +-
.../file_systems/ext2/kernel_interface.cpp       |  2 +-
.../packagefs/package/PackageFile.cpp            |  4 +-
.../packagefs/volume/PackageFSRoot.cpp           |  2 +-
.../packagefs/volume/PackageSettings.cpp         |  4 +-
.../file_systems/packagefs/volume/Volume.cpp     | 10 +--
src/add-ons/kernel/network/stack/net_socket.cpp  | 10 +--
.../imap/IMAPConnectionWorker.cpp                |  2 +-
src/apps/aboutsystem/AboutSystem.cpp             |  2 +-
src/bin/multiuser/multiuser_utils.cpp            |  2 +-
src/bin/package/PackageWritingUtils.cpp          |  2 +-
src/bin/ramdisk.cpp                              |  2 +-
src/kits/package/RepositoryInfo.cpp              |  4 +-
src/kits/package/hpkg/PackageWriterImpl.cpp      |  8 +--
src/kits/package/manager/RepositoryBuilder.cpp   |  2 +-
.../package/solver/libsolv/LibsolvSolver.cpp     |  4 +-
src/preferences/virtualmemory/Settings.cpp       |  4 +-
src/servers/registrar/AuthenticationManager.cpp  | 12 ++--
.../packagefs/PackageSettingsItem.cpp            |  4 +-
.../boot/loader/file_systems/tarfs/tarfs.cpp     | 14 +---
src/system/boot/loader/vfs.cpp                   |  6 +-
src/system/kernel/arch/x86/ioapic.cpp            |  4 +-
.../kernel/device_manager/device_manager.cpp     | 12 ++--
src/system/kernel/fs/fd.cpp                      |  2 +-
src/system/kernel/fs/vfs_request_io.cpp          |  4 +-
src/system/kernel/team.cpp                       |  4 +-
src/system/kernel/vm/vm.cpp                      |  2 +-
src/system/kernel/vm/vm_page.cpp                 |  2 +-
src/system/libroot/os/find_paths.cpp             | 12 ++--
src/tools/hvif2png/hvif2png.cpp                  |  2 +-

############################################################################

Commit:      7d775e7925da4ae6f4c90f451ec7b0f212fc6daa
URL:         https://git.haiku-os.org/haiku/commit/?id=7d775e7925da
Author:      X512 <danger_mail@xxxxxxx>
Date:        Fri Dec  4 13:17:42 2020 UTC
Committer:   Adrien Destugues <pulkomandy@xxxxxxxxx>
Commit-Date: Thu Dec 10 11:39:49 2020 UTC

AutoDeleter: move destructor function in CObjectDeleter from constructor to 
template argument

It allows to make typedef of pointer types and declaring pointers in headers.

Store of destructor function pointer in CObjectDeleter is no longer needed.

Change-Id: Ic629fd10b28b09f4190edf8ba6b911ca3108ab0e
Reviewed-on: https://review.haiku-os.org/c/haiku/+/3455
Reviewed-by: Adrien Destugues <pulkomandy@xxxxxxxxx>

----------------------------------------------------------------------------

diff --git a/headers/private/shared/AutoDeleter.h 
b/headers/private/shared/AutoDeleter.h
index 24825dd765..2c2c9d5cf7 100644
--- a/headers/private/shared/AutoDeleter.h
+++ b/headers/private/shared/AutoDeleter.h
@@ -149,41 +149,31 @@ struct MemoryDeleter : AutoDeleter<void, MemoryDelete >
 
 // CObjectDeleter
 
-template<typename Type, typename DestructorReturnType>
+template<typename Type, typename DestructorReturnType,
+       DestructorReturnType (*Destructor)(Type*)>
 struct CObjectDelete
 {
        inline void operator()(Type *object)
        {
-               if (fDestructor != NULL && object != NULL)
-                       fDestructor(object);
-       }
-
-       template<typename Destructor>
-       inline void operator=(Destructor destructor)
-       {
-               fDestructor = destructor;
+               if (object != NULL)
+                       Destructor(object);
        }
-
-private:
-       DestructorReturnType (*fDestructor)(Type*);
 };
 
-template<typename Type, typename DestructorReturnType = void>
+template<typename Type, typename DestructorReturnType,
+       DestructorReturnType (*Destructor)(Type*)>
 struct CObjectDeleter
-       : AutoDeleter<Type, CObjectDelete<Type, DestructorReturnType> >
+       : AutoDeleter<Type, CObjectDelete<Type, DestructorReturnType, 
Destructor> >
 {
-       typedef AutoDeleter<Type, CObjectDelete<Type, DestructorReturnType> > 
Base;
+       typedef AutoDeleter<Type,
+               CObjectDelete<Type, DestructorReturnType, Destructor> > Base;
 
-       template<typename Destructor>
-       CObjectDeleter(Destructor destructor) : Base()
+       CObjectDeleter() : Base()
        {
-               Base::fDelete = destructor;
        }
 
-       template<typename Destructor>
-       CObjectDeleter(Type *object, Destructor destructor) : Base(object)
+       CObjectDeleter(Type *object) : Base(object)
        {
-               Base::fDelete = destructor;
        }
 };
 

############################################################################

Commit:      aecba91311ee8f598dc9c69c17e9bb499a0a43e6
URL:         https://git.haiku-os.org/haiku/commit/?id=aecba91311ee
Author:      X512 <danger_mail@xxxxxxx>
Date:        Fri Dec  4 13:53:08 2020 UTC
Committer:   Adrien Destugues <pulkomandy@xxxxxxxxx>
Commit-Date: Thu Dec 10 11:39:49 2020 UTC

AutoDeleter: move destructor function in MethodDeleter from constructor to 
template argument

The same as CObjectDeleter.

Change-Id: I85c4cb3635f01f13e529ca087324cc2fcb42cfc0
Reviewed-on: https://review.haiku-os.org/c/haiku/+/3456
Reviewed-by: Adrien Destugues <pulkomandy@xxxxxxxxx>

----------------------------------------------------------------------------

diff --git a/headers/private/shared/AutoDeleter.h 
b/headers/private/shared/AutoDeleter.h
index 2c2c9d5cf7..429443b029 100644
--- a/headers/private/shared/AutoDeleter.h
+++ b/headers/private/shared/AutoDeleter.h
@@ -180,42 +180,32 @@ struct CObjectDeleter
 
 // MethodDeleter
 
-template<typename Type, typename DestructorReturnType>
+template<typename Type, typename DestructorReturnType,
+       DestructorReturnType (Type::*Destructor)()>
 struct MethodDelete
 {
        inline void operator()(Type *object)
        {
-               if (fDestructor && object != NULL)
-                       (object->*fDestructor)();
-       }
-
-       template<typename Destructor>
-       inline void operator=(Destructor destructor)
-       {
-               fDestructor = destructor;
+               if (object != NULL)
+                       (object->*Destructor)();
        }
-
-private:
-       DestructorReturnType (Type::*fDestructor)();
 };
 
 
-template<typename Type, typename DestructorReturnType = void>
+template<typename Type, typename DestructorReturnType,
+       DestructorReturnType (Type::*Destructor)()>
 struct MethodDeleter
-       : AutoDeleter<Type, MethodDelete<Type, DestructorReturnType> >
+       : AutoDeleter<Type, MethodDelete<Type, DestructorReturnType, 
Destructor> >
 {
-       typedef AutoDeleter<Type, MethodDelete<Type, DestructorReturnType> > 
Base;
+       typedef AutoDeleter<Type,
+               MethodDelete<Type, DestructorReturnType, Destructor> > Base;
 
-       template<typename Destructor>
-       MethodDeleter(Destructor destructor) : Base()
+       MethodDeleter() : Base()
        {
-               Base::fDelete = destructor;
        }
 
-       template<typename Destructor>
-       MethodDeleter(Type *object, Destructor destructor) : Base(object)
+       MethodDeleter(Type *object) : Base(object)
        {
-               Base::fDelete = destructor;
        }
 };
 

############################################################################

Commit:      ab57ee42cb5dadf0f24d84873a9bab65bdf46a06
URL:         https://git.haiku-os.org/haiku/commit/?id=ab57ee42cb5d
Author:      X512 <danger_mail@xxxxxxx>
Date:        Fri Dec  4 13:54:37 2020 UTC
Committer:   Adrien Destugues <pulkomandy@xxxxxxxxx>
Commit-Date: Thu Dec 10 11:39:49 2020 UTC

fix build after MethodDeleter interface change

Change-Id: Iadb9e37772fd6588636085944c1455249ac0f926
Reviewed-on: https://review.haiku-os.org/c/haiku/+/3457
Reviewed-by: Adrien Destugues <pulkomandy@xxxxxxxxx>

----------------------------------------------------------------------------

diff --git a/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp 
b/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp
index 942cb5f754..7f3b1397c5 100644
--- a/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp
+++ b/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp
@@ -1190,7 +1190,7 @@ ext2_open(fs_volume* _volume, fs_vnode* _node, int 
openMode, void** _cookie)
        cookie->last_size = inode->Size();
        cookie->last_notification = system_time();
 
-       MethodDeleter<Inode, status_t> 
fileCacheEnabler(&Inode::EnableFileCache);
+       MethodDeleter<Inode, status_t, &Inode::EnableFileCache> 
fileCacheEnabler;
        if ((openMode & O_NOCACHE) != 0) {
                status = inode->DisableFileCache();
                if (status != B_OK)
diff --git a/src/add-ons/kernel/file_systems/packagefs/package/PackageFile.cpp 
b/src/add-ons/kernel/file_systems/packagefs/package/PackageFile.cpp
index 477c955445..62aed472d2 100644
--- a/src/add-ons/kernel/file_systems/packagefs/package/PackageFile.cpp
+++ b/src/add-ons/kernel/file_systems/packagefs/package/PackageFile.cpp
@@ -148,8 +148,8 @@ PackageFile::VFSInit(dev_t deviceID, ino_t nodeID)
        status_t error = PackageNode::VFSInit(deviceID, nodeID);
        if (error != B_OK)
                return error;
-       MethodDeleter<PackageNode> baseClassUninit(this,
-               &PackageNode::NonVirtualVFSUninit);
+       MethodDeleter<PackageNode, void, &PackageNode::NonVirtualVFSUninit>
+               baseClassUninit(this);
 
        // open the package -- that's already done by PackageNode::VFSInit(), 
so it
        // shouldn't fail here. We only need to do it again, since we need the 
FD.
diff --git a/src/system/kernel/device_manager/device_manager.cpp 
b/src/system/kernel/device_manager/device_manager.cpp
index 00d035a41d..e8bb4c2eec 100644
--- a/src/system/kernel/device_manager/device_manager.cpp
+++ b/src/system/kernel/device_manager/device_manager.cpp
@@ -1955,8 +1955,7 @@ device_node::Probe(const char* devicePath, uint32 
updateCycle)
        if (status < B_OK)
                return status;
 
-       MethodDeleter<device_node, bool> uninit(this,
-               &device_node::UninitDriver);
+       MethodDeleter<device_node, bool, &device_node::UninitDriver> 
uninit(this);
 
        if ((fFlags & B_FIND_CHILD_ON_DEMAND) != 0) {
                bool matches = false;
@@ -2026,8 +2025,7 @@ device_node::Reprobe()
        if (status < B_OK)
                return status;
 
-       MethodDeleter<device_node, bool> uninit(this,
-               &device_node::UninitDriver);
+       MethodDeleter<device_node, bool, &device_node::UninitDriver> 
uninit(this);
 
        // If this child has been probed already, probe it again
        status = _Probe();
@@ -2054,8 +2052,7 @@ device_node::Rescan()
        if (status < B_OK)
                return status;
 
-       MethodDeleter<device_node, bool> uninit(this,
-               &device_node::UninitDriver);
+       MethodDeleter<device_node, bool, &device_node::UninitDriver> 
uninit(this);
 
        if (DriverModule()->rescan_child_devices != NULL) {
                status = DriverModule()->rescan_child_devices(DriverData());
diff --git a/src/system/kernel/vm/vm_page.cpp b/src/system/kernel/vm/vm_page.cpp
index 2b52b4ac6a..182f791c57 100644
--- a/src/system/kernel/vm/vm_page.cpp
+++ b/src/system/kernel/vm/vm_page.cpp
@@ -2537,7 +2537,7 @@ free_cached_page(vm_page *page, bool dontWait)
        VMCache* cache = page->Cache();
 
        AutoLocker<VMCache> cacheLocker(cache, true);
-       MethodDeleter<VMCache> _2(cache, &VMCache::ReleaseRefLocked);
+       MethodDeleter<VMCache, void, &VMCache::ReleaseRefLocked> _2(cache);
 
        // check again if that page is still a candidate
        if (page->busy || page->State() != PAGE_STATE_CACHED)
diff --git a/src/system/libroot/os/find_paths.cpp 
b/src/system/libroot/os/find_paths.cpp
index 2660cd12c9..6d613e4bef 100644
--- a/src/system/libroot/os/find_paths.cpp
+++ b/src/system/libroot/os/find_paths.cpp
@@ -557,8 +557,8 @@ internal_path_for_path(char* referencePath, size_t 
referencePathSize,
 
        // get the installation location
        InstallationLocations* installationLocations = 
InstallationLocations::Get();
-       MethodDeleter<InstallationLocations> installationLocationsDeleter(
-               installationLocations, &InstallationLocations::Put);
+       MethodDeleter<InstallationLocations, void, &InstallationLocations::Put>
+               installationLocationsDeleter(installationLocations);
 
        size_t installationLocationIndex;
        const char* installationLocation = installationLocations->LocationFor(
@@ -678,8 +678,8 @@ __find_paths_etc(const char* architecture, 
path_base_directory baseDirectory,
 
        // get the installation locations
        InstallationLocations* installationLocations = 
InstallationLocations::Get();
-       MethodDeleter<InstallationLocations> installationLocationsDeleter(
-               installationLocations, &InstallationLocations::Put);
+       MethodDeleter<InstallationLocations, void, &InstallationLocations::Put>
+               installationLocationsDeleter(installationLocations);
 
        // Get the relative paths and compute the total size to allocate.
        const char* relativePaths[InstallationLocations::kCount];
@@ -756,8 +756,8 @@ __guess_secondary_architecture_from_path(const char* path,
 
        // get an installation location relative path
        InstallationLocations* installationLocations = 
InstallationLocations::Get();
-       MethodDeleter<InstallationLocations> installationLocationsDeleter(
-               installationLocations, &InstallationLocations::Put);
+       MethodDeleter<InstallationLocations, void, &InstallationLocations::Put>
+               installationLocationsDeleter(installationLocations);
 
        size_t installationLocationIndex;
        const char* installationLocation = installationLocations->LocationFor(

############################################################################

Commit:      76ab85671d6daef1f3976d3d77e8f39e131869eb
URL:         https://git.haiku-os.org/haiku/commit/?id=76ab85671d6d
Author:      X512 <danger_mail@xxxxxxx>
Date:        Fri Dec  4 14:17:04 2020 UTC
Committer:   Adrien Destugues <pulkomandy@xxxxxxxxx>
Commit-Date: Thu Dec 10 11:39:49 2020 UTC

Ticket:      https://dev.haiku-os.org/ticket/16638

AutoDeleter: fix AutoDeleter size

C++ don't allow zero size class fields. If field with empty class field
is used, it's size will be 1 byte.

Create DeleteFunc instance as local variable at each use instead.

Fixes #16638.

Change-Id: Ifb76c45ea02e9fed014751542ee5f16f41e11d15
Reviewed-on: https://review.haiku-os.org/c/haiku/+/3458
Reviewed-by: Adrien Destugues <pulkomandy@xxxxxxxxx>

----------------------------------------------------------------------------

diff --git a/headers/private/shared/AutoDeleter.h 
b/headers/private/shared/AutoDeleter.h
index 429443b029..d4f7d98d64 100644
--- a/headers/private/shared/AutoDeleter.h
+++ b/headers/private/shared/AutoDeleter.h
@@ -39,13 +39,15 @@ public:
 
        inline ~AutoDeleter()
        {
-               fDelete(fObject);
+               DeleteFunc destructor;
+               destructor(fObject);
        }
 
        inline void SetTo(C *object)
        {
                if (object != fObject) {
-                       fDelete(fObject);
+                       DeleteFunc destructor;
+                       destructor(fObject);
                        fObject = object;
                }
        }
@@ -79,7 +81,6 @@ public:
 
 protected:
        C                       *fObject;
-       DeleteFunc      fDelete;
 
 private:
        AutoDeleter(const AutoDeleter&);

############################################################################

Commit:      71e79db9b8c583e11f048b71d28c1a0aaaa54cd8
URL:         https://git.haiku-os.org/haiku/commit/?id=71e79db9b8c5
Author:      X512 <danger_mail@xxxxxxx>
Date:        Fri Dec  4 14:24:03 2020 UTC
Committer:   Adrien Destugues <pulkomandy@xxxxxxxxx>
Commit-Date: Thu Dec 10 11:39:49 2020 UTC

fix build after AutoDeleter change

Change-Id: Id6ffc8d58821159b1d570bf5ac17d8347d88f7f5
Reviewed-on: https://review.haiku-os.org/c/haiku/+/3459
Reviewed-by: Adrien Destugues <pulkomandy@xxxxxxxxx>

----------------------------------------------------------------------------

diff --git 
a/src/add-ons/mail_daemon/inbound_protocols/imap/IMAPConnectionWorker.cpp 
b/src/add-ons/mail_daemon/inbound_protocols/imap/IMAPConnectionWorker.cpp
index cebbc8ab39..5429ddd70f 100644
--- a/src/add-ons/mail_daemon/inbound_protocols/imap/IMAPConnectionWorker.cpp
+++ b/src/add-ons/mail_daemon/inbound_protocols/imap/IMAPConnectionWorker.cpp
@@ -513,7 +513,7 @@ struct CommandDeleter : 
BPrivate::AutoDeleter<WorkerCommand, CommandDelete>
 
        ~CommandDeleter()
        {
-               if (dynamic_cast<SyncCommand*>(fObject) != NULL)
+               if (dynamic_cast<SyncCommand*>(Get()) != NULL)
                        WorkerPrivate(fWorker).SyncCommandDone();
        }
 

############################################################################

Commit:      36aafa560b2cf96aa39cc753c6dec7f54431d564
URL:         https://git.haiku-os.org/haiku/commit/?id=36aafa560b2c
Author:      X512 <danger_mail@xxxxxxx>
Date:        Fri Dec  4 13:21:45 2020 UTC
Committer:   Adrien Destugues <pulkomandy@xxxxxxxxx>
Commit-Date: Thu Dec 10 11:39:49 2020 UTC

fix build after CObjectDeleter interface change

Change-Id: I76e217abcd13c22c4d68170e07333cdde4d7a891
Reviewed-on: https://review.haiku-os.org/c/haiku/+/3461
Reviewed-by: Adrien Destugues <pulkomandy@xxxxxxxxx>

----------------------------------------------------------------------------

diff --git a/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp 
b/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp
index c91d0272f7..f98ea7e604 100644
--- a/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp
+++ b/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp
@@ -1372,7 +1372,7 @@ bfs_open(fs_volume* _volume, fs_vnode* _node, int 
openMode, void** _cookie)
        cookie->last_notification = system_time();
 
        // Disable the file cache, if requested?
-       CObjectDeleter<void> fileCacheEnabler(file_cache_enable);
+       CObjectDeleter<void, void, file_cache_enable> fileCacheEnabler;
        if ((openMode & O_NOCACHE) != 0 && inode->FileCache() != NULL) {
                status = file_cache_disable(inode->FileCache());
                if (status != B_OK)
diff --git a/src/add-ons/kernel/file_systems/bindfs/Volume.cpp 
b/src/add-ons/kernel/file_systems/bindfs/Volume.cpp
index e811459d34..14b74310dc 100644
--- a/src/add-ons/kernel/file_systems/bindfs/Volume.cpp
+++ b/src/add-ons/kernel/file_systems/bindfs/Volume.cpp
@@ -51,8 +51,8 @@ Volume::Mount(const char* parameterString)
 {
        const char* source = NULL;
        void* parameterHandle = parse_driver_settings_string(parameterString);
-       CObjectDeleter<void, status_t> parameterDeleter(parameterHandle,
-               delete_driver_settings);
+       CObjectDeleter<void, status_t, delete_driver_settings>
+               parameterDeleter(parameterHandle);
        if (parameterHandle != NULL)
                source = get_driver_parameter(parameterHandle, "source", NULL, 
NULL);
        if (source == NULL || source[0] == '\0') {
diff --git a/src/add-ons/kernel/file_systems/packagefs/volume/PackageFSRoot.cpp 
b/src/add-ons/kernel/file_systems/packagefs/volume/PackageFSRoot.cpp
index affa19912a..096bc8fd22 100644
--- a/src/add-ons/kernel/file_systems/packagefs/volume/PackageFSRoot.cpp
+++ b/src/add-ons/kernel/file_systems/packagefs/volume/PackageFSRoot.cpp
@@ -114,7 +114,7 @@ PackageFSRoot::RegisterVolume(Volume* volume)
                                relativeRootPath, strerror(error));
                        RETURN_ERROR(error);
                }
-               CObjectDeleter<struct vnode> vnodePutter(vnode, &vfs_put_vnode);
+               CObjectDeleter<struct vnode, void, vfs_put_vnode> 
vnodePutter(vnode);
 
                // stat it
                struct stat st;
diff --git 
a/src/add-ons/kernel/file_systems/packagefs/volume/PackageSettings.cpp 
b/src/add-ons/kernel/file_systems/packagefs/volume/PackageSettings.cpp
index 8fcf2d1114..ad2985e010 100644
--- a/src/add-ons/kernel/file_systems/packagefs/volume/PackageSettings.cpp
+++ b/src/add-ons/kernel/file_systems/packagefs/volume/PackageSettings.cpp
@@ -216,8 +216,8 @@ PackageSettings::Load(dev_t mountPointDeviceID, ino_t 
mountPointNodeID,
        void* settingsHandle = load_driver_settings(path.Path());
        if (settingsHandle == NULL)
                return B_ENTRY_NOT_FOUND;
-       CObjectDeleter<void, status_t> settingsDeleter(settingsHandle,
-               &unload_driver_settings);
+       CObjectDeleter<void, status_t, unload_driver_settings>
+               settingsDeleter(settingsHandle);
 
        const driver_settings* settings = get_driver_settings(settingsHandle);
        for (int i = 0; i < settings->parameter_count; i++) {
diff --git a/src/add-ons/kernel/file_systems/packagefs/volume/Volume.cpp 
b/src/add-ons/kernel/file_systems/packagefs/volume/Volume.cpp
index a94886da67..9886cea9fa 100644
--- a/src/add-ons/kernel/file_systems/packagefs/volume/Volume.cpp
+++ b/src/add-ons/kernel/file_systems/packagefs/volume/Volume.cpp
@@ -329,8 +329,8 @@ Volume::Mount(const char* parameterString)
                        NULL);
        }
 
-       CObjectDeleter<void, status_t> parameterHandleDeleter(parameterHandle,
-               &delete_driver_settings);
+       CObjectDeleter<void, status_t, delete_driver_settings>
+               parameterHandleDeleter(parameterHandle);
 
        if (packages != NULL && packages[0] == '\0') {
                FATAL("invalid package folder ('packages' parameter)!\n");
@@ -711,7 +711,7 @@ Volume::_LoadOldPackagesStates(const char* packagesState)
                ERROR("Failed to open administrative directory: %s\n", 
strerror(errno));
                RETURN_ERROR(errno);
        }
-       CObjectDeleter<DIR, int> dirCloser(dir, closedir);
+       CObjectDeleter<DIR, int, closedir> dirCloser(dir);
 
        while (dirent* entry = readdir(dir)) {
                if (strncmp(entry->d_name, "state_", 6) != 0
@@ -903,7 +903,7 @@ Volume::_AddInitialPackagesFromDirectory()
                        fPackagesDirectory->Path(), strerror(errno));
                RETURN_ERROR(errno);
        }
-       CObjectDeleter<DIR, int> dirCloser(dir, closedir);
+       CObjectDeleter<DIR, int, closedir> dirCloser(dir);
 
        while (dirent* entry = readdir(dir)) {
                // skip "." and ".."
@@ -1778,7 +1778,7 @@ Volume::_PublishShineThroughDirectories()
                        _RemoveNode(directory);
                        continue;
                }
-               CObjectDeleter<struct vnode> vnodePutter(vnode, &vfs_put_vnode);
+               CObjectDeleter<struct vnode, void, vfs_put_vnode> 
vnodePutter(vnode);
 
                // stat it
                struct stat st;
diff --git a/src/add-ons/kernel/network/stack/net_socket.cpp 
b/src/add-ons/kernel/network/stack/net_socket.cpp
index 03297b92d3..25b10ec469 100644
--- a/src/add-ons/kernel/network/stack/net_socket.cpp
+++ b/src/add-ons/kernel/network/stack/net_socket.cpp
@@ -323,8 +323,9 @@ socket_receive_no_buffer(net_socket* socket, msghdr* 
header, void* data,
        if (bytesRead < 0)
                return bytesRead;
 
-       CObjectDeleter<ancillary_data_container> 
ancillaryDataDeleter(ancillaryData,
-               &delete_ancillary_data_container);
+       CObjectDeleter<
+               ancillary_data_container, void, delete_ancillary_data_container>
+               ancillaryDataDeleter(ancillaryData);
 
        // process ancillary data
        if (header != NULL) {
@@ -1346,8 +1347,9 @@ socket_send(net_socket* socket, msghdr* header, const 
void* data, size_t length,
                return B_BAD_VALUE;
 
        ancillary_data_container* ancillaryData = NULL;
-       CObjectDeleter<ancillary_data_container> ancillaryDataDeleter(NULL,
-               &delete_ancillary_data_container);
+       CObjectDeleter<
+               ancillary_data_container, void, delete_ancillary_data_container>
+               ancillaryDataDeleter;
 
        if (header != NULL) {
                address = (const sockaddr*)header->msg_name;
diff --git a/src/apps/aboutsystem/AboutSystem.cpp 
b/src/apps/aboutsystem/AboutSystem.cpp
index 5e719d667f..f9c6149ede 100644
--- a/src/apps/aboutsystem/AboutSystem.cpp
+++ b/src/apps/aboutsystem/AboutSystem.cpp
@@ -1463,7 +1463,7 @@ AboutView::_AddCopyrightsFromAttribute()
                close(attrFD);
                return;
        }
-       CObjectDeleter<FILE, int> _(attrFile, fclose);
+       CObjectDeleter<FILE, int, fclose> _(attrFile);
 
        // read and parse the copyrights
        BMessage package;
diff --git a/src/bin/multiuser/multiuser_utils.cpp 
b/src/bin/multiuser/multiuser_utils.cpp
index 7f538edd23..f70e549a52 100644
--- a/src/bin/multiuser/multiuser_utils.cpp
+++ b/src/bin/multiuser/multiuser_utils.cpp
@@ -38,7 +38,7 @@ read_password(const char* prompt, char* password, size_t 
bufferSize,
                in = tty;
                out = tty;
        }
-       CObjectDeleter<FILE, int> ttyCloser(tty, fclose);
+       CObjectDeleter<FILE, int, fclose> ttyCloser(tty);
 
        // disable echo
        int inFD = fileno(in);
diff --git a/src/bin/package/PackageWritingUtils.cpp 
b/src/bin/package/PackageWritingUtils.cpp
index 25cbe669e7..ad29dd588d 100644
--- a/src/bin/package/PackageWritingUtils.cpp
+++ b/src/bin/package/PackageWritingUtils.cpp
@@ -27,7 +27,7 @@ add_current_directory_entries(BPackageWriter& packageWriter,
                        strerror(errno));
                return errno;
        }
-       CObjectDeleter<DIR, int> dirCloser(dir, &closedir);
+       CObjectDeleter<DIR, int, closedir> dirCloser(dir);
 
        while (dirent* entry = readdir(dir)) {
                // skip "." and ".."
diff --git a/src/bin/ramdisk.cpp b/src/bin/ramdisk.cpp
index 4681733d54..bf4dacb49e 100644
--- a/src/bin/ramdisk.cpp
+++ b/src/bin/ramdisk.cpp
@@ -387,7 +387,7 @@ command_list(int argc, const char* const* argv)
                        strerror(errno));
                return 1;
        }
-       CObjectDeleter<DIR, int> dirCloser(dir, &closedir);
+       CObjectDeleter<DIR, int, closedir> dirCloser(dir);
 
        TextTable table;
        table.AddColumn("ID", B_ALIGN_RIGHT);
diff --git a/src/kits/package/RepositoryInfo.cpp 
b/src/kits/package/RepositoryInfo.cpp
index ac20487e3e..28957ecf55 100644
--- a/src/kits/package/RepositoryInfo.cpp
+++ b/src/kits/package/RepositoryInfo.cpp
@@ -360,8 +360,8 @@ BRepositoryInfo::_SetTo(const BEntry& entry)
        void* settingsHandle = 
parse_driver_settings_string(configString.String());
        if (settingsHandle == NULL)
                return B_BAD_DATA;
-       CObjectDeleter<void, status_t> settingsHandleDeleter(settingsHandle,
-               &unload_driver_settings);
+       CObjectDeleter<void, status_t, unload_driver_settings>
+               settingsHandleDeleter(settingsHandle);
 
        const char* name = get_driver_parameter(settingsHandle, "name", NULL, 
NULL);
        const char* identifier = get_driver_parameter(settingsHandle, 
"identifier", NULL, NULL);
diff --git a/src/kits/package/hpkg/PackageWriterImpl.cpp 
b/src/kits/package/hpkg/PackageWriterImpl.cpp
index 94bdb7308d..1cf964df12 100644
--- a/src/kits/package/hpkg/PackageWriterImpl.cpp
+++ b/src/kits/package/hpkg/PackageWriterImpl.cpp
@@ -1138,7 +1138,7 @@ PackageWriterImpl::_UpdateCheckEntryCollisions(Attribute* 
parentAttribute,
 
                // first we check for colliding node attributes, though
                if (DIR* attrDir = fs_fopen_attr_dir(fd)) {
-                       CObjectDeleter<DIR, int> attrDirCloser(attrDir, 
fs_close_attr_dir);
+                       CObjectDeleter<DIR, int, fs_close_attr_dir> 
attrDirCloser(attrDir);
 
                        while (dirent* entry = fs_read_attr_dir(attrDir)) {
                                attr_info attrInfo;
@@ -1184,7 +1184,7 @@ PackageWriterImpl::_UpdateCheckEntryCollisions(Attribute* 
parentAttribute,
                        close(clonedFD);
                        throw status_t(errno);
                }
-               CObjectDeleter<DIR, int> dirCloser(dir, closedir);
+               CObjectDeleter<DIR, int, closedir> dirCloser(dir);
 
                while (dirent* entry = readdir(dir)) {
                        // skip "." and ".."
@@ -1525,7 +1525,7 @@ PackageWriterImpl::_AddEntry(int dirFD, Entry* entry, 
const char* fileName,
 
        // add attributes
        if (DIR* attrDir = fs_fopen_attr_dir(fd)) {
-               CObjectDeleter<DIR, int> attrDirCloser(attrDir, 
fs_close_attr_dir);
+               CObjectDeleter<DIR, int, fs_close_attr_dir> 
attrDirCloser(attrDir);
 
                while (dirent* entry = fs_read_attr_dir(attrDir)) {
                        attr_info attrInfo;
@@ -1586,7 +1586,7 @@ PackageWriterImpl::_AddDirectoryChildren(Entry* entry, 
int fd, char* pathBuffer)
                        close(clonedFD);
                        throw status_t(errno);
                }
-               CObjectDeleter<DIR, int> dirCloser(dir, closedir);
+               CObjectDeleter<DIR, int, closedir> dirCloser(dir);
 
                while (dirent* entry = readdir(dir)) {
                        // skip "." and ".."
diff --git a/src/kits/package/manager/RepositoryBuilder.cpp 
b/src/kits/package/manager/RepositoryBuilder.cpp
index 26e503eaf5..dcfaec7520 100644
--- a/src/kits/package/manager/RepositoryBuilder.cpp
+++ b/src/kits/package/manager/RepositoryBuilder.cpp
@@ -210,7 +210,7 @@ BRepositoryBuilder::AddPackagesDirectory(const char* path)
        DIR* dir = opendir(path);
        if (dir == NULL)
                DIE(errno, "failed to open package directory \"%s\"", path);
-       CObjectDeleter<DIR, int> dirCloser(dir, &closedir);
+       CObjectDeleter<DIR, int, closedir> dirCloser(dir);
 
        // iterate through directory entries
        while (dirent* entry = readdir(dir)) {
diff --git a/src/kits/package/solver/libsolv/LibsolvSolver.cpp 
b/src/kits/package/solver/libsolv/LibsolvSolver.cpp
index c8bd167395..78eb11bd94 100644
--- a/src/kits/package/solver/libsolv/LibsolvSolver.cpp
+++ b/src/kits/package/solver/libsolv/LibsolvSolver.cpp
@@ -560,8 +560,8 @@ LibsolvSolver::GetResult(BSolverResult& _result)
        _result.MakeEmpty();
 
        Transaction* transaction = solver_create_transaction(fSolver);
-       CObjectDeleter<Transaction> transactionDeleter(transaction,
-               &transaction_free);
+       CObjectDeleter<Transaction, void, transaction_free>
+               transactionDeleter(transaction);
 
        if (transaction->steps.count == 0)
                return B_OK;
diff --git a/src/preferences/virtualmemory/Settings.cpp 
b/src/preferences/virtualmemory/Settings.cpp
index 3923544c07..a0b32d3450 100644
--- a/src/preferences/virtualmemory/Settings.cpp
+++ b/src/preferences/virtualmemory/Settings.cpp
@@ -139,8 +139,8 @@ Settings::ReadSwapSettings()
        void* settings = load_driver_settings(kVirtualMemorySettings);
        if (settings == NULL)
                return kErrorSettingsNotFound;
-       CObjectDeleter<void, status_t> settingDeleter(settings,
-               &unload_driver_settings);
+       CObjectDeleter<void, status_t, unload_driver_settings>
+               settingDeleter(settings);
 
        const char* enabled = get_driver_parameter(settings, "vm", NULL, NULL);
        const char* automatic = get_driver_parameter(settings, "swap_auto",
diff --git a/src/servers/registrar/AuthenticationManager.cpp 
b/src/servers/registrar/AuthenticationManager.cpp
index f8fa1072c3..fe6eee95d8 100644
--- a/src/servers/registrar/AuthenticationManager.cpp
+++ b/src/servers/registrar/AuthenticationManager.cpp
@@ -568,14 +568,14 @@ public:
                        debug_printf("REG: Failed to open passwd file \"%s\" 
for "
                                "writing: %s\n", kPasswdFile, strerror(errno));
                }
-               CObjectDeleter<FILE, int> _1(passwdFile, fclose);
+               CObjectDeleter<FILE, int, fclose> _1(passwdFile);
 
                FILE* shadowFile = fopen(kShadowPwdFile, "w");
                if (shadowFile == NULL) {
                        debug_printf("REG: Failed to open shadow passwd file 
\"%s\" for "
                                "writing: %s\n", kShadowPwdFile, 
strerror(errno));
                }
-               CObjectDeleter<FILE, int> _2(shadowFile, fclose);
+               CObjectDeleter<FILE, int, fclose> _2(shadowFile);
 
                // write users
                for (map<uid_t, User*>::const_iterator it = fUsersByID.begin();
@@ -694,7 +694,7 @@ public:
                        debug_printf("REG: Failed to open group file \"%s\" for 
"
                                "writing: %s\n", kGroupFile, strerror(errno));
                }
-               CObjectDeleter<FILE, int> _1(groupFile, fclose);
+               CObjectDeleter<FILE, int, fclose> _1(groupFile);
 
                // write groups
                for (map<gid_t, Group*>::const_iterator it = 
fGroupsByID.begin();
@@ -1245,7 +1245,7 @@ AuthenticationManager::_InitPasswdDB()
                        kPasswdFile, strerror(errno));
                return errno;
        }
-       CObjectDeleter<FILE, int> _(file, fclose);
+       CObjectDeleter<FILE, int, fclose> _(file);
 
        char lineBuffer[LINE_MAX];
        while (char* line = fgets(lineBuffer, sizeof(lineBuffer), file)) {
@@ -1294,7 +1294,7 @@ AuthenticationManager::_InitGroupDB()
                        kGroupFile, strerror(errno));
                return errno;
        }
-       CObjectDeleter<FILE, int> _(file, fclose);
+       CObjectDeleter<FILE, int, fclose> _(file);
 
        char lineBuffer[LINE_MAX];
        while (char* line = fgets(lineBuffer, sizeof(lineBuffer), file)) {
@@ -1342,7 +1342,7 @@ AuthenticationManager::_InitShadowPwdDB()
                        kShadowPwdFile, strerror(errno));
                return errno;
        }
-       CObjectDeleter<FILE, int> _(file, fclose);
+       CObjectDeleter<FILE, int, fclose> _(file);
 
        char lineBuffer[LINE_MAX];
        while (char* line = fgets(lineBuffer, sizeof(lineBuffer), file)) {
diff --git 
a/src/system/boot/loader/file_systems/packagefs/PackageSettingsItem.cpp 
b/src/system/boot/loader/file_systems/packagefs/PackageSettingsItem.cpp
index c30b8822f5..736b0729c6 100644
--- a/src/system/boot/loader/file_systems/packagefs/PackageSettingsItem.cpp
+++ b/src/system/boot/loader/file_systems/packagefs/PackageSettingsItem.cpp
@@ -54,8 +54,8 @@ PackageSettingsItem::Load(::Directory* systemDirectory, const 
char* name)
        void* settingsHandle = load_driver_settings_file(fd);
        if (settingsHandle == NULL)
                return NULL;
-       CObjectDeleter<void, status_t> settingsDeleter(settingsHandle,
-               &unload_driver_settings);
+       CObjectDeleter<void, status_t, &unload_driver_settings>
+               settingsDeleter(settingsHandle);
 
        const driver_settings* settings = get_driver_settings(settingsHandle);
        for (int i = 0; i < settings->parameter_count; i++) {
diff --git a/src/system/boot/loader/vfs.cpp b/src/system/boot/loader/vfs.cpp
index 2a57686bde..4996fd159f 100644
--- a/src/system/boot/loader/vfs.cpp
+++ b/src/system/boot/loader/vfs.cpp
@@ -576,8 +576,8 @@ BootVolume::_OpenSystemPackage()
        Node* packagesNode = fSystemDirectory->Lookup("packages", false);
        if (packagesNode == NULL)
                return -1;
-       MethodDeleter<Node, status_t> packagesNodeReleaser(packagesNode,
-               &Node::Release);
+       MethodDeleter<Node, status_t, &Node::Release>
+               packagesNodeReleaser(packagesNode);
 
        if (!S_ISDIR(packagesNode->Type()))
                return -1;
@@ -1172,7 +1172,7 @@ open_directory(Directory* baseDirectory, const char* path)
                errno = error;
                return NULL;
        }
-       MethodDeleter<Node, status_t> nodeReleaser(node, &Node::Release);
+       MethodDeleter<Node, status_t, &Node::Release> nodeReleaser(node);
 
        if (!S_ISDIR(node->Type())) {
                errno = error;
diff --git a/src/system/kernel/arch/x86/ioapic.cpp 
b/src/system/kernel/arch/x86/ioapic.cpp
index 45212cfca4..5e1edb1d70 100644
--- a/src/system/kernel/arch/x86/ioapic.cpp
+++ b/src/system/kernel/arch/x86/ioapic.cpp
@@ -706,8 +706,8 @@ ioapic_init(kernel_args* args)
                dprintf("acpi module not available, not configuring 
io-apics\n");
                return;
        }
-       BPrivate::CObjectDeleter<const char, status_t>
-               acpiModulePutter(B_ACPI_MODULE_NAME, put_module);
+       BPrivate::CObjectDeleter<const char, status_t, put_module>
+               acpiModulePutter(B_ACPI_MODULE_NAME);
 
        acpi_table_madt* madt = NULL;
        if (acpiModule->get_table(ACPI_SIG_MADT, 0, (void**)&madt) != B_OK) {
diff --git a/src/system/kernel/device_manager/device_manager.cpp 
b/src/system/kernel/device_manager/device_manager.cpp
index e8bb4c2eec..9b87496f09 100644
--- a/src/system/kernel/device_manager/device_manager.cpp
+++ b/src/system/kernel/device_manager/device_manager.cpp
@@ -767,7 +767,8 @@ unpublish_device(device_node *node, const char *path)
        status_t error = devfs_get_device(path, baseDevice);
        if (error != B_OK)
                return error;
-       CObjectDeleter<BaseDevice> baseDevicePutter(baseDevice, 
&devfs_put_device);
+       CObjectDeleter<BaseDevice, void, devfs_put_device>
+               baseDevicePutter(baseDevice);
 
        Device* device = dynamic_cast<Device*>(baseDevice);
        if (device == NULL || device->Node() != node)
diff --git a/src/system/kernel/fs/fd.cpp b/src/system/kernel/fs/fd.cpp
index 607d416ba0..90f267244a 100644
--- a/src/system/kernel/fs/fd.cpp
+++ b/src/system/kernel/fs/fd.cpp
@@ -497,7 +497,7 @@ dup_foreign_fd(team_id fromTeam, int fd, bool kernel)
        file_descriptor* descriptor = get_fd(fromContext, fd);
        if (descriptor == NULL)
                return B_FILE_ERROR;
-       CObjectDeleter<file_descriptor> descriptorPutter(descriptor, put_fd);
+       CObjectDeleter<file_descriptor, void, put_fd> 
descriptorPutter(descriptor);
 
        // create a new FD in the target I/O context
        int result = new_fd(get_current_io_context(kernel), descriptor);
diff --git a/src/system/kernel/fs/vfs_request_io.cpp 
b/src/system/kernel/fs/vfs_request_io.cpp
index ffd05a75c2..2d79d80d9e 100644
--- a/src/system/kernel/fs/vfs_request_io.cpp
+++ b/src/system/kernel/fs/vfs_request_io.cpp
@@ -478,7 +478,7 @@ do_fd_io(int fd, io_request* request)
                return B_FILE_ERROR;
        }
 
-       CObjectDeleter<file_descriptor> descriptorPutter(descriptor, put_fd);
+       CObjectDeleter<file_descriptor, void, put_fd> 
descriptorPutter(descriptor);
 
        return vfs_vnode_io(vnode, descriptor->cookie, request);
 }
@@ -500,7 +500,7 @@ do_iterative_fd_io(int fd, io_request* request, 
iterative_io_get_vecs getVecs,
                return B_FILE_ERROR;
        }
 
-       CObjectDeleter<file_descriptor> descriptorPutter(descriptor, put_fd);
+       CObjectDeleter<file_descriptor, void, put_fd> 
descriptorPutter(descriptor);
 
        if (!HAS_FS_CALL(vnode, io)) {
                // no io() call -- fall back to synchronous I/O
diff --git a/src/system/kernel/team.cpp b/src/system/kernel/team.cpp
index e791a27c30..f3e85edc1d 100644
--- a/src/system/kernel/team.cpp
+++ b/src/system/kernel/team.cpp
@@ -4426,8 +4426,8 @@ _user_get_extended_team_info(team_id teamID, uint32 
flags, void* buffer,
                        ioContext = team->io_context;
                        vfs_get_io_context(ioContext);
                }
-               CObjectDeleter<io_context> ioContextPutter(ioContext,
-                       &vfs_put_io_context);
+               CObjectDeleter<io_context, void, vfs_put_io_context>
+                       ioContextPutter(ioContext);
 
                // add the basic data to the info message
                if (info.AddInt32("id", teamClone.id) != B_OK
diff --git a/src/system/kernel/vm/vm.cpp b/src/system/kernel/vm/vm.cpp
index 4bdea39e3e..4d61a272b1 100644
--- a/src/system/kernel/vm/vm.cpp
+++ b/src/system/kernel/vm/vm.cpp
@@ -2054,7 +2054,7 @@ _vm_map_file(team_id team, const char* name, void** 
_address,
        status_t status = vfs_get_vnode_from_fd(fd, kernel, &vnode);
        if (status < B_OK)
                return status;
-       CObjectDeleter<struct vnode> vnodePutter(vnode, vfs_put_vnode);
+       CObjectDeleter<struct vnode, void, vfs_put_vnode> vnodePutter(vnode);
 
        // If we're going to pre-map pages, we need to reserve the pages needed 
by
        // the mapping backend upfront.
diff --git a/src/tools/hvif2png/hvif2png.cpp b/src/tools/hvif2png/hvif2png.cpp
index 18f5cccbdd..4f0f7779b7 100644
--- a/src/tools/hvif2png/hvif2png.cpp
+++ b/src/tools/hvif2png/hvif2png.cpp
@@ -92,7 +92,7 @@ h2p_close_state(h2p_state* state)
 static bool
 h2p_open_streams(h2p_state* state)
 {
-       CObjectDeleter<h2p_state> stateCloser(state, &h2p_close_state);
+       CObjectDeleter<h2p_state, void, &h2p_close_state> stateCloser(state);
 
        if (state->params.in_filename != NULL)
                state->in = fopen(state->params.in_filename, "rb");

############################################################################

Revision:    hrev54773
Commit:      6467297a1b2e6aed10add9aadae941d66d3451fe
URL:         https://git.haiku-os.org/haiku/commit/?id=6467297a1b2e
Author:      X512 <danger_mail@xxxxxxx>
Date:        Fri Dec  4 15:29:35 2020 UTC
Committer:   Adrien Destugues <pulkomandy@xxxxxxxxx>
Commit-Date: Thu Dec 10 11:39:49 2020 UTC

simplify AutoDeleter code by using typedef

Change-Id: I726c3aee794b91ed51970853db3921d17a5f795e
Reviewed-on: https://review.haiku-os.org/c/haiku/+/3462
Reviewed-by: Adrien Destugues <pulkomandy@xxxxxxxxx>

----------------------------------------------------------------------------

diff --git a/src/add-ons/kernel/file_systems/bindfs/Utils.h 
b/src/add-ons/kernel/file_systems/bindfs/Utils.h
index aaf71a3ff0..bff927bd5e 100644
--- a/src/add-ons/kernel/file_systems/bindfs/Utils.h
+++ b/src/add-ons/kernel/file_systems/bindfs/Utils.h
@@ -11,24 +11,7 @@
 #include <vfs.h>
 
 
-using BPrivate::AutoDeleter;
-
-
-struct VnodePut
-{
-       inline void operator()(vnode* _vnode)
-       {
-               if (_vnode != NULL)
-                       vfs_put_vnode(_vnode);
-       }
-};
-
-struct VnodePutter : AutoDeleter<vnode, VnodePut>
-{
-       VnodePutter() : AutoDeleter<vnode, VnodePut>() {}
-
-       VnodePutter(vnode* _vnode) : AutoDeleter<vnode, VnodePut>(_vnode) {}
-};
+typedef CObjectDeleter<vnode, void, vfs_put_vnode> VnodePutter;
 
 
 #endif // UTILS_H
diff --git a/src/system/boot/loader/file_systems/tarfs/tarfs.cpp 
b/src/system/boot/loader/file_systems/tarfs/tarfs.cpp
index 552d8003b6..2adc5cf25b 100644
--- a/src/system/boot/loader/file_systems/tarfs/tarfs.cpp
+++ b/src/system/boot/loader/file_systems/tarfs/tarfs.cpp
@@ -52,19 +52,7 @@ struct RegionDelete {
        }
 };
 
-struct RegionDeleter : BPrivate::AutoDeleter<void, RegionDelete> {
-       RegionDeleter()
-               :
-               BPrivate::AutoDeleter<void, RegionDelete>()
-       {
-       }
-
-       RegionDeleter(void* memory)
-               :
-               BPrivate::AutoDeleter<void, RegionDelete>(memory)
-       {
-       }
-};
+typedef BPrivate::AutoDeleter<void, RegionDelete> RegionDeleter;
 
 class Directory;
 



Other related posts:

  • » [haiku-commits] haiku: hrev54773 - headers/private/shared src src/add-ons/kernel/file_systems/packagefs/volume src/system/libroot/os src/system/kernel - Adrien Destugues