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