1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2015 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkSharedMutex.h"
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTaskGroup.h"
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "Test.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_TEST(SkSharedMutexBasic, r) {
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkSharedMutex sm;
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sm.acquire();
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sm.assertHeld();
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sm.release();
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sm.acquireShared();
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sm.assertHeldShared();
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sm.releaseShared();
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_TEST(SkSharedMutexMultiThreaded, r) {
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkSharedMutex sm;
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static const int kSharedSize = 10;
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int shared[kSharedSize];
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int value = 0;
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    for (int i = 0; i < kSharedSize; ++i) {
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        shared[i] = 0;
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkTaskGroup().batch(8, [&](int threadIndex) {
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (threadIndex % 4 != 0) {
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            for (int c = 0; c < 100000; ++c) {
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                sm.acquireShared();
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                sm.assertHeldShared();
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                int v = shared[0];
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                for (int i = 1; i < kSharedSize; ++i) {
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    REPORTER_ASSERT(r, v == shared[i]);
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                }
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                sm.releaseShared();
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        } else {
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            for (int c = 0; c < 100000; ++c) {
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                sm.acquire();
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                sm.assertHeld();
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                value += 1;
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                for (int i = 0; i < kSharedSize; ++i) {
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    shared[i] = value;
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                }
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                sm.release();
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    });
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
55