Make SkPath fFirstDirection atomic to fix tsan.
There is no API change.
TBR=reed@google.com
BUG=skia:
Review URL: https://codereview.chromium.org/1372103003
diff --git a/src/core/SkPath.cpp b/src/core/SkPath.cpp
index 8da1580..97e3438 100644
--- a/src/core/SkPath.cpp
+++ b/src/core/SkPath.cpp
@@ -36,7 +36,7 @@
class SkAutoDisableDirectionCheck {
public:
SkAutoDisableDirectionCheck(SkPath* path) : fPath(path) {
- fSaved = static_cast<SkPathPriv::FirstDirection>(fPath->fFirstDirection);
+ fSaved = static_cast<SkPathPriv::FirstDirection>(fPath->fFirstDirection.load());
}
~SkAutoDisableDirectionCheck() {
@@ -166,7 +166,8 @@
fLastMoveToIndex = that.fLastMoveToIndex;
fFillType = that.fFillType;
fConvexity = that.fConvexity;
- fFirstDirection = that.fFirstDirection;
+ // Simulate fFirstDirection = that.fFirstDirection;
+ fFirstDirection.store(that.fFirstDirection.load());
fIsVolatile = that.fIsVolatile;
}
@@ -183,7 +184,10 @@
SkTSwap<int>(fLastMoveToIndex, that.fLastMoveToIndex);
SkTSwap<uint8_t>(fFillType, that.fFillType);
SkTSwap<uint8_t>(fConvexity, that.fConvexity);
- SkTSwap<uint8_t>(fFirstDirection, that.fFirstDirection);
+ // Simulate SkTSwap<uint8_t>(fFirstDirection, that.fFirstDirection);
+ uint8_t temp = fFirstDirection;
+ fFirstDirection.store(that.fFirstDirection.load());
+ that.fFirstDirection.store(temp);
SkTSwap<SkBool8>(fIsVolatile, that.fIsVolatile);
}
}
@@ -1495,9 +1499,10 @@
SkScalarMul(matrix.get(SkMatrix::kMScaleX), matrix.get(SkMatrix::kMScaleY)) -
SkScalarMul(matrix.get(SkMatrix::kMSkewX), matrix.get(SkMatrix::kMSkewY));
if (det2x2 < 0) {
- dst->fFirstDirection = SkPathPriv::OppositeFirstDirection((SkPathPriv::FirstDirection)fFirstDirection);
+ dst->fFirstDirection = SkPathPriv::OppositeFirstDirection(
+ (SkPathPriv::FirstDirection)fFirstDirection.load());
} else if (det2x2 > 0) {
- dst->fFirstDirection = fFirstDirection;
+ dst->fFirstDirection = fFirstDirection.load();
} else {
dst->fConvexity = kUnknown_Convexity;
dst->fFirstDirection = SkPathPriv::kUnknown_FirstDirection;
@@ -2475,8 +2480,8 @@
* its cross product.
*/
bool SkPathPriv::CheapComputeFirstDirection(const SkPath& path, FirstDirection* dir) {
- if (kUnknown_FirstDirection != path.fFirstDirection) {
- *dir = static_cast<FirstDirection>(path.fFirstDirection);
+ if (kUnknown_FirstDirection != path.fFirstDirection.load()) {
+ *dir = static_cast<FirstDirection>(path.fFirstDirection.load());
return true;
}
@@ -2484,7 +2489,7 @@
// is unknown, so we don't call isConvex()
if (SkPath::kConvex_Convexity == path.getConvexityOrUnknown()) {
SkASSERT(kUnknown_FirstDirection == path.fFirstDirection);
- *dir = static_cast<FirstDirection>(path.fFirstDirection);
+ *dir = static_cast<FirstDirection>(path.fFirstDirection.load());
return false;
}