Index: tests/OnceTest.cpp |
diff --git a/tests/OnceTest.cpp b/tests/OnceTest.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0f62cf2483016f6f8a18c3dc6212e34f717fa169 |
--- /dev/null |
+++ b/tests/OnceTest.cpp |
@@ -0,0 +1,55 @@ |
+#include "SkOnce.h" |
robertphillips
2013/10/09 15:31:13
Header
mtklein
2013/10/09 15:33:57
Done.
|
+#include "SkRunnable.h" |
+#include "SkThreadPool.h" |
+#include "Test.h" |
+#include "TestClassDef.h" |
+ |
+DEF_SK_ONCE(add_five, int* x) { |
+ *x += 5; |
+} |
+ |
+DEF_TEST(SkOnce_Singlethreaded, r) { |
+ int x = 0; |
+ |
+ // No matter how many times we do this, x will be 5. |
+ SK_ONCE(add_five, &x); |
+ SK_ONCE(add_five, &x); |
+ SK_ONCE(add_five, &x); |
+ SK_ONCE(add_five, &x); |
+ SK_ONCE(add_five, &x); |
+ |
+ REPORTER_ASSERT(r, 5 == x); |
+} |
+ |
+ |
+DEF_SK_ONCE(add_six, int* x) { |
+ *x += 6; |
+} |
+ |
+DEF_TEST(SkOnce_Multithreaded, r) { |
+ const int kTasks = 16, kThreads = 4; |
+ |
+ // Make a bunch of tasks that will race to be the first to add six. |
+ struct : public SkRunnable { |
+ int* ptr; |
+ virtual void run() SK_OVERRIDE { |
+ SK_ONCE(add_six, ptr); |
+ } |
+ } racers[kTasks]; |
+ |
+ // Point them at x. |
+ int x = 0; |
+ for (int i = 0; i < kTasks; i++) { |
+ racers[i].ptr = &x; |
+ } |
+ |
+ // Let them race. |
+ SkAutoTDelete<SkThreadPool> pool(new SkThreadPool(kThreads)); |
+ for (int i = 0; i < kTasks; i++) { |
+ pool->add(&racers[i]); |
+ } |
+ pool.free(); // Blocks until all threads are done. |
+ |
+ // Only one should have done the +=. |
+ REPORTER_ASSERT(r, 6 == x); |
+} |