diff --git a/Sources/Plasma/CoreLib/CMakeLists.txt b/Sources/Plasma/CoreLib/CMakeLists.txt index cea36c49..d2f65fb5 100644 --- a/Sources/Plasma/CoreLib/CMakeLists.txt +++ b/Sources/Plasma/CoreLib/CMakeLists.txt @@ -43,7 +43,6 @@ set(CoreLib_SOURCES hsMemory.cpp hsQuat.cpp hsRefCnt.cpp - hsSafeRefCnt.cpp hsSTLStream.cpp hsStream.cpp hsStringTokenizer.cpp @@ -88,7 +87,6 @@ set(CoreLib_HEADERS hsPoint2.h hsQuat.h hsRefCnt.h - hsSafeRefCnt.h hsSTLStream.h hsStream.h hsStringTokenizer.h diff --git a/Sources/Plasma/CoreLib/hsRefCnt.cpp b/Sources/Plasma/CoreLib/hsRefCnt.cpp index 7f9a0d86..e2226cb9 100644 --- a/Sources/Plasma/CoreLib/hsRefCnt.cpp +++ b/Sources/Plasma/CoreLib/hsRefCnt.cpp @@ -48,17 +48,35 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com hsRefCnt::~hsRefCnt() { - hsDebugCode(hsThrowIfFalse(fRefCnt == 1);) +#ifdef HS_DEBUGGING + hsThrowIfFalse(fRefCnt == 1); +#endif } -void hsRefCnt::Ref() +void hsRefCnt::UnRef() +{ +#ifdef HS_DEBUGGING + hsThrowIfFalse(fRefCnt >= 1); +#endif + + if (fRefCnt == 1) // don't decrement if we call delete + delete this; + else + --fRefCnt; +} + +hsSafeRefCnt::~hsSafeRefCnt() { - fRefCnt++; +#ifdef HS_DEBUGGING + hsThrowIfFalse(fRefCnt == 1); +#endif } -void hsRefCnt::UnRef() +void hsSafeRefCnt::UnRef() { - hsDebugCode(hsThrowIfFalse(fRefCnt >= 1);) +#ifdef HS_DEBUGGING + hsThrowIfFalse(fRefCnt >= 1); +#endif if (fRefCnt == 1) // don't decrement if we call delete delete this; diff --git a/Sources/Plasma/CoreLib/hsRefCnt.h b/Sources/Plasma/CoreLib/hsRefCnt.h index 822863b9..97bc5315 100644 --- a/Sources/Plasma/CoreLib/hsRefCnt.h +++ b/Sources/Plasma/CoreLib/hsRefCnt.h @@ -42,6 +42,8 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com #ifndef hsRefCnt_Defiend #define hsRefCnt_Defiend +#include + class hsRefCnt { private: int fRefCnt; @@ -49,9 +51,9 @@ public: hsRefCnt() : fRefCnt(1) {} virtual ~hsRefCnt(); - virtual int RefCnt() const { return fRefCnt; } - virtual void UnRef(); - virtual void Ref(); + inline int RefCnt() const { return fRefCnt; } + void UnRef(); + inline void Ref() { ++fRefCnt; } }; #define hsRefCnt_SafeRef(obj) do { if (obj) (obj)->Ref(); } while (0) @@ -64,4 +66,21 @@ public: dst = src; \ } while (0) + +// Thread-safe version. TODO: Evaluate whether this is fast enough to +// merge with hsRefCnt above. +class hsSafeRefCnt +{ +private: + std::atomic fRefCnt; + +public: + hsSafeRefCnt() : fRefCnt(1) { } + virtual ~hsSafeRefCnt(); + + inline int RefCnt() const { return fRefCnt; } + void UnRef(); + inline void Ref() { ++fRefCnt; } +}; + #endif diff --git a/Sources/Plasma/CoreLib/hsSafeRefCnt.cpp b/Sources/Plasma/CoreLib/hsSafeRefCnt.cpp deleted file mode 100644 index c5395a0a..00000000 --- a/Sources/Plasma/CoreLib/hsSafeRefCnt.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/*==LICENSE==* - -CyanWorlds.com Engine - MMOG client, server and tools -Copyright (C) 2011 Cyan Worlds, Inc. - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . - -Additional permissions under GNU GPL version 3 section 7 - -If you modify this Program, or any covered work, by linking or -combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, -NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent -JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK -(or a modified version of those libraries), -containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, -PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG -JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the -licensors of this Program grant you additional -permission to convey the resulting work. Corresponding Source for a -non-source form of such a combination shall include the source code for -the parts of OpenSSL and IJG JPEG Library used as well as that of the covered -work. - -You can contact Cyan Worlds, Inc. by email legal@cyan.com - or by snail mail at: - Cyan Worlds, Inc. - 14617 N Newport Hwy - Mead, WA 99021 - -*==LICENSE==*/ -#include "hsSafeRefCnt.h" - -hsMutex hsSafeRefCnt::fMutex; diff --git a/Sources/Plasma/CoreLib/hsSafeRefCnt.h b/Sources/Plasma/CoreLib/hsSafeRefCnt.h deleted file mode 100644 index a772a70a..00000000 --- a/Sources/Plasma/CoreLib/hsSafeRefCnt.h +++ /dev/null @@ -1,65 +0,0 @@ -/*==LICENSE==* - -CyanWorlds.com Engine - MMOG client, server and tools -Copyright (C) 2011 Cyan Worlds, Inc. - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . - -Additional permissions under GNU GPL version 3 section 7 - -If you modify this Program, or any covered work, by linking or -combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, -NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent -JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK -(or a modified version of those libraries), -containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, -PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG -JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the -licensors of this Program grant you additional -permission to convey the resulting work. Corresponding Source for a -non-source form of such a combination shall include the source code for -the parts of OpenSSL and IJG JPEG Library used as well as that of the covered -work. - -You can contact Cyan Worlds, Inc. by email legal@cyan.com - or by snail mail at: - Cyan Worlds, Inc. - 14617 N Newport Hwy - Mead, WA 99021 - -*==LICENSE==*/ -#ifndef HS_SAFE_REF_CNT_H -#define HS_SAFE_REF_CNT_H - -#include "hsRefCnt.h" -#include "hsThread.h" - -// -// Thread Safe RefCounter -// - -class hsSafeRefCnt : public hsRefCnt -{ -private: - static hsMutex fMutex; -protected: - virtual void IRef() { } - virtual void IUnRef() { }; -public: - virtual int RefCnt() const { hsTempMutexLock temp(fMutex); return hsRefCnt::RefCnt(); } - void UnRef() { hsTempMutexLock temp(fMutex); IUnRef(); hsRefCnt::UnRef(); } - void Ref() { hsTempMutexLock temp(fMutex); IRef(); hsRefCnt::Ref(); } -}; - -#endif //HS_SAFE_REF_CNT_H diff --git a/Sources/Plasma/PubUtilLib/plNetMessage/plNetCommonMessage.h b/Sources/Plasma/PubUtilLib/plNetMessage/plNetCommonMessage.h index 5b2b7b71..44b6798e 100644 --- a/Sources/Plasma/PubUtilLib/plNetMessage/plNetCommonMessage.h +++ b/Sources/Plasma/PubUtilLib/plNetMessage/plNetCommonMessage.h @@ -43,7 +43,7 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com #define plNetCommonMessage_inc #include "HeadSpin.h" -#include "hsSafeRefCnt.h" +#include "hsRefCnt.h" // // refcntable data