1410e9dc9aa3a79a19e708cad2f254a9e64891c80tomhudson@google.com/*
2410e9dc9aa3a79a19e708cad2f254a9e64891c80tomhudson@google.com * Copyright 2011 Google Inc.
3410e9dc9aa3a79a19e708cad2f254a9e64891c80tomhudson@google.com *
4410e9dc9aa3a79a19e708cad2f254a9e64891c80tomhudson@google.com * Use of this source code is governed by a BSD-style license that can be
5410e9dc9aa3a79a19e708cad2f254a9e64891c80tomhudson@google.com * found in the LICENSE file.
6410e9dc9aa3a79a19e708cad2f254a9e64891c80tomhudson@google.com */
7f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
81b24933e52f50773de29332387a12721811f3012mtklein#include "SkMutex.h"
9bcfd511eb1aada39622116fd1df8178b58650fbaherb#include "SkSharedMutex.h"
10bcfd511eb1aada39622116fd1df8178b58650fbaherb#include "SkSpinlock.h"
11bcfd511eb1aada39622116fd1df8178b58650fbaherb#include "SkString.h"
12410e9dc9aa3a79a19e708cad2f254a9e64891c80tomhudson@google.com
13bcfd511eb1aada39622116fd1df8178b58650fbaherbtemplate <typename Mutex>
14f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass MutexBench : public Benchmark {
15410e9dc9aa3a79a19e708cad2f254a9e64891c80tomhudson@google.compublic:
16bcfd511eb1aada39622116fd1df8178b58650fbaherb    MutexBench(SkString benchPrefix) : fBenchName(benchPrefix += "UncontendedBenchmark") { }
1736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool isSuitableFor(Backend backend) override {
18644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org        return backend == kNonRendering_Backend;
19410e9dc9aa3a79a19e708cad2f254a9e64891c80tomhudson@google.com    }
20644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org
21410e9dc9aa3a79a19e708cad2f254a9e64891c80tomhudson@google.comprotected:
22f059900f75639f1b1a03f2c25333ef9aa22d58b8mtklein    const char* onGetName() override {
23bcfd511eb1aada39622116fd1df8178b58650fbaherb        return fBenchName.c_str();
24410e9dc9aa3a79a19e708cad2f254a9e64891c80tomhudson@google.com    }
25410e9dc9aa3a79a19e708cad2f254a9e64891c80tomhudson@google.com
26a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein    void onDraw(int loops, SkCanvas*) override {
273361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
28a16e8bcef165aabb2463339e80fdd6f1fa19b8b9mtklein            fMu.acquire();
29a16e8bcef165aabb2463339e80fdd6f1fa19b8b9mtklein            fMu.release();
30410e9dc9aa3a79a19e708cad2f254a9e64891c80tomhudson@google.com        }
31410e9dc9aa3a79a19e708cad2f254a9e64891c80tomhudson@google.com    }
32410e9dc9aa3a79a19e708cad2f254a9e64891c80tomhudson@google.com
33410e9dc9aa3a79a19e708cad2f254a9e64891c80tomhudson@google.comprivate:
34f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
35bcfd511eb1aada39622116fd1df8178b58650fbaherb    SkString fBenchName;
36a16e8bcef165aabb2463339e80fdd6f1fa19b8b9mtklein    Mutex fMu;
37410e9dc9aa3a79a19e708cad2f254a9e64891c80tomhudson@google.com};
38410e9dc9aa3a79a19e708cad2f254a9e64891c80tomhudson@google.com
39d32087a613fde2623bbe0abfe551164fdf3d633eherbclass SharedBench : public Benchmark {
40d32087a613fde2623bbe0abfe551164fdf3d633eherbpublic:
41d32087a613fde2623bbe0abfe551164fdf3d633eherb    bool isSuitableFor(Backend backend) override {
42d32087a613fde2623bbe0abfe551164fdf3d633eherb        return backend == kNonRendering_Backend;
43d32087a613fde2623bbe0abfe551164fdf3d633eherb    }
44d32087a613fde2623bbe0abfe551164fdf3d633eherb
45d32087a613fde2623bbe0abfe551164fdf3d633eherbprotected:
46d32087a613fde2623bbe0abfe551164fdf3d633eherb    const char* onGetName() override {
47d32087a613fde2623bbe0abfe551164fdf3d633eherb        return "SkSharedMutexSharedUncontendedBenchmark";
48d32087a613fde2623bbe0abfe551164fdf3d633eherb    }
49d32087a613fde2623bbe0abfe551164fdf3d633eherb
50a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein    void onDraw(int loops, SkCanvas*) override {
51d32087a613fde2623bbe0abfe551164fdf3d633eherb        for (int i = 0; i < loops; i++) {
52a16e8bcef165aabb2463339e80fdd6f1fa19b8b9mtklein            fMu.acquireShared();
53a16e8bcef165aabb2463339e80fdd6f1fa19b8b9mtklein            fMu.releaseShared();
54d32087a613fde2623bbe0abfe551164fdf3d633eherb        }
55d32087a613fde2623bbe0abfe551164fdf3d633eherb    }
56d32087a613fde2623bbe0abfe551164fdf3d633eherb
57d32087a613fde2623bbe0abfe551164fdf3d633eherbprivate:
58d32087a613fde2623bbe0abfe551164fdf3d633eherb    typedef Benchmark INHERITED;
59a16e8bcef165aabb2463339e80fdd6f1fa19b8b9mtklein    SkSharedMutex fMu;
60d32087a613fde2623bbe0abfe551164fdf3d633eherb};
61d32087a613fde2623bbe0abfe551164fdf3d633eherb
62410e9dc9aa3a79a19e708cad2f254a9e64891c80tomhudson@google.com///////////////////////////////////////////////////////////////////////////////
63410e9dc9aa3a79a19e708cad2f254a9e64891c80tomhudson@google.com
64bcfd511eb1aada39622116fd1df8178b58650fbaherbDEF_BENCH( return new MutexBench<SkSharedMutex>(SkString("SkSharedMutex")); )
65bcfd511eb1aada39622116fd1df8178b58650fbaherbDEF_BENCH( return new MutexBench<SkMutex>(SkString("SkMutex")); )
66bcfd511eb1aada39622116fd1df8178b58650fbaherbDEF_BENCH( return new MutexBench<SkSpinlock>(SkString("SkSpinlock")); )
67d32087a613fde2623bbe0abfe551164fdf3d633eherbDEF_BENCH( return new SharedBench; )
68