- Timestamp:
- Apr 23, 2021, 8:51:43 PM (5 years ago)
- Branches:
- Candidate_v1.7.0, stable
- Children:
- 77c4a0
- Parents:
- f01bb3
- git-author:
- Frederik Heber <frederik.heber@…> (11/24/20 00:00:44)
- git-committer:
- Frederik Heber <frederik.heber@…> (04/23/21 20:51:43)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
ThirdParty/CodePatterns/src/Patterns/unittests/AtomicInstanceUnitTest.cpp
rf01bb3 r2b88eb 86 86 void AtomicInstanceTest::tearDown(){} 87 87 88 static bool checkLock(boost::mutex &_mutex)88 static bool isLockable(boost::mutex &_mutex) 89 89 { 90 boost::mutex::scoped_lock lock(_mutex, boost::try_to_lock); 91 return lock; 90 bool is_locked = _mutex.try_lock(); 91 if (is_locked) 92 _mutex.unlock(); 93 return is_locked; 92 94 } 93 95 … … 97 99 AtomicInstanceStub2 *ptr2_1 = new AtomicInstanceStub2(); 98 100 { 99 CPPUNIT_ASSERT( checkLock(AtomicInstance<AtomicInstanceStub1>::atomicLock) );101 CPPUNIT_ASSERT( isLockable(AtomicInstance<AtomicInstanceStub1>::atomicLock) ); 100 102 AtomicInstance<AtomicInstanceStub1> atomic_ptr1_1(ptr1_1); 101 103 CPPUNIT_ASSERT_EQUAL( ptr1_1, &(*atomic_ptr1_1) ); 102 CPPUNIT_ASSERT( ! checkLock(AtomicInstance<AtomicInstanceStub1>::atomicLock) );104 CPPUNIT_ASSERT( !isLockable(AtomicInstance<AtomicInstanceStub1>::atomicLock) ); 103 105 104 106 // will NULL no deadlock occurs 105 107 { 106 CPPUNIT_ASSERT( ! checkLock(AtomicInstance<AtomicInstanceStub1>::atomicLock) );108 CPPUNIT_ASSERT( !isLockable(AtomicInstance<AtomicInstanceStub1>::atomicLock) ); 107 109 AtomicInstance<AtomicInstanceStub1> atomic_ptr1_NULL(NULL); 108 CPPUNIT_ASSERT( ! checkLock(AtomicInstance<AtomicInstanceStub1>::atomicLock) );110 CPPUNIT_ASSERT( !isLockable(AtomicInstance<AtomicInstanceStub1>::atomicLock) ); 109 111 } 110 112 111 CPPUNIT_ASSERT( checkLock(AtomicInstance<AtomicInstanceStub2>::atomicLock) );113 CPPUNIT_ASSERT( isLockable(AtomicInstance<AtomicInstanceStub2>::atomicLock) ); 112 114 const AtomicInstance<AtomicInstanceStub2> atomic_ptr2_1(ptr2_1); 113 115 CPPUNIT_ASSERT_EQUAL( const_cast<const AtomicInstanceStub2 *>(ptr2_1), &(*atomic_ptr2_1) ); 114 CPPUNIT_ASSERT( ! checkLock(AtomicInstance<AtomicInstanceStub2>::atomicLock) );116 CPPUNIT_ASSERT( !isLockable(AtomicInstance<AtomicInstanceStub2>::atomicLock) ); 115 117 116 118 // move is ok 117 CPPUNIT_ASSERT( ! checkLock(AtomicInstance<AtomicInstanceStub1>::atomicLock) );119 CPPUNIT_ASSERT( !isLockable(AtomicInstance<AtomicInstanceStub1>::atomicLock) ); 118 120 AtomicInstance<AtomicInstanceStub1> atomic_ptr1_2(atomic_ptr1_1); 119 121 CPPUNIT_ASSERT( atomic_ptr1_1.content == (AtomicInstanceStub1 *)NULL); 120 122 CPPUNIT_ASSERT( atomic_ptr1_2.content != (AtomicInstanceStub1 *)NULL); 121 CPPUNIT_ASSERT( ! checkLock(AtomicInstance<AtomicInstanceStub1>::atomicLock) );123 CPPUNIT_ASSERT( !isLockable(AtomicInstance<AtomicInstanceStub1>::atomicLock) ); 122 124 123 125 // this would cause deadlock 124 126 // AtomicInstance<AtomicInstanceStub1> atomic_ptr1_3(ptr1_1); 125 127 } 126 CPPUNIT_ASSERT( checkLock(AtomicInstance<AtomicInstanceStub1>::atomicLock) );127 CPPUNIT_ASSERT( checkLock(AtomicInstance<AtomicInstanceStub2>::atomicLock) );128 CPPUNIT_ASSERT( isLockable(AtomicInstance<AtomicInstanceStub1>::atomicLock) ); 129 CPPUNIT_ASSERT( isLockable(AtomicInstance<AtomicInstanceStub2>::atomicLock) ); 128 130 delete ptr1_1; 129 131 delete ptr2_1; … … 135 137 { 136 138 // this does not lock 137 CPPUNIT_ASSERT( checkLock(AtomicInstance<AtomicInstanceStub1>::atomicLock) );139 CPPUNIT_ASSERT( isLockable(AtomicInstance<AtomicInstanceStub1>::atomicLock) ); 138 140 AtomicInstance<AtomicInstanceStub1> atomic_ptr1_NULL(NULL); 139 141 CPPUNIT_ASSERT( atomic_ptr1_NULL.content == (AtomicInstanceStub1 *)NULL ); 140 CPPUNIT_ASSERT( checkLock(AtomicInstance<AtomicInstanceStub1>::atomicLock) );142 CPPUNIT_ASSERT( isLockable(AtomicInstance<AtomicInstanceStub1>::atomicLock) ); 141 143 142 144 // this will lock 143 145 AtomicInstance<AtomicInstanceStub1> atomic_ptr1_1(ptr1_1); 144 146 CPPUNIT_ASSERT( atomic_ptr1_1.content != (AtomicInstanceStub1 *)NULL ); 145 CPPUNIT_ASSERT( ! checkLock(AtomicInstance<AtomicInstanceStub1>::atomicLock) );147 CPPUNIT_ASSERT( !isLockable(AtomicInstance<AtomicInstanceStub1>::atomicLock) ); 146 148 147 149 // now assign. Content has moved and should still be locked 148 150 atomic_ptr1_NULL = atomic_ptr1_1; 149 CPPUNIT_ASSERT( ! checkLock(AtomicInstance<AtomicInstanceStub1>::atomicLock) );151 CPPUNIT_ASSERT( !isLockable(AtomicInstance<AtomicInstanceStub1>::atomicLock) ); 150 152 CPPUNIT_ASSERT( atomic_ptr1_NULL.content != (AtomicInstanceStub1 *)NULL ); 151 153 CPPUNIT_ASSERT( atomic_ptr1_1.content == (AtomicInstanceStub1 *)NULL ); 152 154 } 153 CPPUNIT_ASSERT( checkLock(AtomicInstance<AtomicInstanceStub1>::atomicLock) );155 CPPUNIT_ASSERT( isLockable(AtomicInstance<AtomicInstanceStub1>::atomicLock) ); 154 156 155 157 delete ptr1_1;
Note:
See TracChangeset
for help on using the changeset viewer.
