version 0.1.3
[fms.git] / include / pthreadwrapper / singleton.h
1 #ifndef _pthread_singleton_\r
2 #define _pthread_singleton_\r
3 \r
4 #include "noncopyable.h"\r
5 #include "guard.h"\r
6 \r
7 #include <cassert>\r
8 \r
9 namespace PThread\r
10 {\r
11 \r
12 //! SingletonDestroyer\r
13 template <class T>\r
14 class Destroyer {\r
15   \r
16   T* doomed;\r
17   \r
18  public:\r
19   \r
20   Destroyer(T* q) : doomed(q) {\r
21     assert(doomed);\r
22   }\r
23   \r
24   ~Destroyer();\r
25 \r
26 };\r
27 \r
28 template <class T>\r
29 Destroyer<T>::~Destroyer() {\r
30   \r
31   try {\r
32     \r
33     if(doomed)\r
34       delete doomed;\r
35     \r
36   } catch(...) { }\r
37   \r
38   doomed = 0;\r
39   \r
40 }   \r
41 \r
42 template <class T>\r
43 class Singleton:public NonCopyable\r
44 {\r
45 public:\r
46 \r
47         static T *Instance();\r
48 \r
49 private:\r
50         \r
51 };\r
52 \r
53 template <class T>\r
54 T *Singleton<T>::Instance()\r
55 {\r
56         static T *obj=0;\r
57         static Mutex mutex;\r
58         Guard g(mutex);\r
59         if(obj==0)\r
60         {\r
61                 obj=new T();\r
62                 static Destroyer<T> des(obj);\r
63         }\r
64         return const_cast<T*>(obj);\r
65 }\r
66 \r
67 }       // namespace\r
68 \r
69 #endif  // _pthread_singleton_\r