diff --git a/headers/private/shared/Referenceable.h b/headers/private/shared/Referenceable.h index f020d7e163..e1f0a6edcd 100644 --- a/headers/private/shared/Referenceable.h +++ b/headers/private/shared/Referenceable.h @@ -17,9 +17,10 @@ public: BReferenceable(); virtual ~BReferenceable(); + // acquire and release return + // the previous ref count int32 AcquireReference(); - bool ReleaseReference(); - // returns true after last + int32 ReleaseReference(); int32 CountReferences() const { return fReferenceCount; } diff --git a/src/add-ons/kernel/file_systems/netfs/server/ClientConnection.cpp b/src/add-ons/kernel/file_systems/netfs/server/ClientConnection.cpp index 8a73ad9898..8e2bd1d975 100644 --- a/src/add-ons/kernel/file_systems/netfs/server/ClientConnection.cpp +++ b/src/add-ons/kernel/file_systems/netfs/server/ClientConnection.cpp @@ -2789,7 +2789,7 @@ ClientConnection::_PutVolume(ClientVolume* volume) // decrement reference counter and remove the volume, if 0 AutoLocker locker(fVolumes); - bool removed = (volume->ReleaseReference() && volume->IsRemoved()); + bool removed = (volume->ReleaseReference() == 1 && volume->IsRemoved()); if (removed) fVolumes->Remove(volume->GetID()); locker.Unlock(); diff --git a/src/add-ons/kernel/file_systems/netfs/shared/NetAddress.cpp b/src/add-ons/kernel/file_systems/netfs/shared/NetAddress.cpp index 90d1f291ab..33d8d53d1b 100644 --- a/src/add-ons/kernel/file_systems/netfs/shared/NetAddress.cpp +++ b/src/add-ons/kernel/file_systems/netfs/shared/NetAddress.cpp @@ -253,7 +253,7 @@ NetAddressResolver::~NetAddressResolver() { if (fResolver) { _Lock(); - if (sResolver->ReleaseReference()) { + if (sResolver->ReleaseReference() == 1) { delete sResolver; sResolver = NULL; } diff --git a/src/kits/support/Referenceable.cpp b/src/kits/support/Referenceable.cpp index 39906255ae..badfd2d424 100644 --- a/src/kits/support/Referenceable.cpp +++ b/src/kits/support/Referenceable.cpp @@ -41,14 +41,14 @@ BReferenceable::AcquireReference() } -bool +int32 BReferenceable::ReleaseReference() { - bool unreferenced = (atomic_add(&fReferenceCount, -1) == 1); + int32 previousReferenceCount = atomic_add(&fReferenceCount, -1); TRACE("%p: release %ld\n", this, fReferenceCount); - if (unreferenced) + if (previousReferenceCount == 1) LastReferenceReleased(); - return unreferenced; + return previousReferenceCount; }