| /* |
| * 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 "include/private/base/SkOnce.h" |
| #include "src/core/SkTaskGroup.h" |
| #include "tests/Test.h" |
| |
| #include <functional> |
| |
| static void 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. |
| SkOnce once; |
| once(add_five, &x); |
| once(add_five, &x); |
| once(add_five, &x); |
| once(add_five, &x); |
| once(add_five, &x); |
| |
| REPORTER_ASSERT(r, 5 == x); |
| } |
| |
| DEF_TEST(SkOnce_Multithreaded, r) { |
| int x = 0; |
| |
| // Run a bunch of tasks to be the first to add six to x. |
| SkOnce once; |
| SkTaskGroup().batch(1021, [&](int) { |
| once([&] { x += 6; }); |
| }); |
| |
| // Only one should have done the +=. |
| REPORTER_ASSERT(r, 6 == x); |
| } |
| |
| static int gX = 0; |
| static void inc_gX() { gX++; } |
| |
| DEF_TEST(SkOnce_NoArg, r) { |
| SkOnce once; |
| once(inc_gX); |
| once(inc_gX); |
| once(inc_gX); |
| REPORTER_ASSERT(r, 1 == gX); |
| } |