summaryrefslogtreecommitdiff
path: root/absl
diff options
context:
space:
mode:
authorGravatar Abseil Team <absl-team@google.com>2017-11-13 10:04:29 -0800
committerGravatar John Olson <jolson@google.com>2017-11-13 16:52:47 -0500
commit95ddf85f8075d5645a754bac5742b72ec9c81f2a (patch)
tree71008ea1f200d829507e651f49a5fdb6d92cf1c2 /absl
parent9e94e488f5006172245b2f977ab207ee140aca43 (diff)
Changes imported from Abseil "staging" branch:
- 5677afe8f626bb9db6d8bf9f25ba3d835ffa12d6 Internal TSAN bookkeeping change. by Greg Falcon <gfalcon@google.com> - c7492bad6fe6c8f106d3fcb1f8a939ea73b1a962 MSVC fix. by Alex Strelnikov <strel@google.com> GitOrigin-RevId: 5677afe8f626bb9db6d8bf9f25ba3d835ffa12d6 Change-Id: I1b8497508c8005a094824b4ccf9b220812b81bdb
Diffstat (limited to 'absl')
-rw-r--r--absl/algorithm/container.h26
-rw-r--r--absl/base/internal/spinlock.cc4
-rw-r--r--absl/base/internal/spinlock.h6
-rw-r--r--absl/synchronization/mutex.cc4
4 files changed, 20 insertions, 20 deletions
diff --git a/absl/algorithm/container.h b/absl/algorithm/container.h
index 740e2071..839a6adc 100644
--- a/absl/algorithm/container.h
+++ b/absl/algorithm/container.h
@@ -69,6 +69,12 @@ using std::end;
template <typename C>
using ContainerIter = decltype(begin(std::declval<C&>()));
+// An MSVC bug involving template parameter substitution requires us to use
+// decltype() here instead of just std::pair.
+template <typename C1, typename C2>
+using ContainerIterPairType =
+ decltype(std::make_pair(ContainerIter<C1>(), ContainerIter<C2>()));
+
template <typename C>
using ContainerDifferenceType =
decltype(std::distance(std::declval<ContainerIter<C>>(),
@@ -311,8 +317,7 @@ container_algorithm_internal::ContainerDifferenceType<const C> c_count_if(
// Container-based version of the <algorithm> `std::mismatchf()` function to
// return the first element where two ordered containers differ.
template <typename C1, typename C2>
-std::pair<container_algorithm_internal::ContainerIter<C1>,
- container_algorithm_internal::ContainerIter<C2>>
+container_algorithm_internal::ContainerIterPairType<C1, C2>
c_mismatch(C1& c1, C2& c2) {
return std::mismatch(container_algorithm_internal::c_begin(c1),
container_algorithm_internal::c_end(c1),
@@ -322,8 +327,7 @@ c_mismatch(C1& c1, C2& c2) {
// Overload of c_mismatch() for using a predicate evaluation other than `==` as
// the function's test condition.
template <typename C1, typename C2, typename BinaryPredicate>
-std::pair<container_algorithm_internal::ContainerIter<C1>,
- container_algorithm_internal::ContainerIter<C2>>
+container_algorithm_internal::ContainerIterPairType<C1, C2>
c_mismatch(C1& c1, C2& c2, BinaryPredicate&& pred) {
return std::mismatch(container_algorithm_internal::c_begin(c1),
container_algorithm_internal::c_end(c1),
@@ -869,7 +873,7 @@ void c_stable_sort(C& c, Compare&& comp) {
// c_is_sorted()
//
// Container-based version of the <algorithm> `std::is_sorted()` function
-// to evaluate whether the given containter is sorted in ascending order.
+// to evaluate whether the given container is sorted in ascending order.
template <typename C>
bool c_is_sorted(const C& c) {
return std::is_sorted(container_algorithm_internal::c_begin(c),
@@ -1042,8 +1046,7 @@ container_algorithm_internal::ContainerIter<Sequence> c_upper_bound(
// to return an iterator pair pointing to the first and last elements in a
// sorted container which compare equal to `value`.
template <typename Sequence, typename T>
-std::pair<container_algorithm_internal::ContainerIter<Sequence>,
- container_algorithm_internal::ContainerIter<Sequence>>
+container_algorithm_internal::ContainerIterPairType<Sequence, Sequence>
c_equal_range(Sequence& sequence, T&& value) {
return std::equal_range(container_algorithm_internal::c_begin(sequence),
container_algorithm_internal::c_end(sequence),
@@ -1053,8 +1056,7 @@ c_equal_range(Sequence& sequence, T&& value) {
// Overload of c_equal_range() for performing a `comp` comparison other than
// the default `operator<`.
template <typename Sequence, typename T, typename Compare>
-std::pair<container_algorithm_internal::ContainerIter<Sequence>,
- container_algorithm_internal::ContainerIter<Sequence>>
+container_algorithm_internal::ContainerIterPairType<Sequence, Sequence>
c_equal_range(Sequence& sequence, T&& value, Compare&& comp) {
return std::equal_range(container_algorithm_internal::c_begin(sequence),
container_algorithm_internal::c_end(sequence),
@@ -1437,8 +1439,7 @@ container_algorithm_internal::ContainerIter<Sequence> c_max_element(
// smallest and largest values, respectively, using `operator<` to make the
// comparisons.
template <typename C>
-std::pair<container_algorithm_internal::ContainerIter<C>,
- container_algorithm_internal::ContainerIter<C>>
+container_algorithm_internal::ContainerIterPairType<C, C>
c_minmax_element(C& c) {
return std::minmax_element(container_algorithm_internal::c_begin(c),
container_algorithm_internal::c_end(c));
@@ -1447,8 +1448,7 @@ c_minmax_element(C& c) {
// Overload of c_minmax_element() for performing `comp` comparisons other than
// `operator<`.
template <typename C, typename Compare>
-std::pair<container_algorithm_internal::ContainerIter<C>,
- container_algorithm_internal::ContainerIter<C>>
+container_algorithm_internal::ContainerIterPairType<C, C>
c_minmax_element(C& c, Compare&& comp) {
return std::minmax_element(container_algorithm_internal::c_begin(c),
container_algorithm_internal::c_end(c),
diff --git a/absl/base/internal/spinlock.cc b/absl/base/internal/spinlock.cc
index 517668dc..3ac1f4dc 100644
--- a/absl/base/internal/spinlock.cc
+++ b/absl/base/internal/spinlock.cc
@@ -91,12 +91,12 @@ static inline bool IsCooperative(
// Uncommon constructors.
SpinLock::SpinLock(base_internal::SchedulingMode mode)
: lockword_(IsCooperative(mode) ? kSpinLockCooperative : 0) {
- ABSL_TSAN_MUTEX_CREATE(this, 0);
+ ABSL_TSAN_MUTEX_CREATE(this, __tsan_mutex_not_static);
}
SpinLock::SpinLock(base_internal::LinkerInitialized,
base_internal::SchedulingMode mode) {
- ABSL_TSAN_MUTEX_CREATE(this, __tsan_mutex_linker_init);
+ ABSL_TSAN_MUTEX_CREATE(this, 0);
if (IsCooperative(mode)) {
InitLinkerInitializedAndCooperative();
}
diff --git a/absl/base/internal/spinlock.h b/absl/base/internal/spinlock.h
index 1f50d745..f486f68a 100644
--- a/absl/base/internal/spinlock.h
+++ b/absl/base/internal/spinlock.h
@@ -50,7 +50,7 @@ namespace base_internal {
class LOCKABLE SpinLock {
public:
SpinLock() : lockword_(kSpinLockCooperative) {
- ABSL_TSAN_MUTEX_CREATE(this, 0);
+ ABSL_TSAN_MUTEX_CREATE(this, __tsan_mutex_not_static);
}
// Special constructor for use with static SpinLock objects. E.g.,
@@ -64,7 +64,7 @@ class LOCKABLE SpinLock {
// initializers run.
explicit SpinLock(base_internal::LinkerInitialized) {
// Does nothing; lockword_ is already initialized
- ABSL_TSAN_MUTEX_CREATE(this, __tsan_mutex_linker_init);
+ ABSL_TSAN_MUTEX_CREATE(this, 0);
}
// Constructors that allow non-cooperative spinlocks to be created for use
@@ -73,7 +73,7 @@ class LOCKABLE SpinLock {
SpinLock(base_internal::LinkerInitialized,
base_internal::SchedulingMode mode);
- ~SpinLock() { ABSL_TSAN_MUTEX_DESTROY(this, 0); }
+ ~SpinLock() { ABSL_TSAN_MUTEX_DESTROY(this, __tsan_mutex_not_static); }
// Acquire this SpinLock.
inline void Lock() EXCLUSIVE_LOCK_FUNCTION() {
diff --git a/absl/synchronization/mutex.cc b/absl/synchronization/mutex.cc
index cb0a3a10..32d9e3c2 100644
--- a/absl/synchronization/mutex.cc
+++ b/absl/synchronization/mutex.cc
@@ -675,7 +675,7 @@ static unsigned TsanFlags(Mutex::MuHow how) {
#endif
Mutex::Mutex() : mu_(0) {
- ABSL_TSAN_MUTEX_CREATE(this, 0);
+ ABSL_TSAN_MUTEX_CREATE(this, __tsan_mutex_not_static);
}
static bool DebugOnlyIsExiting() {
@@ -690,7 +690,7 @@ Mutex::~Mutex() {
if (kDebugMode) {
this->ForgetDeadlockInfo();
}
- ABSL_TSAN_MUTEX_DESTROY(this, 0);
+ ABSL_TSAN_MUTEX_DESTROY(this, __tsan_mutex_not_static);
}
void Mutex::EnableDebugLog(const char *name) {