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