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 
12 static void add_five(int* x) {
13     *x += 5;
14 }
15 
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 
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;
44 static void inc_gX() { gX++; }
45 
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