1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2015 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrNonAtomicRef_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define GrNonAtomicRef_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkNoncopyable.h" 13*c8dee2aaSAndroid Build Coastguard Worker 14*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker /** 17*c8dee2aaSAndroid Build Coastguard Worker * A simple non-atomic ref used in the GrBackendApi when we don't want to pay for the overhead of a 18*c8dee2aaSAndroid Build Coastguard Worker * threadsafe ref counted object 19*c8dee2aaSAndroid Build Coastguard Worker */ 20*c8dee2aaSAndroid Build Coastguard Worker template<typename TSubclass> class GrNonAtomicRef : public SkNoncopyable { 21*c8dee2aaSAndroid Build Coastguard Worker public: GrNonAtomicRef()22*c8dee2aaSAndroid Build Coastguard Worker GrNonAtomicRef() : fRefCnt(1) {} 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG ~GrNonAtomicRef()25*c8dee2aaSAndroid Build Coastguard Worker ~GrNonAtomicRef() { 26*c8dee2aaSAndroid Build Coastguard Worker // fRefCnt can be one when a subclass is created statically 27*c8dee2aaSAndroid Build Coastguard Worker SkASSERT((0 == fRefCnt || 1 == fRefCnt)); 28*c8dee2aaSAndroid Build Coastguard Worker // Set to invalid values. 29*c8dee2aaSAndroid Build Coastguard Worker fRefCnt = -10; 30*c8dee2aaSAndroid Build Coastguard Worker } 31*c8dee2aaSAndroid Build Coastguard Worker #endif 32*c8dee2aaSAndroid Build Coastguard Worker unique()33*c8dee2aaSAndroid Build Coastguard Worker bool unique() const { return 1 == fRefCnt; } 34*c8dee2aaSAndroid Build Coastguard Worker 35*c8dee2aaSAndroid Build Coastguard Worker // We allow this getter because this type is not thread-safe, meaning only one thread should 36*c8dee2aaSAndroid Build Coastguard Worker // have ownership and be manipulating the ref count or querying this. refCnt()37*c8dee2aaSAndroid Build Coastguard Worker int refCnt() const { return fRefCnt; } 38*c8dee2aaSAndroid Build Coastguard Worker ref()39*c8dee2aaSAndroid Build Coastguard Worker void ref() const { 40*c8dee2aaSAndroid Build Coastguard Worker // Once the ref cnt reaches zero it should never be ref'ed again. 41*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fRefCnt > 0); 42*c8dee2aaSAndroid Build Coastguard Worker ++fRefCnt; 43*c8dee2aaSAndroid Build Coastguard Worker } 44*c8dee2aaSAndroid Build Coastguard Worker unref()45*c8dee2aaSAndroid Build Coastguard Worker void unref() const { 46*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fRefCnt > 0); 47*c8dee2aaSAndroid Build Coastguard Worker --fRefCnt; 48*c8dee2aaSAndroid Build Coastguard Worker if (0 == fRefCnt) { 49*c8dee2aaSAndroid Build Coastguard Worker GrTDeleteNonAtomicRef(static_cast<const TSubclass*>(this)); 50*c8dee2aaSAndroid Build Coastguard Worker return; 51*c8dee2aaSAndroid Build Coastguard Worker } 52*c8dee2aaSAndroid Build Coastguard Worker } 53*c8dee2aaSAndroid Build Coastguard Worker 54*c8dee2aaSAndroid Build Coastguard Worker private: 55*c8dee2aaSAndroid Build Coastguard Worker mutable int32_t fRefCnt; 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = SkNoncopyable; 58*c8dee2aaSAndroid Build Coastguard Worker }; 59*c8dee2aaSAndroid Build Coastguard Worker GrTDeleteNonAtomicRef(const T * ref)60*c8dee2aaSAndroid Build Coastguard Workertemplate<typename T> inline void GrTDeleteNonAtomicRef(const T* ref) { 61*c8dee2aaSAndroid Build Coastguard Worker delete ref; 62*c8dee2aaSAndroid Build Coastguard Worker } 63*c8dee2aaSAndroid Build Coastguard Worker 64*c8dee2aaSAndroid Build Coastguard Worker #endif 65