sk_ref_cnt_ext_debug.h 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. // Copyright 2013 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #ifndef SKIA_CONFIG_SK_REF_CNT_EXT_DEBUG_H_
  5. #define SKIA_CONFIG_SK_REF_CNT_EXT_DEBUG_H_
  6. #ifdef SKIA_CONFIG_SK_REF_CNT_EXT_RELEASE_H_
  7. #error Only one SkRefCnt should be used.
  8. #endif
  9. #include <atomic>
  10. class SkRefCnt;
  11. namespace WTF {
  12. void adopted(const SkRefCnt*);
  13. void requireAdoption(const SkRefCnt*);
  14. }
  15. // Alternate implementation of SkRefCnt for Chromium debug builds
  16. class SK_API SkRefCnt : public SkRefCntBase {
  17. public:
  18. SkRefCnt();
  19. ~SkRefCnt() override;
  20. void ref() const { SkASSERT(flags_.load() != AdoptionRequired_Flag); SkRefCntBase::ref(); }
  21. void deref() const { SkRefCntBase::unref(); }
  22. private:
  23. void adopted() const { flags_ |= Adopted_Flag; }
  24. void requireAdoption() const { flags_ |= AdoptionRequired_Flag; }
  25. enum {
  26. Adopted_Flag = 0x1,
  27. AdoptionRequired_Flag = 0x2,
  28. };
  29. mutable std::atomic<int> flags_;
  30. friend void WTF::adopted(const SkRefCnt*);
  31. friend void WTF::requireAdoption(const SkRefCnt*);
  32. };
  33. inline SkRefCnt::SkRefCnt() : flags_(0) { }
  34. inline SkRefCnt::~SkRefCnt() { }
  35. // Bootstrap for Blink's WTF::RefPtr
  36. namespace WTF {
  37. inline void adopted(const SkRefCnt* object) {
  38. if (!object)
  39. return;
  40. object->adopted();
  41. }
  42. inline void requireAdoption(const SkRefCnt* object) {
  43. if (!object)
  44. return;
  45. object->requireAdoption();
  46. }
  47. } // namespace WTF
  48. using WTF::adopted;
  49. using WTF::requireAdoption;
  50. #endif // SKIA_CONFIG_SK_REF_CNT_EXT_DEBUG_H_