threadSafeRefCountTest.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. ////-----------------------------------------------------------------------------
  2. //// Copyright (c) 2014 GarageGames, LLC
  3. ////
  4. //// Permission is hereby granted, free of charge, to any person obtaining a copy
  5. //// of this software and associated documentation files (the "Software"), to
  6. //// deal in the Software without restriction, including without limitation the
  7. //// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  8. //// sell copies of the Software, and to permit persons to whom the Software is
  9. //// furnished to do so, subject to the following conditions:
  10. ////
  11. //// The above copyright notice and this permission notice shall be included in
  12. //// all copies or substantial portions of the Software.
  13. ////
  14. //// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. //// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. //// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. //// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. //// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  19. //// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  20. //// IN THE SOFTWARE.
  21. ////-----------------------------------------------------------------------------
  22. //
  23. //#ifdef TORQUE_TESTS_ENABLED
  24. //#include "testing/unitTesting.h"
  25. //#include "platform/threads/threadSafeRefCount.h"
  26. //#include "platform/threads/thread.h"
  27. //#include "core/util/tVector.h"
  28. //#include "console/console.h"
  29. //
  30. //FIXTURE(ThreadSafeRefCount)
  31. //{
  32. //public:
  33. // struct TestObjectDtor : public ThreadSafeRefCount<TestObjectDtor>
  34. // {
  35. // bool &flag;
  36. // TestObjectDtor(bool &f) : flag(f)
  37. // {
  38. // flag = false;
  39. // }
  40. // ~TestObjectDtor()
  41. // {
  42. // flag = true;
  43. // }
  44. // };
  45. // typedef ThreadSafeRef<TestObjectDtor> TestObjectDtorRef;
  46. //
  47. // enum
  48. // {
  49. // NUM_ADD_REFS_PER_THREAD = 10,
  50. // NUM_EXTRA_REFS_PER_THREAD = 10,
  51. // NUM_THREADS = 10
  52. // };
  53. //
  54. // class TestObject : public ThreadSafeRefCount<TestObject> {};
  55. // typedef ThreadSafeRef<TestObject> TestObjectRef;
  56. //
  57. // class TestThread : public Thread
  58. // {
  59. // public:
  60. // TestObjectRef mRef;
  61. // Vector<TestObjectRef> mExtraRefs;
  62. //
  63. // TestThread(TestObjectRef ref) : mRef(ref) {}
  64. //
  65. // void run(void* arg)
  66. // {
  67. // if (!arg)
  68. // {
  69. // // Create references.
  70. // for (U32 i = 0; i < NUM_ADD_REFS_PER_THREAD; i++)
  71. // mRef->addRef();
  72. //
  73. // mExtraRefs.setSize(NUM_EXTRA_REFS_PER_THREAD);
  74. // for (U32 i = 0; i < NUM_EXTRA_REFS_PER_THREAD; i++)
  75. // mExtraRefs[i] = mRef;
  76. // }
  77. // else
  78. // {
  79. // // Clear references.
  80. // mExtraRefs.clear();
  81. // for (U32 i = 0; i < NUM_ADD_REFS_PER_THREAD; i++)
  82. // mRef->release();
  83. // }
  84. // }
  85. // };
  86. //
  87. //};
  88. //
  89. //TEST_FIX(ThreadSafeRefCount, Serial)
  90. //{
  91. // bool deleted = false;
  92. // TestObjectDtorRef ref1 = new TestObjectDtor(deleted);
  93. // ASSERT_FALSE(deleted);
  94. // EXPECT_FALSE(ref1->isShared());
  95. // EXPECT_TRUE(ref1 != NULL);
  96. //
  97. // TestObjectDtorRef ref2 = ref1;
  98. // EXPECT_TRUE(ref1->isShared());
  99. // EXPECT_TRUE(ref2->isShared());
  100. // EXPECT_EQ(ref1, ref2);
  101. //
  102. // ref1 = NULL;
  103. // EXPECT_FALSE(ref2->isShared());
  104. //
  105. // ref2 = NULL;
  106. // ASSERT_TRUE(deleted);
  107. //}
  108. //
  109. //TEST_FIX(ThreadSafeRefCount, Concurrent)
  110. //{
  111. // TestObjectRef mRef = new TestObject;
  112. // EXPECT_EQ(2, mRef->getRefCount()); // increments of 2
  113. //
  114. // Vector<TestThread*> threads;
  115. // threads.setSize(NUM_THREADS);
  116. //
  117. // // Create threads.
  118. // for (U32 i = 0; i < NUM_THREADS; i++)
  119. // threads[i] = new TestThread(mRef);
  120. //
  121. // // Run phase 1: create references.
  122. // for (U32 i = 0; i < NUM_THREADS; i++)
  123. // threads[i]->start(NULL);
  124. //
  125. // // Wait for completion.
  126. // for (U32 i = 0; i < NUM_THREADS; i++)
  127. // threads[i]->join();
  128. //
  129. // EXPECT_EQ(2 + ((1 + NUM_ADD_REFS_PER_THREAD + NUM_EXTRA_REFS_PER_THREAD) * NUM_THREADS * 2),
  130. // mRef->getRefCount());
  131. //
  132. // // Run phase 2: release references.
  133. // for (U32 i = 0; i < NUM_THREADS; i++)
  134. // threads[i]->start((void*) 1);
  135. //
  136. // // Wait for completion.
  137. // for (U32 i = 0; i < NUM_THREADS; i++)
  138. // {
  139. // threads[i]->join();
  140. // delete threads[i];
  141. // }
  142. //
  143. // EXPECT_EQ(2, mRef->getRefCount()); // increments of two
  144. //
  145. // mRef = NULL;
  146. //}
  147. //
  148. //TEST_FIX(ThreadSafeRefCount, Tagging)
  149. //{
  150. // TestObjectRef ref;
  151. // EXPECT_FALSE(ref.isTagged());
  152. // EXPECT_FALSE(bool(ref));
  153. // EXPECT_FALSE(bool(ref.ptr()));
  154. //
  155. // EXPECT_TRUE(ref.trySetFromTo(ref, NULL));
  156. // EXPECT_FALSE(ref.isTagged());
  157. //
  158. // EXPECT_TRUE(ref.trySetFromTo(ref, NULL, TestObjectRef::TAG_Set));
  159. // EXPECT_TRUE(ref.isTagged());
  160. // EXPECT_TRUE(ref.trySetFromTo(ref, NULL, TestObjectRef::TAG_Set));
  161. // EXPECT_TRUE(ref.isTagged());
  162. //
  163. // EXPECT_TRUE(ref.trySetFromTo(ref, NULL, TestObjectRef::TAG_Unset));
  164. // EXPECT_FALSE(ref.isTagged());
  165. // EXPECT_TRUE(ref.trySetFromTo(ref, NULL, TestObjectRef::TAG_Unset));
  166. // EXPECT_FALSE(ref.isTagged());
  167. //
  168. // EXPECT_TRUE(ref.trySetFromTo(ref, NULL, TestObjectRef::TAG_SetOrFail));
  169. // EXPECT_TRUE(ref.isTagged());
  170. // EXPECT_FALSE(ref.trySetFromTo(ref, NULL, TestObjectRef::TAG_SetOrFail));
  171. // EXPECT_TRUE(ref.isTagged());
  172. // EXPECT_FALSE(ref.trySetFromTo(ref, NULL, TestObjectRef::TAG_FailIfSet));
  173. //
  174. // EXPECT_TRUE(ref.trySetFromTo(ref, NULL, TestObjectRef::TAG_UnsetOrFail));
  175. // EXPECT_FALSE(ref.isTagged());
  176. // EXPECT_FALSE(ref.trySetFromTo(ref, NULL, TestObjectRef::TAG_UnsetOrFail));
  177. // EXPECT_FALSE(ref.isTagged());
  178. // EXPECT_FALSE(ref.trySetFromTo(ref, NULL, TestObjectRef::TAG_FailIfUnset));
  179. //
  180. // TestObjectRef objectA = new TestObject;
  181. // TestObjectRef objectB = new TestObject;
  182. //
  183. // EXPECT_FALSE(objectA->isShared());
  184. // EXPECT_FALSE(objectB->isShared());
  185. //
  186. // ref = objectA;
  187. // EXPECT_FALSE(ref.isTagged());
  188. // EXPECT_TRUE(ref == objectA);
  189. // EXPECT_TRUE(ref == objectA.ptr());
  190. // EXPECT_TRUE(objectA->isShared());
  191. //
  192. // EXPECT_TRUE(ref.trySetFromTo(objectA, objectB, TestObjectRef::TAG_Set));
  193. // EXPECT_TRUE(ref.isTagged());
  194. // EXPECT_EQ(ref, objectB);
  195. // EXPECT_EQ(ref, objectB.ptr());
  196. // EXPECT_TRUE(objectB->isShared());
  197. // EXPECT_FALSE(objectA->isShared());
  198. //
  199. // EXPECT_TRUE(ref.trySetFromTo(ref, objectA));
  200. // EXPECT_TRUE(ref.isTagged());
  201. // EXPECT_EQ(ref, objectA);
  202. // EXPECT_EQ(ref, objectA.ptr());
  203. //}
  204. //
  205. //#endif