/*
 * Copyright 2015 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "Test.h"
#include "SkOncePtr.h"
#include "SkTaskGroup.h"

DEF_TEST(OncePtr, r) {
    SkOncePtr<int> once;

    static SkAtomic<int> calls(0);
    auto create = [&] {
        calls.fetch_add(1);
        return new int(5);
    };

    SkAtomic<int> force_a_race(sk_parallel_for_thread_count());
    if (force_a_race < 1) {
        return;
    }
    sk_parallel_for(sk_num_cores()*4, [&](size_t) {
        force_a_race.fetch_add(-1);
        while (force_a_race.load() > 0);

        int* n = once.get(create);
        REPORTER_ASSERT(r, *n == 5);
    });
    REPORTER_ASSERT(r, calls.load() == 1);
}

/* TODO(mtklein): next CL

SK_DECLARE_STATIC_ONCE(once_noptr);
DEF_TEST(OnceNoPtr, r) {
    static SkAtomic<int> calls(0);

    SkAtomic<int> force_a_race(sk_num_cores());
    sk_parallel_for(sk_num_cores()*4, [&](size_t) {
        force_a_race.fetch_add(-1);
        while (force_a_race.load() > 0);

        SkOnce(&once_noptr, [&] { calls.fetch_add(1); });
    });
    REPORTER_ASSERT(r, calls.load() == 1);
}
*/
