Line data Source code
1 : /*
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 : */
18 : template<typename TSubclass> class GrNonAtomicRef : public SkNoncopyable {
19 : public:
20 0 : GrNonAtomicRef() : fRefCnt(1) {}
21 :
22 : #ifdef SK_DEBUG
23 0 : ~GrNonAtomicRef() {
24 : // fRefCnt can be one when a subclass is created statically
25 0 : SkASSERT((0 == fRefCnt || 1 == fRefCnt));
26 : // Set to invalid values.
27 0 : fRefCnt = -10;
28 0 : }
29 : #endif
30 :
31 0 : bool unique() const { return 1 == fRefCnt; }
32 :
33 0 : void ref() const {
34 : // Once the ref cnt reaches zero it should never be ref'ed again.
35 0 : SkASSERT(fRefCnt > 0);
36 0 : ++fRefCnt;
37 0 : }
38 :
39 0 : void unref() const {
40 0 : SkASSERT(fRefCnt > 0);
41 0 : --fRefCnt;
42 0 : if (0 == fRefCnt) {
43 0 : GrTDeleteNonAtomicRef(static_cast<const TSubclass*>(this));
44 0 : return;
45 : }
46 : }
47 :
48 : private:
49 : mutable int32_t fRefCnt;
50 :
51 : typedef SkNoncopyable INHERITED;
52 : };
53 :
54 0 : template<typename T> inline void GrTDeleteNonAtomicRef(const T* ref) {
55 0 : delete ref;
56 0 : }
57 :
58 : #endif
|