1/*
2 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7#include "Benchmark.h"
8#include "SkMutex.h"
9#include "SkSharedMutex.h"
10#include "SkSpinlock.h"
11#include "SkString.h"
12
13template <typename Mutex>
14class MutexBench : public Benchmark {
15public:
16    MutexBench(SkString benchPrefix) : fBenchName(benchPrefix += "UncontendedBenchmark") { }
17    bool isSuitableFor(Backend backend) override {
18        return backend == kNonRendering_Backend;
19    }
20
21protected:
22    const char* onGetName() override {
23        return fBenchName.c_str();
24    }
25
26    void onDraw(int loops, SkCanvas*) override {
27        for (int i = 0; i < loops; i++) {
28            fMu.acquire();
29            fMu.release();
30        }
31    }
32
33private:
34    typedef Benchmark INHERITED;
35    SkString fBenchName;
36    Mutex fMu;
37};
38
39class SharedBench : public Benchmark {
40public:
41    bool isSuitableFor(Backend backend) override {
42        return backend == kNonRendering_Backend;
43    }
44
45protected:
46    const char* onGetName() override {
47        return "SkSharedMutexSharedUncontendedBenchmark";
48    }
49
50    void onDraw(int loops, SkCanvas*) override {
51        for (int i = 0; i < loops; i++) {
52            fMu.acquireShared();
53            fMu.releaseShared();
54        }
55    }
56
57private:
58    typedef Benchmark INHERITED;
59    SkSharedMutex fMu;
60};
61
62///////////////////////////////////////////////////////////////////////////////
63
64DEF_BENCH( return new MutexBench<SkSharedMutex>(SkString("SkSharedMutex")); )
65DEF_BENCH( return new MutexBench<SkMutex>(SkString("SkMutex")); )
66DEF_BENCH( return new MutexBench<SkSpinlock>(SkString("SkSpinlock")); )
67DEF_BENCH( return new SharedBench; )
68