blob: e1503bcf06e16936e463e79d243f3db7b1739203 [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 */
cdalton4833f392016-02-02 22:46:16 -080018template<typename TSubclass> class GrNonAtomicRef : public SkNoncopyable {
joshualitt2419b362015-07-13 09:29:42 -070019public:
20 GrNonAtomicRef() : fRefCnt(1) {}
cdalton4833f392016-02-02 22:46:16 -080021
22#ifdef SK_DEBUG
23 ~GrNonAtomicRef() {
joshualitt2419b362015-07-13 09:29:42 -070024 // fRefCnt can be one when a subclass is created statically
25 SkASSERT((0 == fRefCnt || 1 == fRefCnt));
26 // Set to invalid values.
cdalton4833f392016-02-02 22:46:16 -080027 fRefCnt = -10;
joshualitt2419b362015-07-13 09:29:42 -070028 }
cdalton4833f392016-02-02 22:46:16 -080029#endif
joshualitt2419b362015-07-13 09:29:42 -070030
31 void ref() const {
32 // Once the ref cnt reaches zero it should never be ref'ed again.
33 SkASSERT(fRefCnt > 0);
34 ++fRefCnt;
35 }
36
37 void unref() const {
38 SkASSERT(fRefCnt > 0);
39 --fRefCnt;
40 if (0 == fRefCnt) {
cdalton4833f392016-02-02 22:46:16 -080041 GrTDeleteNonAtomicRef(static_cast<const TSubclass*>(this));
joshualitt2419b362015-07-13 09:29:42 -070042 return;
43 }
44 }
45
46private:
47 mutable int32_t fRefCnt;
48
49 typedef SkNoncopyable INHERITED;
50};
51
cdalton4833f392016-02-02 22:46:16 -080052template<typename T> inline void GrTDeleteNonAtomicRef(const T* ref) {
53 delete ref;
54}
55
joshualitt2419b362015-07-13 09:29:42 -070056#endif