From 0bccdf82f7057da9bf59f94338e6809284d068ec Mon Sep 17 00:00:00 2001 From: Vitaly Buka Date: Sat, 22 May 2021 22:30:03 -0700 Subject: [PATCH] [NFC][scudo] Add releasePagesToOS test --- .../lib/scudo/standalone/tests/CMakeLists.txt | 1 + .../scudo/standalone/tests/common_test.cpp | 58 +++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 compiler-rt/lib/scudo/standalone/tests/common_test.cpp diff --git a/compiler-rt/lib/scudo/standalone/tests/CMakeLists.txt b/compiler-rt/lib/scudo/standalone/tests/CMakeLists.txt index b84290f75d7999..23854ee022610c 100644 --- a/compiler-rt/lib/scudo/standalone/tests/CMakeLists.txt +++ b/compiler-rt/lib/scudo/standalone/tests/CMakeLists.txt @@ -81,6 +81,7 @@ set(SCUDO_UNIT_TEST_SOURCES checksum_test.cpp chunk_test.cpp combined_test.cpp + common_test.cpp flags_test.cpp list_test.cpp map_test.cpp diff --git a/compiler-rt/lib/scudo/standalone/tests/common_test.cpp b/compiler-rt/lib/scudo/standalone/tests/common_test.cpp new file mode 100644 index 00000000000000..7b35b2494eda33 --- /dev/null +++ b/compiler-rt/lib/scudo/standalone/tests/common_test.cpp @@ -0,0 +1,58 @@ +//===-- common_test.cpp ---------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "internal_defs.h" +#include "tests/scudo_unit_test.h" + +#include "common.h" +#include +#include + +namespace scudo { + +static uptr getResidentMemorySize() { + uptr Size; + uptr Resident; + std::ifstream IFS("/proc/self/statm"); + IFS >> Size; + IFS >> Resident; + return Resident * getPageSizeCached(); +} + +// Fuchsia needs getResidentMemorySize implementation. +TEST(ScudoCommonTest, SKIP_ON_FUCHSIA(ResidentMemorySize)) { + uptr OnStart = getResidentMemorySize(); + EXPECT_GT(OnStart, 0); + + const uptr Size = 1ull << 30; + const uptr Threshold = Size >> 3; + + MapPlatformData Data; + uptr *P = reinterpret_cast( + map(nullptr, Size, "ResidentMemorySize", 0, &Data)); + const uptr N = Size / sizeof(*P); + ASSERT_NE(nullptr, P); + EXPECT_EQ(std::count(P, P + N, 0), N); + EXPECT_LT(getResidentMemorySize() - OnStart, Threshold); + + memset(P, 1, Size); + EXPECT_EQ(std::count(P, P + N, 0), 0); + EXPECT_LT(getResidentMemorySize() - Size, Threshold); + + releasePagesToOS((uptr)P, 0, Size, &Data); + EXPECT_EQ(std::count(P, P + N, 0), N); + // FIXME: does not work with QEMU-user. + // EXPECT_LT(getResidentMemorySize() - OnStart, Threshold) << OnStart << " " + // << getResidentMemorySize(); + + memset(P, 1, Size); + EXPECT_EQ(std::count(P, P + N, 0), 0); + EXPECT_LT(getResidentMemorySize() - Size, Threshold); +} + +} // namespace scudo \ No newline at end of file