Add SkBarriers_tsan.h.
authormtklein <mtklein@chromium.org>
Fri, 6 Jun 2014 13:21:46 +0000 (06:21 -0700)
committerCommit bot <commit-bot@chromium.org>
Fri, 6 Jun 2014 13:21:49 +0000 (06:21 -0700)
Slight counterproposal to crrev.com/310663002.

BUG=skia:

No API changes.

R=bungeman@google.com, mtklein@google.com, reed@google.com

Author: mtklein@chromium.org

Review URL: https://codereview.chromium.org/306373002

include/core/SkPostConfig.h
src/ports/SkBarriers_tsan.h [new file with mode: 0644]
tools/tsan.supp

index 2060789c990b56735512136a45b61818cc5eae53..6e54bfd8b369e98d264e26bc7bc18be3d6b24336 100644 (file)
 #endif
 
 #ifndef SK_BARRIERS_PLATFORM_H
-#  if defined(SK_CPU_ARM32) || defined(SK_CPU_ARM64)
+#  if SK_HAS_COMPILER_FEATURE(thread_sanitizer)
+#    define SK_BARRIERS_PLATFORM_H "../../src/ports/SkBarriers_tsan.h"
+#  elif defined(SK_CPU_ARM32) || defined(SK_CPU_ARM64)
 #    define SK_BARRIERS_PLATFORM_H "../../src/ports/SkBarriers_arm.h"
 #  else
 #    define SK_BARRIERS_PLATFORM_H "../../src/ports/SkBarriers_x86.h"
diff --git a/src/ports/SkBarriers_tsan.h b/src/ports/SkBarriers_tsan.h
new file mode 100644 (file)
index 0000000..ae68b3d
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2014 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef SkBarriers_tsan_DEFINED
+#define SkBarriers_tsan_DEFINED
+
+#include <sanitizer/tsan_interface_atomic.h>
+
+static inline void sk_compiler_barrier() { asm volatile("" : : : "memory"); }
+
+// We'd do this as separate functions, but you can't partially specialize functions...
+template <typename T, size_t bits>
+struct SkBarriers {
+    static T AcquireLoad(T*);
+    static void ReleaseStore(T*, T);
+};
+
+#define SK_BARRIERS(BITS)                                                          \
+    template <typename T>                                                          \
+    struct SkBarriers<T, BITS> {                                                   \
+        static T AcquireLoad(T* ptr) {                                             \
+            return (T)__tsan_atomic ## BITS ## _load((__tsan_atomic ## BITS*)ptr,  \
+                                                     __tsan_memory_order_acquire); \
+        }                                                                          \
+        static void ReleaseStore(T* ptr, T val) {                                  \
+            __tsan_atomic ## BITS ## _store((__tsan_atomic ## BITS*)ptr,           \
+                                            val,                                   \
+                                            __tsan_memory_order_release);          \
+        }                                                                          \
+    }
+SK_BARRIERS(8);
+SK_BARRIERS(16);
+SK_BARRIERS(32);
+SK_BARRIERS(64);
+#undef SK_BARRIERS
+
+template <typename T>
+T sk_acquire_load(T* ptr) { return SkBarriers<T, 8*sizeof(T)>::AcquireLoad(ptr); }
+
+template <typename T>
+void sk_release_store(T* ptr, T val) { SkBarriers<T, 8*sizeof(T)>::ReleaseStore(ptr, val); }
+
+
+#endif//SkBarriers_tsan_DEFINED
index c997058db22d16d4334e4489870ea20e6edc26b3..0b07f62c5972ada3934a8eebd629caa48c815b6c 100644 (file)
@@ -17,15 +17,7 @@ race:SkFontHost_FreeType
 
 # Not threadsafe, should be fixed.
 race:RefFCI
-race:SkString::RefRec
+race:SkString
 
 # Not threadsafe, should be deleted.
 race:SkPDF
-
-# Should be these can be removed once TSAN learns sk_acquire_load / sk_release_store.
-race:SkOnce
-race:SkRefCntBase
-
-# This is SkLazyPtr.  Also can be cleaned up when TSAN learns sk_acquire_load / sk_release_store.
-race:sk_acquire_load
-race:__tsan_atomic64_compare_exchange_val