From 28a650e94d4a50a8fd84416cb4d37971cd81b6c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Tue, 7 Apr 2009 15:14:15 +0000 Subject: [PATCH] * Made the WeakReferenceable class templatized. Not really sure yet I like that better, though :-) * Also fixed a mixup of the unintuitive argument order of our atomic_test_and_set(); I guess I will change that sooner or later. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29994 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/shared/WeakReferenceable.h | 103 +++++++++++++++------ src/kits/support/Jamfile | 1 - src/kits/support/WeakReferenceable.cpp | 13 --- src/system/kernel/lib/Jamfile | 1 - 4 files changed, 75 insertions(+), 43 deletions(-) delete mode 100644 src/kits/support/WeakReferenceable.cpp diff --git a/headers/private/shared/WeakReferenceable.h b/headers/private/shared/WeakReferenceable.h index 2cd42f5287..9e0bf358a9 100644 --- a/headers/private/shared/WeakReferenceable.h +++ b/headers/private/shared/WeakReferenceable.h @@ -11,19 +11,20 @@ namespace BPrivate { -class WeakReferenceable; +template class WeakReferenceable; +template class WeakPointer : public Referenceable { public: - WeakReferenceable* Get(); + Type* Get(); bool Put(); int32 UseCount() const; private: - friend class WeakReferenceable; + friend class WeakReferenceable; - WeakPointer(WeakReferenceable* object); + WeakPointer(Type* object); ~WeakPointer(); private: @@ -31,13 +32,14 @@ private: private: vint32 fUseCount; - WeakReferenceable* fObject; + Type* fObject; }; +template class WeakReferenceable { public: - WeakReferenceable(); - virtual ~WeakReferenceable(); + WeakReferenceable(Type* object); + ~WeakReferenceable(); void AddReference() { fPointer->_GetUnchecked(); } @@ -48,13 +50,13 @@ public: int32 CountReferences() const { return fPointer->UseCount(); } - WeakPointer* GetWeakPointer(); + WeakPointer* GetWeakPointer(); protected: - WeakPointer* fPointer; + WeakPointer* fPointer; }; -template +template class WeakReference { public: WeakReference() @@ -72,7 +74,7 @@ public: SetTo(object); } - WeakReference(const WeakPointer& other) + WeakReference(WeakPointer& other) : fPointer(NULL), fObject(NULL) @@ -80,6 +82,14 @@ public: SetTo(&other); } + WeakReference(WeakPointer* other) + : + fPointer(NULL), + fObject(NULL) + { + SetTo(other); + } + WeakReference(const WeakReference& other) : fPointer(NULL), @@ -103,12 +113,13 @@ public: } } - void SetTo(WeakPointer* pointer) + void SetTo(WeakPointer* pointer) { Unset(); if (pointer != NULL) { - fPointer = pointer->AddReference(); + fPointer = pointer; + fPointer->AddReference(); fObject = pointer->Get(); } } @@ -142,6 +153,11 @@ public: return *fObject; } + operator Type*() const + { + return fObject; + } + Type* operator->() const { return fObject; @@ -149,6 +165,9 @@ public: WeakReference& operator=(const WeakReference& other) { + if (this == &other) + return *this; + SetTo(other.fPointer); return *this; } @@ -159,6 +178,18 @@ public: return *this; } + WeakReference& operator=(WeakPointer& other) + { + SetTo(&other); + return *this; + } + + WeakReference& operator=(WeakPointer* other) + { + SetTo(other); + return *this; + } + bool operator==(const WeakReference& other) const { return fPointer == other.fPointer; @@ -170,7 +201,7 @@ public: } private: - WeakPointer* fPointer; + WeakPointer* fPointer; Type* fObject; }; @@ -178,23 +209,25 @@ private: // #pragma mark - -inline WeakReferenceable* -WeakPointer::Get() +template +inline Type* +WeakPointer::Get() { - int32 count; + int32 count = -11; do { - count = fUseCount; + count = atomic_get(&fUseCount); if (count == 0) return NULL; - } while (atomic_test_and_set(&fUseCount, count, count + 1) != count); + } while (atomic_test_and_set(&fUseCount, count + 1, count) != count); return fObject; } +template inline bool -WeakPointer::Put() +WeakPointer::Put() { if (atomic_add(&fUseCount, -1) == 1) { delete fObject; @@ -205,15 +238,17 @@ WeakPointer::Put() } +template inline int32 -WeakPointer::UseCount() const +WeakPointer::UseCount() const { return fUseCount; } +template inline -WeakPointer::WeakPointer(WeakReferenceable* object) +WeakPointer::WeakPointer(Type* object) : fUseCount(1), fObject(object) @@ -221,14 +256,16 @@ WeakPointer::WeakPointer(WeakReferenceable* object) } +template inline -WeakPointer::~WeakPointer() +WeakPointer::~WeakPointer() { } +template inline bool -WeakPointer::_GetUnchecked() +WeakPointer::_GetUnchecked() { return atomic_add(&fUseCount, 1) == 1; } @@ -237,16 +274,26 @@ WeakPointer::_GetUnchecked() // #pragma - +template inline -WeakReferenceable::WeakReferenceable() +WeakReferenceable::WeakReferenceable(Type* object) : - fPointer(new WeakPointer(this)) + fPointer(new WeakPointer(object)) { } -inline WeakPointer* -WeakReferenceable::GetWeakPointer() +template +inline +WeakReferenceable::~WeakReferenceable() +{ + fPointer->RemoveReference(); +} + + +template +inline WeakPointer* +WeakReferenceable::GetWeakPointer() { fPointer->AddReference(); return fPointer; diff --git a/src/kits/support/Jamfile b/src/kits/support/Jamfile index d84418203d..31126dde36 100644 --- a/src/kits/support/Jamfile +++ b/src/kits/support/Jamfile @@ -18,5 +18,4 @@ MergeObject support_kit.o : Referenceable.cpp StopWatch.cpp String.cpp - WeakReferenceable.cpp ; diff --git a/src/kits/support/WeakReferenceable.cpp b/src/kits/support/WeakReferenceable.cpp deleted file mode 100644 index 85a508c3ba..0000000000 --- a/src/kits/support/WeakReferenceable.cpp +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright 2009, Axel Dörfler, axeld@pinc-software.de. - * Distributed under the terms of the MIT License. - */ - - -#include - - -WeakReferenceable::~WeakReferenceable() -{ -} - diff --git a/src/system/kernel/lib/Jamfile b/src/system/kernel/lib/Jamfile index 4eae750831..c4cf4c1efc 100644 --- a/src/system/kernel/lib/Jamfile +++ b/src/system/kernel/lib/Jamfile @@ -120,7 +120,6 @@ SEARCH_SOURCE = [ FDirName $(HAIKU_TOP) src kits support ] ; KernelMergeObject kernel_misc.o : Referenceable.cpp - WeakReferenceable.cpp : $(TARGET_KERNEL_PIC_CCFLAGS) ;