blob: efa2881c5f49a34cd553ccb291b4c638277b7745 [file] [log] [blame]
joshualitt2419b362015-07-13 09:29:42 -07001/*
2 * Copyright 2015 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
8#ifndef GrNonAtomicRef_DEFINED
9#define GrNonAtomicRef_DEFINED
10
11#include "SkRefCnt.h"
12#include "SkTArray.h"
13
14/**
15 * A simple non-atomic ref used in the GrBackend when we don't want to pay for the overhead of a
16 * threadsafe ref counted object
17 */
18class GrNonAtomicRef : public SkNoncopyable {
19public:
20 GrNonAtomicRef() : fRefCnt(1) {}
21 virtual ~GrNonAtomicRef() {
22 // fRefCnt can be one when a subclass is created statically
23 SkASSERT((0 == fRefCnt || 1 == fRefCnt));
24 // Set to invalid values.
25 SkDEBUGCODE(fRefCnt = -10;)
26 }
27
28 void ref() const {
29 // Once the ref cnt reaches zero it should never be ref'ed again.
30 SkASSERT(fRefCnt > 0);
31 ++fRefCnt;
32 }
33
34 void unref() const {
35 SkASSERT(fRefCnt > 0);
36 --fRefCnt;
37 if (0 == fRefCnt) {
halcanary385fe4d2015-08-26 13:07:48 -070038 delete this;
joshualitt2419b362015-07-13 09:29:42 -070039 return;
40 }
41 }
42
43private:
44 mutable int32_t fRefCnt;
45
46 typedef SkNoncopyable INHERITED;
47};
48
49#endif