1 /*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8 #include "SkOnce.h"
9 #include "SkTaskGroup.h"
10 #include "Test.h"
11
add_five(int * x)12 static void add_five(int* x) {
13 *x += 5;
14 }
15
DEF_TEST(SkOnce_Singlethreaded,r)16 DEF_TEST(SkOnce_Singlethreaded, r) {
17 int x = 0;
18
19 // No matter how many times we do this, x will be 5.
20 SkOnce once;
21 once(add_five, &x);
22 once(add_five, &x);
23 once(add_five, &x);
24 once(add_five, &x);
25 once(add_five, &x);
26
27 REPORTER_ASSERT(r, 5 == x);
28 }
29
DEF_TEST(SkOnce_Multithreaded,r)30 DEF_TEST(SkOnce_Multithreaded, r) {
31 int x = 0;
32
33 // Run a bunch of tasks to be the first to add six to x.
34 SkOnce once;
35 SkTaskGroup().batch(1021, [&](int) {
36 once([&] { x += 6; });
37 });
38
39 // Only one should have done the +=.
40 REPORTER_ASSERT(r, 6 == x);
41 }
42
43 static int gX = 0;
inc_gX()44 static void inc_gX() { gX++; }
45
DEF_TEST(SkOnce_NoArg,r)46 DEF_TEST(SkOnce_NoArg, r) {
47 SkOnce once;
48 once(inc_gX);
49 once(inc_gX);
50 once(inc_gX);
51 REPORTER_ASSERT(r, 1 == gX);
52 }
53