11e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
21e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
31e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// found in the LICENSE file.
41e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#ifndef SK_REF_CNT_EXT_DEBUG_H_
61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define SK_REF_CNT_EXT_DEBUG_H_
71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#ifdef SK_REF_CNT_EXT_RELEASE_H_
91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#error Only one SkRefCnt should be used.
101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Alternate implementation of SkRefCnt for Chromium debug builds
131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class SK_API SkRefCnt : public SkRefCntBase {
141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)public:
151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SkRefCnt() : flags_(0) {}
161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void ref() const { SkASSERT(flags_ != AdoptionRequired_Flag); SkRefCntBase::ref(); }
171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void adopted() const { flags_ |= Adopted_Flag; }
181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void requireAdoption() const { flags_ |= AdoptionRequired_Flag; }
191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void deref() const { SkRefCntBase::unref(); }
201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)private:
211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  enum {
221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    Adopted_Flag = 0x1,
231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    AdoptionRequired_Flag = 0x2,
241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  };
251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  mutable int flags_;
271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Bootstrap for Blink's WTF::RefPtr
301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace WTF {
321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  inline void adopted(const SkRefCnt* object) {
331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (!object)
341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return;
351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    object->adopted();
361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  inline void requireAdoption(const SkRefCnt* object) {
381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (!object)
391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return;
401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    object->requireAdoption();
411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)using WTF::adopted;
451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)using WTF::requireAdoption;
461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
49