Index: tests/OnceTest.cpp |
diff --git a/tests/OnceTest.cpp b/tests/OnceTest.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0b2aa9a8571a3e2bcbe44d014b969bb363c3da1f |
--- /dev/null |
+++ b/tests/OnceTest.cpp |
@@ -0,0 +1,67 @@ |
+/* |
+ * Copyright 2013 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#include "SkOnce.h" |
+#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; |
+} |
+ |
+namespace { |
+ |
+class Racer : public SkRunnable { |
+public: |
+ int* ptr; |
+ virtual void run() SK_OVERRIDE { |
+ SK_ONCE(add_six, ptr); |
+ } |
+}; |
+ |
+} // namespace |
+ |
+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 to x. |
+ Racer racers[kTasks]; |
+ 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); |
+} |