| /* |
| * 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 "SkTaskGroup.h" |
| #include "Test.h" |
| |
| static void add_five(int* x) { |
| *x += 5; |
| } |
| |
| SK_DECLARE_STATIC_ONCE(st_once); |
| DEF_TEST(SkOnce_Singlethreaded, r) { |
| int x = 0; |
| |
| // No matter how many times we do this, x will be 5. |
| SkOnce(&st_once, add_five, &x); |
| SkOnce(&st_once, add_five, &x); |
| SkOnce(&st_once, add_five, &x); |
| SkOnce(&st_once, add_five, &x); |
| SkOnce(&st_once, add_five, &x); |
| |
| REPORTER_ASSERT(r, 5 == x); |
| } |
| |
| SK_DECLARE_STATIC_ONCE(mt_once); |
| DEF_TEST(SkOnce_Multithreaded, r) { |
| int x = 0; |
| // Run a bunch of tasks to be the first to add six to x. |
| SkTaskGroup().batch(1021, [&](int) { |
| void(*add_six)(int*) = [](int* p) { *p += 6; }; |
| SkOnce(&mt_once, add_six, &x); |
| }); |
| |
| // Only one should have done the +=. |
| REPORTER_ASSERT(r, 6 == x); |
| } |
| |
| static int gX = 0; |
| static void inc_gX() { gX++; } |
| |
| SK_DECLARE_STATIC_ONCE(noarg_once); |
| DEF_TEST(SkOnce_NoArg, r) { |
| SkOnce(&noarg_once, inc_gX); |
| SkOnce(&noarg_once, inc_gX); |
| SkOnce(&noarg_once, inc_gX); |
| REPORTER_ASSERT(r, 1 == gX); |
| } |