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