summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--FAQ.md (renamed from absl/FAQ.md)0
-rwxr-xr-xabsl/abseil.podspec.gen.py18
-rw-r--r--absl/base/config.h14
-rw-r--r--absl/container/node_hash_set.h4
-rw-r--r--absl/debugging/failure_signal_handler.cc13
-rw-r--r--absl/flags/BUILD.bazel1
-rw-r--r--absl/flags/CMakeLists.txt1
-rw-r--r--absl/flags/internal/flag.cc29
-rw-r--r--absl/flags/internal/flag.h19
-rwxr-xr-xci/macos_xcode_cmake.sh1
10 files changed, 44 insertions, 56 deletions
diff --git a/absl/FAQ.md b/FAQ.md
index af721307..af721307 100644
--- a/absl/FAQ.md
+++ b/FAQ.md
diff --git a/absl/abseil.podspec.gen.py b/absl/abseil.podspec.gen.py
index 2bf153c0..6aefb794 100755
--- a/absl/abseil.podspec.gen.py
+++ b/absl/abseil.podspec.gen.py
@@ -46,18 +46,6 @@ Pod::Spec.new do |s|
s.watchos.deployment_target = '2.0'
"""
-# Limited platforms that abseil supports.
-# This is mainly because of sigaltstack unavailable on watchOS.
-LIMITED_SUPPORT_PLATFORMS = [
- "ios.deployment_target = '7.0'",
- "osx.deployment_target = '10.9'",
-]
-
-# Custom specification per rule.
-CUSTOM_SPEC_MAP = {
- "//absl/debugging:failure_signal_handler": LIMITED_SUPPORT_PLATFORMS,
-}
-
# Rule object representing the rule of Bazel BUILD.
Rule = collections.namedtuple(
"Rule", "type name package srcs hdrs textual_hdrs deps visibility testonly")
@@ -200,12 +188,6 @@ def write_podspec_rule(f, rule, depth):
name = get_spec_name(dep.replace(":", "/"))
f.write("{indent}{var}.dependency '{dep}'\n".format(
indent=indent, var=spec_var, dep=name))
- # Writes custom specification.
- custom_spec = CUSTOM_SPEC_MAP.get(rule.package + ":" + rule.name)
- if custom_spec:
- for spec in custom_spec:
- f.write("{indent}{var}.{spec}\n".format(
- indent=indent, var=spec_var, spec=spec))
def write_indented_list(f, leading, values):
diff --git a/absl/base/config.h b/absl/base/config.h
index eac5d268..ee99f946 100644
--- a/absl/base/config.h
+++ b/absl/base/config.h
@@ -316,13 +316,19 @@ static_assert(ABSL_INTERNAL_INLINE_NAMESPACE_STR[0] != 'h' ||
#error ABSL_HAVE_EXCEPTIONS cannot be directly set.
#elif defined(__clang__)
-// TODO(calabrese)
-// Switch to using __cpp_exceptions when we no longer support versions < 3.6.
-// For details on this check, see:
-// http://releases.llvm.org/3.6.0/tools/clang/docs/ReleaseNotes.html#the-exceptions-macro
+
+#if __clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 6)
+// Clang >= 3.6
+#if __has_feature(cxx_exceptions)
+#define ABSL_HAVE_EXCEPTIONS 1
+#endif // __has_feature(cxx_exceptions)
+#else
+// Clang < 3.6
+// http://releases.llvm.org/3.6.0/tools/clang/docs/ReleaseNotes.html#the-exceptions-macro
#if defined(__EXCEPTIONS) && __has_feature(cxx_exceptions)
#define ABSL_HAVE_EXCEPTIONS 1
#endif // defined(__EXCEPTIONS) && __has_feature(cxx_exceptions)
+#endif // __clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 6)
// Handle remaining special cases and default to exceptions being supported.
#elif !(defined(__GNUC__) && (__GNUC__ < 5) && !defined(__EXCEPTIONS)) && \
diff --git a/absl/container/node_hash_set.h b/absl/container/node_hash_set.h
index 0e2dee54..ad54b6dc 100644
--- a/absl/container/node_hash_set.h
+++ b/absl/container/node_hash_set.h
@@ -77,7 +77,7 @@ struct NodeHashSetPolicy;
//
// // Create a node hash set of three strings
// absl::node_hash_map<std::string, std::string> ducks =
-// {"huey", "dewey"}, "louie"};
+// {"huey", "dewey", "louie"};
//
// // Insert a new element into the node hash map
// ducks.insert("donald"};
@@ -111,7 +111,7 @@ class node_hash_set
// * Initializer List constructor
//
// absl::node_hash_set<std::string> set2 =
- // {{"huey"}, {"dewey"}, {"louie"},};
+ // {{"huey"}, {"dewey"}, {"louie"}};
//
// * Copy constructor
//
diff --git a/absl/debugging/failure_signal_handler.cc b/absl/debugging/failure_signal_handler.cc
index 470d6768..cd141ecf 100644
--- a/absl/debugging/failure_signal_handler.cc
+++ b/absl/debugging/failure_signal_handler.cc
@@ -24,6 +24,10 @@
#include <unistd.h>
#endif
+#ifdef __APPLE__
+#include <TargetConditionals.h>
+#endif
+
#ifdef ABSL_HAVE_MMAP
#include <sys/mman.h>
#endif
@@ -44,6 +48,11 @@
#ifndef _WIN32
#define ABSL_HAVE_SIGACTION
+// Apple WatchOS and TVOS don't allow sigaltstack
+#if !(defined(TARGET_OS_WATCH) && TARGET_OS_WATCH) && \
+ !(defined(TARGET_OS_TV) && TARGET_OS_TV)
+#define ABSL_HAVE_SIGALTSTACK
+#endif
#endif
namespace absl {
@@ -117,7 +126,7 @@ const char* FailureSignalToString(int signo) {
} // namespace debugging_internal
-#ifndef _WIN32
+#ifdef ABSL_HAVE_SIGALTSTACK
static bool SetupAlternateStackOnce() {
#if defined(__wasm__) || defined (__asjms__)
@@ -169,7 +178,7 @@ static bool SetupAlternateStackOnce() {
// Returns the appropriate flag for sig_action.sa_flags
// if the system supports using an alternate stack.
static int MaybeSetupAlternateStack() {
-#ifndef _WIN32
+#ifdef ABSL_HAVE_SIGALTSTACK
ABSL_ATTRIBUTE_UNUSED static const bool kOnce = SetupAlternateStackOnce();
return SA_ONSTACK;
#else
diff --git a/absl/flags/BUILD.bazel b/absl/flags/BUILD.bazel
index d2ca5c6f..cdb4e7e8 100644
--- a/absl/flags/BUILD.bazel
+++ b/absl/flags/BUILD.bazel
@@ -41,6 +41,7 @@ cc_library(
":config",
":handle",
":registry",
+ "//absl/base",
"//absl/base:config",
"//absl/base:core_headers",
"//absl/memory",
diff --git a/absl/flags/CMakeLists.txt b/absl/flags/CMakeLists.txt
index 20e66825..1d25f0de 100644
--- a/absl/flags/CMakeLists.txt
+++ b/absl/flags/CMakeLists.txt
@@ -27,6 +27,7 @@ absl_cc_library(
LINKOPTS
${ABSL_DEFAULT_LINKOPTS}
DEPS
+ absl::base
absl::config
absl::flags_config
absl::flags_handle
diff --git a/absl/flags/internal/flag.cc b/absl/flags/internal/flag.cc
index ba70da91..721e411e 100644
--- a/absl/flags/internal/flag.cc
+++ b/absl/flags/internal/flag.cc
@@ -80,41 +80,22 @@ class MutexRelock {
absl::Mutex* mu_;
};
-// This global lock guards the initialization and destruction of data_guard_,
-// which is used to guard the other Flag data.
-ABSL_CONST_INIT static absl::Mutex flag_mutex_lifetime_guard(absl::kConstInit);
-
} // namespace
void FlagImpl::Init() {
- {
- absl::MutexLock lock(&flag_mutex_lifetime_guard);
-
- // Must initialize data guard for this flag.
- if (!is_data_guard_inited_) {
- new (&data_guard_) absl::Mutex;
- is_data_guard_inited_ = true;
- }
- }
+ new (&data_guard_) absl::Mutex;
absl::MutexLock lock(reinterpret_cast<absl::Mutex*>(&data_guard_));
- if (value_.dynamic != nullptr) {
- inited_.store(true, std::memory_order_release);
- } else {
- // Need to initialize cur field.
- value_.dynamic = MakeInitValue().release();
- StoreAtomic();
- inited_.store(true, std::memory_order_release);
- }
+ value_.dynamic = MakeInitValue().release();
+ StoreAtomic();
}
// Ensures that the lazily initialized data is initialized,
// and returns pointer to the mutex guarding flags data.
absl::Mutex* FlagImpl::DataGuard() const {
- if (ABSL_PREDICT_FALSE(!inited_.load(std::memory_order_acquire))) {
- const_cast<FlagImpl*>(this)->Init();
- }
+ absl::call_once(const_cast<FlagImpl*>(this)->init_control_, &FlagImpl::Init,
+ const_cast<FlagImpl*>(this));
// data_guard_ is initialized.
return reinterpret_cast<absl::Mutex*>(&data_guard_);
diff --git a/absl/flags/internal/flag.h b/absl/flags/internal/flag.h
index ef30a22f..b426ccb5 100644
--- a/absl/flags/internal/flag.h
+++ b/absl/flags/internal/flag.h
@@ -24,6 +24,7 @@
#include <string>
#include <type_traits>
+#include "absl/base/call_once.h"
#include "absl/base/config.h"
#include "absl/base/thread_annotations.h"
#include "absl/flags/config.h"
@@ -281,10 +282,8 @@ class FlagImpl {
help_(help.source),
help_source_kind_(static_cast<uint8_t>(help.kind)),
def_kind_(static_cast<uint8_t>(FlagDefaultKind::kGenFunc)),
- is_data_guard_inited_(false),
modified_(false),
on_command_line_(false),
- inited_(false),
counter_(0),
callback_(nullptr),
default_src_(default_value_gen),
@@ -406,20 +405,28 @@ class FlagImpl {
// Indicates if help message was supplied as literal or generator func.
const uint8_t help_source_kind_ : 1;
+ // ------------------------------------------------------------------------
+ // The bytes containing the const bitfields must not be shared with bytes
+ // containing the mutable bitfields.
+ // ------------------------------------------------------------------------
+
+ // Unique tag for absl::call_once call to initialize this flag.
+ //
+ // The placement of this variable between the immutable and mutable bitfields
+ // is important as prevents them from occupying the same byte. If you remove
+ // this variable, make sure to maintain this property.
+ absl::once_flag init_control_;
+
// Mutable flag's state (guarded by `data_guard_`).
// If def_kind_ == kDynamicValue, default_src_ holds a dynamically allocated
// value.
uint8_t def_kind_ : 1 ABSL_GUARDED_BY(*DataGuard());
- // Protects against multiple concurrent constructions of `data_guard_`.
- bool is_data_guard_inited_ : 1;
// Has this flag's value been modified?
bool modified_ : 1 ABSL_GUARDED_BY(*DataGuard());
// Has this flag been specified on command line.
bool on_command_line_ : 1 ABSL_GUARDED_BY(*DataGuard());
- // Indicates that the flag state is initialized.
- std::atomic<bool> inited_;
// Mutation counter
int64_t counter_ ABSL_GUARDED_BY(*DataGuard());
// Optional flag's callback and absl::Mutex to guard the invocations.
diff --git a/ci/macos_xcode_cmake.sh b/ci/macos_xcode_cmake.sh
index 75b0f2d1..a1f4a857 100755
--- a/ci/macos_xcode_cmake.sh
+++ b/ci/macos_xcode_cmake.sh
@@ -36,6 +36,7 @@ for compilation_mode in ${ABSL_CMAKE_BUILD_TYPES}; do
time cmake ${ABSEIL_ROOT} \
-GXcode \
-DCMAKE_BUILD_TYPE=${compilation_mode} \
+ -DCMAKE_CXX_STANDARD=11 \
-DABSL_USE_GOOGLETEST_HEAD=ON \
-DABSL_RUN_TESTS=ON
time cmake --build .