From 8ba34f82dd3c881c37b9e59d3f650e2401f98d0e Mon Sep 17 00:00:00 2001 From: Yuqian Li Date: Mon, 30 Apr 2018 10:06:44 -0400 Subject: Change SkMatrix44::fTypeMask to atomic Bug: skia:7886 Change-Id: If616b8bf3b50366356b4324760ad82cbc5fd937d Reviewed-on: https://skia-review.googlesource.com/124460 Reviewed-by: Mike Klein Commit-Queue: Yuqian Li --- include/core/SkMatrix44.h | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) (limited to 'include/core/SkMatrix44.h') diff --git a/include/core/SkMatrix44.h b/include/core/SkMatrix44.h index f8b7b9547d..12004ef7d6 100644 --- a/include/core/SkMatrix44.h +++ b/include/core/SkMatrix44.h @@ -8,6 +8,8 @@ #ifndef SkMatrix44_DEFINED #define SkMatrix44_DEFINED +#include + #include "SkMatrix.h" #include "SkScalar.h" @@ -157,7 +159,7 @@ public: SkMatrix44(const SkMatrix44& src) { memcpy(fMat, src.fMat, sizeof(fMat)); - fTypeMask = src.fTypeMask; + fTypeMask.store(src.fTypeMask, std::memory_order_relaxed); } SkMatrix44(const SkMatrix44& a, const SkMatrix44& b) { @@ -167,7 +169,7 @@ public: SkMatrix44& operator=(const SkMatrix44& src) { if (&src != this) { memcpy(fMat, src.fMat, sizeof(fMat)); - fTypeMask = src.fTypeMask; + fTypeMask.store(src.fTypeMask, std::memory_order_relaxed); } return *this; } @@ -210,11 +212,11 @@ public: * transform. */ inline TypeMask getType() const { - if (fTypeMask & kUnknown_Mask) { - fTypeMask = this->computeTypeMask(); + if (fTypeMask.load(std::memory_order_relaxed) & kUnknown_Mask) { + fTypeMask.store(this->computeTypeMask(), std::memory_order_relaxed); } SkASSERT(!(fTypeMask & kUnknown_Mask)); - return (TypeMask)fTypeMask; + return (TypeMask)fTypeMask.load(std::memory_order_relaxed); } /** @@ -454,8 +456,8 @@ public: private: /* This is indexed by [col][row]. */ - SkMScalar fMat[4][4]; - mutable unsigned fTypeMask; + SkMScalar fMat[4][4]; + mutable std::atomic fTypeMask; static constexpr int kUnknown_Mask = 0x80; @@ -479,12 +481,12 @@ private: int computeTypeMask() const; inline void dirtyTypeMask() { - fTypeMask = kUnknown_Mask; + fTypeMask.store(kUnknown_Mask, std::memory_order_relaxed); } inline void setTypeMask(int mask) { SkASSERT(0 == (~(kAllPublic_Masks | kUnknown_Mask) & mask)); - fTypeMask = mask; + fTypeMask.store(mask, std::memory_order_relaxed); } /** @@ -492,7 +494,7 @@ private: * we already know that this matrix is identity. */ inline bool isTriviallyIdentity() const { - return 0 == fTypeMask; + return 0 == fTypeMask.load(std::memory_order_relaxed); } inline const SkMScalar* values() const { return &fMat[0][0]; } -- cgit v1.2.3