Skip to content

Commit

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

Add absl::LeakCheckerIsActive to check whether a leak checker is built into the
target and enabled. For LeakSanitizer, it is by default enabled unless
__lsan_is_turned_off() is defined and returns true.

PiperOrigin-RevId: 364654465

--
0a56ff5310b66f9d1ff5e5e2a053335ecfb5c75b by Abseil Team <[email protected]>:

Update absl::FromTM documentation to reflect implementation.

PiperOrigin-RevId: 364388743
GitOrigin-RevId: 4b566a7deeba5db473c83f4924c1d182a002779f
Change-Id: I8df35b761b532e79d620f484153083c3499ef55b
  • Loading branch information
Abseil Team authored and derekmauro committed Mar 24, 2021
1 parent f3eff47 commit 1fdbe1e
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 5 deletions.
2 changes: 2 additions & 0 deletions absl/debugging/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,7 @@ cc_library(
visibility = ["//visibility:private"],
deps = [
"//absl/base:config",
"//absl/base:core_headers",
],
)

Expand All @@ -273,6 +274,7 @@ cc_library(
visibility = ["//visibility:private"],
deps = [
"//absl/base:config",
"//absl/base:core_headers",
],
)

Expand Down
15 changes: 15 additions & 0 deletions absl/debugging/leak_check.cc
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,15 @@
// When lsan is not linked in, these functions are not available,
// therefore Abseil code which depends on these functions is conditioned on the
// definition of LEAK_SANITIZER.
#include "absl/base/attributes.h"
#include "absl/debugging/leak_check.h"

#ifndef LEAK_SANITIZER

namespace absl {
ABSL_NAMESPACE_BEGIN
bool HaveLeakSanitizer() { return false; }
bool LeakCheckerIsActive() { return false; }
void DoIgnoreLeak(const void*) { }
void RegisterLivePointers(const void*, size_t) { }
void UnRegisterLivePointers(const void*, size_t) { }
Expand All @@ -35,9 +37,22 @@ ABSL_NAMESPACE_END

#include <sanitizer/lsan_interface.h>

#if ABSL_HAVE_ATTRIBUTE_WEAK
extern "C" ABSL_ATTRIBUTE_WEAK int __lsan_is_turned_off();
#endif

namespace absl {
ABSL_NAMESPACE_BEGIN
bool HaveLeakSanitizer() { return true; }

#if ABSL_HAVE_ATTRIBUTE_WEAK
bool LeakCheckerIsActive() {
return !(&__lsan_is_turned_off && __lsan_is_turned_off());
}
#else
bool LeakCheckerIsActive() { return true; }
#endif

bool FindAndReportLeaks() { return __lsan_do_recoverable_leak_check(); }
void DoIgnoreLeak(const void* ptr) { __lsan_ignore_object(ptr); }
void RegisterLivePointers(const void* ptr, size_t size) {
Expand Down
6 changes: 6 additions & 0 deletions absl/debugging/leak_check.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,12 @@ ABSL_NAMESPACE_BEGIN
// currently built into this target.
bool HaveLeakSanitizer();

// LeakCheckerIsActive()
//
// Returns true if a leak-checking sanitizer (either ASan or standalone LSan) is
// currently built into this target and is turned on.
bool LeakCheckerIsActive();

// DoIgnoreLeak()
//
// Implements `IgnoreLeak()` below. This function should usually
Expand Down
2 changes: 2 additions & 0 deletions absl/debugging/leak_check_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,10 @@ namespace {
TEST(LeakCheckTest, DetectLeakSanitizer) {
#ifdef ABSL_EXPECT_LEAK_SANITIZER
EXPECT_TRUE(absl::HaveLeakSanitizer());
EXPECT_TRUE(absl::LeakCheckerIsActive());
#else
EXPECT_FALSE(absl::HaveLeakSanitizer());
EXPECT_FALSE(absl::LeakCheckerIsActive());
#endif
}

Expand Down
14 changes: 9 additions & 5 deletions absl/time/time.h
Original file line number Diff line number Diff line change
Expand Up @@ -1180,11 +1180,15 @@ inline Time FromDateTime(int64_t year, int mon, int day, int hour,
//
// Converts the `tm_year`, `tm_mon`, `tm_mday`, `tm_hour`, `tm_min`, and
// `tm_sec` fields to an `absl::Time` using the given time zone. See ctime(3)
// for a description of the expected values of the tm fields. If the indicated
// time instant is not unique (see `absl::TimeZone::At(absl::CivilSecond)`
// above), the `tm_isdst` field is consulted to select the desired instant
// (`tm_isdst` > 0 means DST, `tm_isdst` == 0 means no DST, `tm_isdst` < 0
// means use the post-transition offset).
// for a description of the expected values of the tm fields. If the civil time
// is unique (see `absl::TimeZone::At(absl::CivilSecond)` above), the matching
// time instant is returned. Otherwise, the `tm_isdst` field is consulted to
// choose between the possible results. For a repeated civil time, `tm_isdst !=
// 0` returns the matching DST instant, while `tm_isdst == 0` returns the
// matching non-DST instant. For a skipped civil time there is no matching
// instant, so `tm_isdst != 0` returns the DST instant, and `tm_isdst == 0`
// returns the non-DST instant, that would have matched if the transition never
// happened.
Time FromTM(const struct tm& tm, TimeZone tz);

// ToTM()
Expand Down

0 comments on commit 1fdbe1e

Please sign in to comment.