Skip to content

Commit

Permalink
Export of internal Abseil changes
Browse files Browse the repository at this point in the history
--
693f81830b9f9cc8b24a1f38492b8dfcdd1d0e24 by Abseil Team <[email protected]>:

Check that absl::int128 works as a std::chrono::duration::rep.

In particular, validate that ...
  std::chrono::time_point<std::chrono::system_clock,
                          std::chrono::duration<absl::int128,
                                                std::atto>>
is a superset (range and resolution) of absl::Time.

PiperOrigin-RevId: 283370280

--
df6073b686bd44223c6f9070fcceec918c728871 by Gennadiy Rozental <[email protected]>:

Changes thread annotations to use DataGuard() function instead of a specific Mutex.
Remove unused declaration of InvokeCallback.

PiperOrigin-RevId: 283361188

--
b49eb2dd2ee1a0b4c8a7bb1a94e368b81ce5f861 by Abseil Team <[email protected]>:

Rewrite GetNominalCPUFrequency to use advapi32 instead of shlwapi

Using shlwapi.dll means that gdi32.dll is loaded which then makes process destruction more expensive, which is unacceptable for some uses. There may be other places that pull in gdi32.dll - this just fixes the one.

PiperOrigin-RevId: 282960698

--
b5508afec5099a0fdbb55e39a7cd2993259ed860 by Abseil Team <[email protected]>:

Small typo fix in comments: initiazliation -> initialization

PiperOrigin-RevId: 282891800

--
4319cc419584e91ee74f6ae1a32d88a412fc5c01 by Abseil Team <[email protected]>:

Update c_find_first_of() comment to remove the mention of an ordered container.

PiperOrigin-RevId: 282836540

--
5fcabc0a834dff39a505d5a5fc5403ddeb96028e by Derek Mauro <[email protected]>:

Fix NaCl build, where format checking is broken

PiperOrigin-RevId: 282826202

--
aaf9ad3274c056a2f68e9b8ccada45c9802e2f1e by Derek Mauro <[email protected]>:

Fix more -Wundef warnings

PiperOrigin-RevId: 282799820

--
1fb06150a70ffe98bf4b2d42b2a39d083bf44f8c by Derek Mauro <[email protected]>:

Release support for additional platforms

PiperOrigin-RevId: 282793384

--
fa947fc28624a316fa872d7045b3838b88a0d69b by Derek Mauro <[email protected]>:

Cleanup inconsistent usage of __has_attribute

PiperOrigin-RevId: 282793296

--
990030ad282263d6303c83b780a55fdec8e90d43 by Gennadiy Rozental <[email protected]>:

Eliminate the pointer in absl::Flag, which points to n space where we were storing flag's default value. We also eliminate additional (now unnecessary) allocation for flag's default value.
Instead we'll initialize the flags value directly from the value specified in ABSL_FLAG.
If the default value is updated via the call to SetCommandLineOptionWithMode we are replacing pointer to initialization routine to pointer to new default value.

PiperOrigin-RevId: 282637616
GitOrigin-RevId: 693f81830b9f9cc8b24a1f38492b8dfcdd1d0e24
Change-Id: I6f2edd8ef844de09aa2c182a7ca3133a22364792
  • Loading branch information
Abseil Team authored and mbxx committed Dec 2, 2019
1 parent 0514227 commit a4b757b
Show file tree
Hide file tree
Showing 20 changed files with 200 additions and 114 deletions.
3 changes: 2 additions & 1 deletion absl/algorithm/container.h
Original file line number Diff line number Diff line change
Expand Up @@ -268,7 +268,8 @@ container_algorithm_internal::ContainerIter<Sequence1> c_find_end(
// c_find_first_of()
//
// Container-based version of the <algorithm> `std::find_first_of()` function to
// find the first elements in an ordered set within a container.
// find the first element within the container that is also within the options
// container.
template <typename C1, typename C2>
container_algorithm_internal::ContainerIter<C1> c_find_first_of(C1& container,
C2& options) {
Expand Down
2 changes: 1 addition & 1 deletion absl/base/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ cc_library(
copts = ABSL_DEFAULT_COPTS,
linkopts = select({
"//absl:windows": [
"-DEFAULTLIB:shlwapi.lib",
"-DEFAULTLIB:advapi32.lib",
],
"//conditions:default": ["-pthread"],
}) + ABSL_DEFAULT_LINKOPTS,
Expand Down
2 changes: 1 addition & 1 deletion absl/base/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ absl_cc_library(
LINKOPTS
${ABSL_DEFAULT_LINKOPTS}
$<$<BOOL:${LIBRT}>:${LIBRT}>
$<$<BOOL:${MINGW}>:"shlwapi">
$<$<BOOL:${MINGW}>:"advapi32">
DEPS
absl::atomic_hook
absl::base_internal
Expand Down
2 changes: 1 addition & 1 deletion absl/base/internal/atomic_hook.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ class AtomicHook<ReturnType (*)(Args...)> {
explicit constexpr AtomicHook(FnPtr default_fn)
: hook_(default_fn), default_fn_(default_fn) {}
#else
// On MSVC, this function sometimes executes after dynamic initiazliation =(.
// On MSVC, this function sometimes executes after dynamic initialization =(.
// If a non-zero `hook_` has been installed by a dynamic initializer, we want
// to preserve it. If not, `hook_` will be zero initialized and we have no
// need to set it to `kUninitialized`.
Expand Down
4 changes: 2 additions & 2 deletions absl/base/internal/raw_logging.cc
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,9 @@
// this, consider moving both to config.h instead.
#if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || \
defined(__Fuchsia__) || defined(__native_client__) || \
defined(__EMSCRIPTEN__)
#include <unistd.h>
defined(__EMSCRIPTEN__) || defined(__ASYLO__)

#include <unistd.h>

#define ABSL_HAVE_POSIX_WRITE 1
#define ABSL_LOW_LEVEL_WRITE_SUPPORTED 1
Expand Down
26 changes: 17 additions & 9 deletions absl/base/internal/sysinfo.cc
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
#include "absl/base/attributes.h"

#ifdef _WIN32
#include <shlwapi.h>
#include <windows.h>
#else
#include <fcntl.h>
Expand Down Expand Up @@ -76,14 +75,23 @@ static int GetNumCPUs() {
#if defined(_WIN32)

static double GetNominalCPUFrequency() {
DWORD data;
DWORD data_size = sizeof(data);
#pragma comment(lib, "shlwapi.lib") // For SHGetValue().
if (SUCCEEDED(
SHGetValueA(HKEY_LOCAL_MACHINE,
"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0",
"~MHz", nullptr, &data, &data_size))) {
return data * 1e6; // Value is MHz.
#pragma comment(lib, "advapi32.lib") // For Reg* functions.
HKEY key;
// Use the Reg* functions rather than the SH functions because shlwapi.dll
// pulls in gdi32.dll which makes process destruction much more costly.
if (RegOpenKeyExA(HKEY_LOCAL_MACHINE,
"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", 0,
KEY_READ, &key) == ERROR_SUCCESS) {
DWORD type = 0;
DWORD data = 0;
DWORD data_size = sizeof(data);
auto result = RegQueryValueExA(key, "~MHz", 0, &type,
reinterpret_cast<LPBYTE>(&data), &data_size);
RegCloseKey(key);
if (result == ERROR_SUCCESS && type == REG_DWORD &&
data_size == sizeof(data)) {
return data * 1e6; // Value is MHz.
}
}
return 1.0;
}
Expand Down
10 changes: 4 additions & 6 deletions absl/base/macros.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
#include <cassert>
#include <cstddef>

#include "absl/base/attributes.h"
#include "absl/base/optimization.h"
#include "absl/base/port.h"

Expand Down Expand Up @@ -176,12 +177,9 @@ enum LinkerInitialized {
// ABSL_BAD_CALL_IF(c <= -1 || c > 255,
// "'c' must have the value of an unsigned char or EOF");
// #endif // ABSL_BAD_CALL_IF

#if defined(__clang__)
# if __has_attribute(enable_if)
# define ABSL_BAD_CALL_IF(expr, msg) \
__attribute__((enable_if(expr, "Bad call trap"), unavailable(msg)))
# endif
#if ABSL_HAVE_ATTRIBUTE(enable_if)
#define ABSL_BAD_CALL_IF(expr, msg) \
__attribute__((enable_if(expr, "Bad call trap"), unavailable(msg)))
#endif

// ABSL_ASSERT()
Expand Down
8 changes: 4 additions & 4 deletions absl/flags/flag.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,12 +96,12 @@ class Flag {
constexpr Flag(const char* name, const flags_internal::HelpGenFunc help_gen,
const char* filename,
const flags_internal::FlagMarshallingOpFn marshalling_op,
const flags_internal::InitialValGenFunc initial_value_gen)
const flags_internal::FlagDfltGenFunc default_value_gen)
: name_(name),
help_gen_(help_gen),
filename_(filename),
marshalling_op_(marshalling_op),
initial_value_gen_(initial_value_gen),
default_value_gen_(default_value_gen),
inited_(false),
impl_(nullptr) {}
#endif
Expand All @@ -118,7 +118,7 @@ class Flag {
name_,
{flags_internal::FlagHelpSrc(help_gen_),
flags_internal::FlagHelpSrcKind::kGenFunc},
filename_, marshalling_op_, initial_value_gen_);
filename_, marshalling_op_, default_value_gen_);
inited_.store(true, std::memory_order_release);
}

Expand Down Expand Up @@ -157,7 +157,7 @@ class Flag {
const flags_internal::HelpGenFunc help_gen_;
const char* filename_;
const flags_internal::FlagMarshallingOpFn marshalling_op_;
const flags_internal::InitialValGenFunc initial_value_gen_;
const flags_internal::FlagDfltGenFunc default_value_gen_;

mutable std::atomic<bool> inited_;
mutable flags_internal::Flag<T>* impl_;
Expand Down
71 changes: 42 additions & 29 deletions absl/flags/internal/flag.cc
Original file line number Diff line number Diff line change
Expand Up @@ -49,12 +49,11 @@ void FlagImpl::Init() {

absl::MutexLock lock(&locks_->primary_mu);

if (def_ != nullptr) {
if (cur_ != nullptr) {
inited_.store(true, std::memory_order_release);
} else {
// Need to initialize def and cur fields.
def_ = (*initial_value_gen_)();
cur_ = Clone(op_, def_);
// Need to initialize cur field.
cur_ = MakeInitValue().release();
StoreAtomic();
inited_.store(true, std::memory_order_release);
InvokeCallback();
Expand All @@ -63,8 +62,7 @@ void FlagImpl::Init() {

// Ensures that the lazily initialized data is initialized,
// and returns pointer to the mutex guarding flags data.
absl::Mutex* FlagImpl::DataGuard() const
ABSL_LOCK_RETURNED(locks_->primary_mu) {
absl::Mutex* FlagImpl::DataGuard() const {
if (ABSL_PREDICT_FALSE(!inited_.load(std::memory_order_acquire))) {
const_cast<FlagImpl*>(this)->Init();
}
Expand All @@ -79,12 +77,23 @@ void FlagImpl::Destroy() const {

// Values are heap allocated for Abseil Flags.
if (cur_) Delete(op_, cur_);
if (def_) Delete(op_, def_);
if (def_kind_ == FlagDefaultSrcKind::kDynamicValue)
Delete(op_, default_src_.dynamic_value);
}

delete locks_;
}

std::unique_ptr<void, DynValueDeleter> FlagImpl::MakeInitValue() const {
void* res = nullptr;
if (def_kind_ == FlagDefaultSrcKind::kDynamicValue) {
res = Clone(op_, default_src_.dynamic_value);
} else {
res = (*default_src_.gen_func)();
}
return {res, DynValueDeleter{op_}};
}

std::string FlagImpl::Help() const {
return help_source_kind_ == FlagHelpSrcKind::kLiteral ? help_.literal
: help_.gen_func();
Expand All @@ -103,7 +112,8 @@ bool FlagImpl::IsSpecifiedOnCommandLine() const {
std::string FlagImpl::DefaultValue() const {
absl::MutexLock l(DataGuard());

return Unparse(marshalling_op_, def_);
auto obj = MakeInitValue();
return Unparse(marshalling_op_, obj.get());
}

std::string FlagImpl::CurrentValue() const {
Expand All @@ -121,8 +131,7 @@ void FlagImpl::SetCallback(
InvokeCallback();
}

void FlagImpl::InvokeCallback() const
ABSL_EXCLUSIVE_LOCKS_REQUIRED(locks_->primary_mu) {
void FlagImpl::InvokeCallback() const {
if (!callback_) return;

// If the flag has a mutation callback this function invokes it. While the
Expand Down Expand Up @@ -172,23 +181,20 @@ bool FlagImpl::RestoreState(const CommandLineFlag& flag, const void* value,
// 'dst' assuming it is a pointer to the flag's value type. In case if any error
// is encountered in either step, the error message is stored in 'err'
bool FlagImpl::TryParse(const CommandLineFlag& flag, void* dst,
absl::string_view value, std::string* err) const
ABSL_EXCLUSIVE_LOCKS_REQUIRED(locks_->primary_mu) {
void* tentative_value = Clone(op_, def_);
absl::string_view value, std::string* err) const {
auto tentative_value = MakeInitValue();
std::string parse_err;
if (!Parse(marshalling_op_, value, tentative_value, &parse_err)) {
if (!Parse(marshalling_op_, value, tentative_value.get(), &parse_err)) {
auto type_name = flag.Typename();
absl::string_view err_sep = parse_err.empty() ? "" : "; ";
absl::string_view typename_sep = type_name.empty() ? "" : " ";
*err = absl::StrCat("Illegal value '", value, "' specified for",
typename_sep, type_name, " flag '", flag.Name(), "'",
err_sep, parse_err);
Delete(op_, tentative_value);
return false;
}

Copy(op_, tentative_value, dst);
Delete(op_, tentative_value);
Copy(op_, tentative_value.get(), dst);
return true;
}

Expand All @@ -208,7 +214,7 @@ void FlagImpl::Read(const CommandLineFlag& flag, void* dst,
CopyConstruct(op_, cur_, dst);
}

void FlagImpl::StoreAtomic() ABSL_EXCLUSIVE_LOCKS_REQUIRED(locks_->primary_mu) {
void FlagImpl::StoreAtomic() {
size_t data_size = Sizeof(op_);

if (data_size <= sizeof(int64_t)) {
Expand Down Expand Up @@ -299,12 +305,22 @@ bool FlagImpl::SetFromString(const CommandLineFlag& flag,
break;
}
case SET_FLAGS_DEFAULT: {
// modify the flag's default-value
if (!TryParse(flag, def_, value, err)) return false;
// Flag's new default-value.
auto new_default_value = MakeInitValue();

if (!TryParse(flag, new_default_value.get(), value, err)) return false;

if (def_kind_ == FlagDefaultSrcKind::kDynamicValue) {
// Release old default value.
Delete(op_, default_src_.dynamic_value);
}

default_src_.dynamic_value = new_default_value.release();
def_kind_ = FlagDefaultSrcKind::kDynamicValue;

if (!modified_) {
// Need to set both default value *and* current, in this case
Copy(op_, def_, cur_);
Copy(op_, default_src_.dynamic_value, cur_);
StoreAtomic();
InvokeCallback();
}
Expand All @@ -321,9 +337,9 @@ void FlagImpl::CheckDefaultValueParsingRoundtrip(

absl::MutexLock lock(DataGuard());

void* dst = Clone(op_, def_);
auto dst = MakeInitValue();
std::string error;
if (!flags_internal::Parse(marshalling_op_, v, dst, &error)) {
if (!flags_internal::Parse(marshalling_op_, v, dst.get(), &error)) {
ABSL_INTERNAL_LOG(
FATAL,
absl::StrCat("Flag ", flag.Name(), " (from ", flag.Filename(),
Expand All @@ -333,18 +349,15 @@ void FlagImpl::CheckDefaultValueParsingRoundtrip(

// We do not compare dst to def since parsing/unparsing may make
// small changes, e.g., precision loss for floating point types.
Delete(op_, dst);
}

bool FlagImpl::ValidateInputValue(absl::string_view value) const {
absl::MutexLock l(DataGuard());

void* obj = Clone(op_, def_);
auto obj = MakeInitValue();
std::string ignored_error;
const bool result =
flags_internal::Parse(marshalling_op_, value, obj, &ignored_error);
Delete(op_, obj);
return result;
return flags_internal::Parse(marshalling_op_, value, obj.get(),
&ignored_error);
}

} // namespace flags_internal
Expand Down
Loading

0 comments on commit a4b757b

Please sign in to comment.