12419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt/* 22419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt * Copyright 2015 Google Inc. 32419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt * 42419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt * Use of this source code is governed by a BSD-style license that can be 52419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt * found in the LICENSE file. 62419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt */ 72419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt 82419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt#ifndef GrNonAtomicRef_DEFINED 92419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt#define GrNonAtomicRef_DEFINED 102419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt 112419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt#include "SkRefCnt.h" 122419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt#include "SkTArray.h" 132419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt 142419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt/** 152419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt * A simple non-atomic ref used in the GrBackend when we don't want to pay for the overhead of a 162419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt * threadsafe ref counted object 172419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt */ 184833f39a41e7689db4922fdbb5c1b47ae55f7c8dcdaltontemplate<typename TSubclass> class GrNonAtomicRef : public SkNoncopyable { 192419b360ead17231c555a9e01747b7ffbbfb70e4joshualittpublic: 202419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt GrNonAtomicRef() : fRefCnt(1) {} 214833f39a41e7689db4922fdbb5c1b47ae55f7c8dcdalton 224833f39a41e7689db4922fdbb5c1b47ae55f7c8dcdalton#ifdef SK_DEBUG 234833f39a41e7689db4922fdbb5c1b47ae55f7c8dcdalton ~GrNonAtomicRef() { 242419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt // fRefCnt can be one when a subclass is created statically 252419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt SkASSERT((0 == fRefCnt || 1 == fRefCnt)); 262419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt // Set to invalid values. 274833f39a41e7689db4922fdbb5c1b47ae55f7c8dcdalton fRefCnt = -10; 282419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt } 294833f39a41e7689db4922fdbb5c1b47ae55f7c8dcdalton#endif 302419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt 3128341fad8438b294ed7311edbc68d8cb34a990abcsmartdalton bool unique() const { return 1 == fRefCnt; } 3228341fad8438b294ed7311edbc68d8cb34a990abcsmartdalton 332419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt void ref() const { 342419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt // Once the ref cnt reaches zero it should never be ref'ed again. 352419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt SkASSERT(fRefCnt > 0); 362419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt ++fRefCnt; 372419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt } 382419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt 392419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt void unref() const { 402419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt SkASSERT(fRefCnt > 0); 412419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt --fRefCnt; 422419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt if (0 == fRefCnt) { 434833f39a41e7689db4922fdbb5c1b47ae55f7c8dcdalton GrTDeleteNonAtomicRef(static_cast<const TSubclass*>(this)); 442419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt return; 452419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt } 462419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt } 472419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt 482419b360ead17231c555a9e01747b7ffbbfb70e4joshualittprivate: 492419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt mutable int32_t fRefCnt; 502419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt 512419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt typedef SkNoncopyable INHERITED; 522419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt}; 532419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt 544833f39a41e7689db4922fdbb5c1b47ae55f7c8dcdaltontemplate<typename T> inline void GrTDeleteNonAtomicRef(const T* ref) { 554833f39a41e7689db4922fdbb5c1b47ae55f7c8dcdalton delete ref; 564833f39a41e7689db4922fdbb5c1b47ae55f7c8dcdalton} 574833f39a41e7689db4922fdbb5c1b47ae55f7c8dcdalton 582419b360ead17231c555a9e01747b7ffbbfb70e4joshualitt#endif 59