diff options
author | maximius <none@none> | 2009-10-17 15:51:44 -0700 |
---|---|---|
committer | maximius <none@none> | 2009-10-17 15:51:44 -0700 |
commit | e585187b248f48b3c6e9247b49fa07c6565d65e5 (patch) | |
tree | 637c5b7ddacf41040bef4ea4f75a97da64c6a9bc /src/framework/Policies | |
parent | 26b5e033ffde3d161382fc9addbfa99738379641 (diff) |
*Backed out changeset 3be01fb200a5
--HG--
branch : trunk
Diffstat (limited to 'src/framework/Policies')
-rw-r--r-- | src/framework/Policies/CreationPolicy.h | 9 | ||||
-rw-r--r-- | src/framework/Policies/ObjectLifeTime.cpp | 3 | ||||
-rw-r--r-- | src/framework/Policies/ObjectLifeTime.h | 8 | ||||
-rw-r--r-- | src/framework/Policies/Singleton.h | 9 | ||||
-rw-r--r-- | src/framework/Policies/SingletonImp.h | 10 | ||||
-rw-r--r-- | src/framework/Policies/ThreadingModel.h | 23 |
6 files changed, 62 insertions, 0 deletions
diff --git a/src/framework/Policies/CreationPolicy.h b/src/framework/Policies/CreationPolicy.h index 9bca121b632..91bec9eab37 100644 --- a/src/framework/Policies/CreationPolicy.h +++ b/src/framework/Policies/CreationPolicy.h @@ -17,10 +17,13 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + #ifndef TRINITY_CREATIONPOLICY_H #define TRINITY_CREATIONPOLICY_H + #include <stdlib.h> #include "Platform/Define.h" + namespace Trinity { /** @@ -33,6 +36,7 @@ namespace Trinity static T* Create(void) { return (new T); } static void Destroy(T *obj) { delete obj; } }; + /** * LocalStaticCreation policy creates an object on the stack * the first time call Create. @@ -59,8 +63,10 @@ namespace Trinity static MaxAlign si_localStatic; return new(&si_localStatic) T; } + static void Destroy(T *obj) { obj->~T(); } }; + /** * CreateUsingMalloc by pass the memory manger. */ @@ -74,12 +80,14 @@ namespace Trinity if (!p) return 0; return new(p) T; } + static void Destroy(T* p) { p->~T(); ::free(p); } }; + /** * CreateOnCallBack creates the object base on the call back. */ @@ -91,6 +99,7 @@ namespace Trinity { return CALL_BACK::createCallBack(); } + static void Destroy(T *p) { CALL_BACK::destroyCallBack(p); diff --git a/src/framework/Policies/ObjectLifeTime.cpp b/src/framework/Policies/ObjectLifeTime.cpp index d86e96a8e87..852e382a0e9 100644 --- a/src/framework/Policies/ObjectLifeTime.cpp +++ b/src/framework/Policies/ObjectLifeTime.cpp @@ -17,14 +17,17 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + #include <cstdlib> #include "ObjectLifeTime.h" + namespace Trinity { extern "C" void external_wrapper(void *p) { std::atexit( (void (*)())p ); } + void TRINITY_DLL_SPEC at_exit( void (*func)() ) { external_wrapper((void*)func); diff --git a/src/framework/Policies/ObjectLifeTime.h b/src/framework/Policies/ObjectLifeTime.h index 51765d4d4b4..86303f889fb 100644 --- a/src/framework/Policies/ObjectLifeTime.h +++ b/src/framework/Policies/ObjectLifeTime.h @@ -17,14 +17,19 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + #ifndef TRINITY_OBJECTLIFETIME_H #define TRINITY_OBJECTLIFETIME_H + #include <stdexcept> #include "Platform/Define.h" + typedef void (* Destroyer)(void); + namespace Trinity { void TRINITY_DLL_SPEC at_exit( void (*func)() ); + template <class T> class TRINITY_DLL_DECL ObjectLifeTime { @@ -33,8 +38,11 @@ namespace Trinity { at_exit( destroyer ); } + DECLSPEC_NORETURN static void OnDeadReference(void) ATTR_NORETURN; + }; + template <class T> void ObjectLifeTime<T>::OnDeadReference(void) // We don't handle Dead Reference for now { diff --git a/src/framework/Policies/Singleton.h b/src/framework/Policies/Singleton.h index d8d4fd4df20..66daaba5a9a 100644 --- a/src/framework/Policies/Singleton.h +++ b/src/framework/Policies/Singleton.h @@ -17,14 +17,18 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + #ifndef TRINITY_SINGLETON_H #define TRINITY_SINGLETON_H + /** * @brief class Singleton */ + #include "CreationPolicy.h" #include "ThreadingModel.h" #include "ObjectLifeTime.h" + namespace Trinity { template @@ -38,14 +42,19 @@ namespace Trinity { public: static T& Instance(); + protected: Singleton() {}; + private: + // Prohibited actions...this does not prevent hijacking. Singleton(const Singleton &); Singleton& operator=(const Singleton &); + // Singleton Helpers static void DestroySingleton(); + // data structure typedef typename ThreadingModel::Lock Guard; static T *si_instance; diff --git a/src/framework/Policies/SingletonImp.h b/src/framework/Policies/SingletonImp.h index 44f2d184410..89a4738ae22 100644 --- a/src/framework/Policies/SingletonImp.h +++ b/src/framework/Policies/SingletonImp.h @@ -17,11 +17,15 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + #ifndef TRINITY_SINGLETONIMPL_H #define TRINITY_SINGLETONIMPL_H + #include "Singleton.h" + // avoid the using namespace here cuz // its a .h file afterall + template < typename T, @@ -47,8 +51,10 @@ Trinity::Singleton<T, ThreadingModel, CreatePolicy, LifeTimePolicy >::Instance() LifeTimePolicy::ScheduleCall(&DestroySingleton); } } + return *si_instance; } + template < typename T, @@ -63,18 +69,22 @@ Trinity::Singleton<T, ThreadingModel, CreatePolicy, LifeTimePolicy>::DestroySing si_instance = NULL; si_destroyed = true; } + #define INSTANTIATE_SINGLETON_1(TYPE) \ template class TRINITY_DLL_DECL Trinity::Singleton<TYPE, Trinity::SingleThreaded<TYPE>, Trinity::OperatorNew<TYPE>, Trinity::ObjectLifeTime<TYPE> >; \ template<> TYPE* Trinity::Singleton<TYPE, Trinity::SingleThreaded<TYPE>, Trinity::OperatorNew<TYPE>, Trinity::ObjectLifeTime<TYPE> >::si_instance = 0; \ template<> bool Trinity::Singleton<TYPE, Trinity::SingleThreaded<TYPE>, Trinity::OperatorNew<TYPE>, Trinity::ObjectLifeTime<TYPE> >::si_destroyed = false + #define INSTANTIATE_SINGLETON_2(TYPE, THREADINGMODEL) \ template class TRINITY_DLL_DECL Trinity::Singleton<TYPE, THREADINGMODEL, Trinity::OperatorNew<TYPE>, Trinity::ObjectLifeTime<TYPE> >; \ template<> TYPE* Trinity::Singleton<TYPE, THREADINGMODEL, Trinity::OperatorNew<TYPE>, Trinity::ObjectLifeTime<TYPE> >::si_instance = 0; \ template<> bool Trinity::Singleton<TYPE, THREADINGMODEL, Trinity::OperatorNew<TYPE>, Trinity::ObjectLifeTime<TYPE> >::si_destroyed = false + #define INSTANTIATE_SINGLETON_3(TYPE, THREADINGMODEL, CREATIONPOLICY ) \ template class TRINITY_DLL_DECL Trinity::Singleton<TYPE, THREADINGMODEL, CREATIONPOLICY, Trinity::ObjectLifeTime<TYPE> >; \ template<> TYPE* Trinity::Singleton<TYPE, THREADINGMODEL, CREATIONPOLICY, Trinity::ObjectLifeTime<TYPE> >::si_instance = 0; \ template<> bool Trinity::Singleton<TYPE, THREADINGMODEL, CREATIONPOLICY, Trinity::ObjectLifeType<TYPE> >::si_destroyed = false + #define INSTANTIATE_SINGLETON_4(TYPE, THREADINGMODEL, CREATIONPOLICY, OBJECTLIFETIME) \ template class TRINITY_DLL_DECL Trinity::Singleton<TYPE, THREADINGMODEL, CREATIONPOLICY, OBJECTLIFETIME >; \ template<> TYPE* Trinity::Singleton<TYPE, THREADINGMODEL, CREATIONPOLICY, OBJECTLIFETIME >::si_instance = 0; \ diff --git a/src/framework/Policies/ThreadingModel.h b/src/framework/Policies/ThreadingModel.h index 3e0593789b5..a380fe78323 100644 --- a/src/framework/Policies/ThreadingModel.h +++ b/src/framework/Policies/ThreadingModel.h @@ -17,16 +17,21 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + #ifndef TRINITY_THREADINGMODEL_H #define TRINITY_THREADINGMODEL_H + /** * @class ThreadingModel<T> * */ + #include "Platform/Define.h" + namespace Trinity { inline void Guard(void *) {} + template<typename MUTEX> class TRINITY_DLL_DECL GeneralLock { public: @@ -34,6 +39,7 @@ namespace Trinity { i_mutex.acquire(); } + ~GeneralLock() { i_mutex.release(); @@ -43,10 +49,12 @@ namespace Trinity GeneralLock& operator=(const GeneralLock &); MUTEX &i_mutex; }; + template <class T> class TRINITY_DLL_DECL SingleThreaded { public: + struct Lock // empty object { Lock() {} @@ -55,31 +63,40 @@ namespace Trinity { } }; + typedef T VolatileType; }; + // object level lockable template<class T, class MUTEX> class TRINITY_DLL_DECL ObjectLevelLockable { public: ObjectLevelLockable() : i_mtx() {} + friend class Lock; + class Lock { public: Lock(ObjectLevelLockable<T, MUTEX> &host) : i_lock(host.i_mtx) { } + private: GeneralLock<MUTEX> i_lock; }; + typedef volatile T VolatileType; + private: // prevent the compiler creating a copy construct ObjectLevelLockable(const ObjectLevelLockable<T, MUTEX> &); ObjectLevelLockable<T, MUTEX>& operator=(const ObjectLevelLockable<T, MUTEX> &); + MUTEX i_mtx; }; + template<class T, class MUTEX> class TRINITY_DLL_DECL ClassLevelLockable { @@ -87,7 +104,9 @@ namespace Trinity class Lock; friend class Lock; typedef volatile T VolatileType; + ClassLevelLockable() {} + class Lock { public: @@ -96,11 +115,15 @@ namespace Trinity Lock() { ClassLevelLockable<T, MUTEX>::si_mtx.acquire(); } ~Lock() { ClassLevelLockable<T, MUTEX>::si_mtx.release(); } }; + private: static MUTEX si_mtx; }; + } + template<class T, class MUTEX> MUTEX Trinity::ClassLevelLockable<T, MUTEX>::si_mtx; + #define INSTANTIATE_CLASS_MUTEX(CTYPE,MUTEX) \ template class TRINITY_DLL_DECL Trinity::ClassLevelLockable<CTYPE, MUTEX > #endif |