Changeset c6a59b
- Timestamp:
- May 5, 2016, 1:06:20 PM (9 years ago)
- Children:
- c1e104
- Parents:
- 039e15
- git-author:
- Frederik Heber <heber@…> (05/05/16 09:20:08)
- git-committer:
- Frederik Heber <heber@…> (05/05/16 13:06:20)
- Location:
- src
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
src/CodePatterns/Singleton.hpp
r039e15 rc6a59b 17 17 18 18 #include "CodePatterns/Assert.hpp" 19 #include "CodePatterns/AtomicInstance.hpp" 19 20 20 21 /** … … 145 146 * when only the Singleton pattern is friend with the class 146 147 * 147 * All methods have similar sema tics to auto_ptr148 * All methods have similar semantics to auto_ptr 148 149 */ 149 150 class ptr_t { … … 235 236 236 237 /** 238 * returns the instance of this Singleton as a reference inside a mutex-locked 239 * unique ptr. 240 * 241 * If no Singleton exists at this point and we are allowed to create one 242 * a new one is created and stored inside the singleton. If the mutex is locked, 243 * the function will wait until the mutex is released. This can be used to 244 * ensure atomic access to the static instance. 245 */ 246 static AtomicInstance<T> getLockedInstance(); 247 248 /** 237 249 * returns the instance of this singleton as a pointer 238 250 * -
src/CodePatterns/Singleton_impl.hpp
r039e15 rc6a59b 45 45 } 46 46 return *theInstance; 47 } 48 49 template <class T,bool _may_create> 50 AtomicInstance<T> Singleton<T,_may_create>::getLockedInstance(){ 51 // boost supports RAII-Style locking, so we don't need to unlock 52 boost::recursive_mutex::scoped_lock guard(instanceLock); 53 if(!theInstance.get()) { 54 theInstance.reset(creator::make()); 55 } 56 T *ptr = theInstance.get(); 57 return AtomicInstance<T>(ptr); 47 58 } 48 59 … … 120 131 template name& Singleton< name , name::may_create >::getInstance(); \ 121 132 template const name& Singleton< name , name::may_create >::getConstInstance(); \ 133 template AtomicInstance<name> Singleton< name , name::may_create >::getLockedInstance(); \ 122 134 template name* Singleton< name , name::may_create >::getPointer(); \ 123 135 template const name* Singleton< name , name::may_create >::getConstPointer(); \ -
src/Patterns/Makefile.am
r039e15 rc6a59b 23 23 $(top_srcdir)/src/CodePatterns/ManipulablePrototypeFactory_impl.hpp \ 24 24 $(top_srcdir)/src/CodePatterns/ObservedValue.hpp \ 25 $(top_srcdir)/src/CodePatterns/Registry_impl.hpp \26 $(top_srcdir)/src/CodePatterns/Singleton_impl.hpp \27 25 $(top_srcdir)/src/CodePatterns/PrototypeFactory.hpp \ 28 26 $(top_srcdir)/src/CodePatterns/PrototypeFactory_impl.hpp \ 29 27 $(top_srcdir)/src/CodePatterns/Registry.hpp \ 30 $(top_srcdir)/src/CodePatterns/Singleton.hpp 28 $(top_srcdir)/src/CodePatterns/Registry_impl.hpp \ 29 $(top_srcdir)/src/CodePatterns/Singleton.hpp \ 30 $(top_srcdir)/src/CodePatterns/Singleton_impl.hpp 31 31 32 32 PATTERNDEBUGHEADER = -
src/Patterns/unittests/SingletonUnitTest.cpp
r039e15 rc6a59b 81 81 CONSTRUCT_SINGLETON(SingletonStub2); 82 82 83 void SingletonTest::setUp(){} 83 void SingletonTest::setUp() 84 { 85 ASSERT_DO(Assert::Throw); 86 } 87 84 88 void SingletonTest::tearDown(){} 85 89 … … 152 156 // mechanism. Check with Valgrind to see if memory-leak occurs 153 157 std::cout << "Not purging Singleton!\n Check with Valgrind to see if automatic purgins is working!" << std::endl; 158 } 154 159 160 void SingletonTest::LockedTest(){ 161 const AtomicInstance<SingletonStub1> ptr_1_1(SingletonStub1::getLockedInstance()); 162 const SingletonStub1 &test_1 = *ptr_1_1; 163 164 // this deadlocks 165 // AtomicInstance<SingletonStub1> ptr_1_2(SingletonStub1::getLockedInstance()); 166 167 AtomicInstance<SingletonStub2> ptr_2_1(SingletonStub2::getLockedInstance()); 168 SingletonStub2 &test_2 = *ptr_2_1; 169 170 // this deadlocks 171 // AtomicInstance<SingletonStub2> ptr_2_2(SingletonStub2::getLockedInstance()); 155 172 } -
src/Patterns/unittests/SingletonUnitTest.hpp
r039e15 rc6a59b 20 20 CPPUNIT_TEST_SUITE( SingletonTest ); 21 21 CPPUNIT_TEST ( ConstructionTest ); 22 CPPUNIT_TEST ( LockedTest ); 22 23 CPPUNIT_TEST_SUITE_END(); 23 24 … … 27 28 28 29 void ConstructionTest(); 30 void LockedTest(); 29 31 }; 30 32
Note:
See TracChangeset
for help on using the changeset viewer.