[NFC][sanitizer] Simplify InternalLowerBound

This commit is contained in:
Vitaly Buka 2020-12-28 17:16:49 -08:00
parent 673b12e76f
commit 4e74480e02
5 changed files with 27 additions and 32 deletions

View File

@ -551,8 +551,7 @@ static void ReportIfNotSuspended(ThreadContextBase *tctx, void *arg) {
const InternalMmapVector<tid_t> &suspended_threads = const InternalMmapVector<tid_t> &suspended_threads =
*(const InternalMmapVector<tid_t> *)arg; *(const InternalMmapVector<tid_t> *)arg;
if (tctx->status == ThreadStatusRunning) { if (tctx->status == ThreadStatusRunning) {
uptr i = InternalLowerBound(suspended_threads, 0, suspended_threads.size(), uptr i = InternalLowerBound(suspended_threads, tctx->os_id);
tctx->os_id, CompareLess<int>());
if (i >= suspended_threads.size() || suspended_threads[i] != tctx->os_id) if (i >= suspended_threads.size() || suspended_threads[i] != tctx->os_id)
Report("Running thread %d was not suspended. False leaks are possible.\n", Report("Running thread %d was not suspended. False leaks are possible.\n",
tctx->os_id); tctx->os_id);

View File

@ -107,9 +107,7 @@ void LockStuffAndStopTheWorld(StopTheWorldCallback callback,
auto params = static_cast<const Params *>(data); auto params = static_cast<const Params *>(data);
uptr begin = reinterpret_cast<uptr>(chunk); uptr begin = reinterpret_cast<uptr>(chunk);
uptr end = begin + size; uptr end = begin + size;
auto i = __sanitizer::InternalLowerBound(params->allocator_caches, 0, auto i = __sanitizer::InternalLowerBound(params->allocator_caches, begin);
params->allocator_caches.size(),
begin, CompareLess<uptr>());
if (i < params->allocator_caches.size() && if (i < params->allocator_caches.size() &&
params->allocator_caches[i] >= begin && params->allocator_caches[i] >= begin &&
end - params->allocator_caches[i] <= sizeof(AllocatorCache)) { end - params->allocator_caches[i] <= sizeof(AllocatorCache)) {

View File

@ -467,6 +467,7 @@ inline int ToLower(int c) {
template<typename T> template<typename T>
class InternalMmapVectorNoCtor { class InternalMmapVectorNoCtor {
public: public:
using value_type = T;
void Initialize(uptr initial_capacity) { void Initialize(uptr initial_capacity) {
capacity_bytes_ = 0; capacity_bytes_ = 0;
size_ = 0; size_ = 0;
@ -651,9 +652,13 @@ void Sort(T *v, uptr size, Compare comp = {}) {
// Works like std::lower_bound: finds the first element that is not less // Works like std::lower_bound: finds the first element that is not less
// than the val. // than the val.
template <class Container, class Value, class Compare> template <class Container,
uptr InternalLowerBound(const Container &v, uptr first, uptr last, class Compare = CompareLess<typename Container::value_type>>
const Value &val, Compare comp) { uptr InternalLowerBound(const Container &v,
const typename Container::value_type &val,
Compare comp = {}) {
uptr first = 0;
uptr last = v.size();
while (last > first) { while (last > first) {
uptr mid = (first + last) / 2; uptr mid = (first + last) / 2;
if (comp(v[mid], val)) if (comp(v[mid], val))

View File

@ -145,8 +145,7 @@ StackTrace StackDepotReverseMap::Get(u32 id) {
if (!map_.size()) if (!map_.size())
return StackTrace(); return StackTrace();
IdDescPair pair = {id, nullptr}; IdDescPair pair = {id, nullptr};
uptr idx = uptr idx = InternalLowerBound(map_, pair, IdDescPair::IdComparator);
InternalLowerBound(map_, 0, map_.size(), pair, IdDescPair::IdComparator);
if (idx > map_.size() || map_[idx].id != id) if (idx > map_.size() || map_[idx].id != id)
return StackTrace(); return StackTrace();
return map_[idx].desc->load(); return map_[idx].desc->load();

View File

@ -226,27 +226,21 @@ bool UptrLess(uptr a, uptr b) {
} }
TEST(SanitizerCommon, InternalLowerBound) { TEST(SanitizerCommon, InternalLowerBound) {
static const uptr kSize = 5; std::vector<int> arr = {1, 3, 5, 7, 11};
int arr[kSize];
arr[0] = 1;
arr[1] = 3;
arr[2] = 5;
arr[3] = 7;
arr[4] = 11;
EXPECT_EQ(0u, InternalLowerBound(arr, 0, kSize, 0, UptrLess)); EXPECT_EQ(0u, InternalLowerBound(arr, 0));
EXPECT_EQ(0u, InternalLowerBound(arr, 0, kSize, 1, UptrLess)); EXPECT_EQ(0u, InternalLowerBound(arr, 1));
EXPECT_EQ(1u, InternalLowerBound(arr, 0, kSize, 2, UptrLess)); EXPECT_EQ(1u, InternalLowerBound(arr, 2));
EXPECT_EQ(1u, InternalLowerBound(arr, 0, kSize, 3, UptrLess)); EXPECT_EQ(1u, InternalLowerBound(arr, 3));
EXPECT_EQ(2u, InternalLowerBound(arr, 0, kSize, 4, UptrLess)); EXPECT_EQ(2u, InternalLowerBound(arr, 4));
EXPECT_EQ(2u, InternalLowerBound(arr, 0, kSize, 5, UptrLess)); EXPECT_EQ(2u, InternalLowerBound(arr, 5));
EXPECT_EQ(3u, InternalLowerBound(arr, 0, kSize, 6, UptrLess)); EXPECT_EQ(3u, InternalLowerBound(arr, 6));
EXPECT_EQ(3u, InternalLowerBound(arr, 0, kSize, 7, UptrLess)); EXPECT_EQ(3u, InternalLowerBound(arr, 7));
EXPECT_EQ(4u, InternalLowerBound(arr, 0, kSize, 8, UptrLess)); EXPECT_EQ(4u, InternalLowerBound(arr, 8));
EXPECT_EQ(4u, InternalLowerBound(arr, 0, kSize, 9, UptrLess)); EXPECT_EQ(4u, InternalLowerBound(arr, 9));
EXPECT_EQ(4u, InternalLowerBound(arr, 0, kSize, 10, UptrLess)); EXPECT_EQ(4u, InternalLowerBound(arr, 10));
EXPECT_EQ(4u, InternalLowerBound(arr, 0, kSize, 11, UptrLess)); EXPECT_EQ(4u, InternalLowerBound(arr, 11));
EXPECT_EQ(5u, InternalLowerBound(arr, 0, kSize, 12, UptrLess)); EXPECT_EQ(5u, InternalLowerBound(arr, 12));
} }
TEST(SanitizerCommon, InternalLowerBoundVsStdLowerBound) { TEST(SanitizerCommon, InternalLowerBoundVsStdLowerBound) {
@ -268,8 +262,8 @@ TEST(SanitizerCommon, InternalLowerBoundVsStdLowerBound) {
for (auto to_find : {val - 1, val, val + 1}) { for (auto to_find : {val - 1, val, val + 1}) {
uptr expected = uptr expected =
std::lower_bound(data.begin(), data.end(), to_find) - data.begin(); std::lower_bound(data.begin(), data.end(), to_find) - data.begin();
EXPECT_EQ(expected, InternalLowerBound(data.data(), 0, data.size(), EXPECT_EQ(expected,
to_find, std::less<int>())); InternalLowerBound(data, to_find, std::less<int>()));
} }
} }
} }