/*
 * 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 "src/core/SkSharedMutex.h"
#include "src/core/SkTaskGroup.h"
#include "tests/Test.h"

#include <array>
#include <functional>

DEF_TEST(SkSharedMutexBasic, r) {
    SkSharedMutex sm;
    sm.acquire();
    sm.assertHeld();
    sm.release();
    sm.acquireShared();
    sm.assertHeldShared();
    sm.releaseShared();
}

DEF_TEST(SkSharedMutexMultiThreaded, r) {
    SkSharedMutex sm;
    static const int kSharedSize = 10;
    std::array<int, kSharedSize> shared;
    int value = 0;
    for (int i = 0; i < kSharedSize; ++i) {
        shared[i] = 0;
    }
    SkTaskGroup taskGroup;

    for (int threadIndex = 0; threadIndex < 8; ++threadIndex) {
        taskGroup.add([&, threadIndex]() {
            if (threadIndex % 4 != 0) {
                for (int c = 0; c < 100000; ++c) {
                    sm.acquireShared();
                    sm.assertHeldShared();
                    int v = shared[0];
                    for (int i = 1; i < kSharedSize; ++i) {
                        REPORTER_ASSERT(r, v == shared[i]);
                    }
                    sm.releaseShared();
                }
            } else {
                for (int c = 0; c < 100000; ++c) {
                    sm.acquire();
                    sm.assertHeld();
                    value += 1;
                    for (int i = 0; i < kSharedSize; ++i) {
                        shared[i] = value;
                    }
                    sm.release();
                }
            }
        });
    }
    taskGroup.wait();
}
