blob: bf1a112925d6e097529b15a030a8b2fb6180b6d1 [file] [log] [blame]
/*
* Copyright (c) 2025 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include "common_audio/allocation_counter.h"
#if defined(WEBRTC_ALLOCATION_COUNTER_AVAILABLE)
#include <cstddef>
#include <cstdlib>
#include <vector>
#include "absl/base/attributes.h"
#include "test/gtest.h"
namespace {
#if defined(ABSL_HAVE_THREAD_LOCAL)
ABSL_CONST_INIT thread_local size_t g_new_count = 0u;
ABSL_CONST_INIT thread_local size_t g_delete_count = 0u;
#elif defined(WEBRTC_POSIX)
#error Handle WEBRTC_POSIX
#else
#error Unsupported platform
#endif
} // namespace
void* operator new(size_t s) {
++g_new_count;
return malloc(s);
}
void* operator new[](size_t s) {
++g_new_count;
return malloc(s);
}
void operator delete(void* p) throw() {
++g_delete_count;
return free(p);
}
void operator delete[](void* p) throw() {
++g_delete_count;
return free(p);
}
namespace webrtc {
AllocationCounter::AllocationCounter()
: initial_new_count_(g_new_count), initial_delete_count_(g_delete_count) {}
size_t AllocationCounter::new_count() const {
return g_new_count - initial_new_count_;
}
size_t AllocationCounter::delete_count() const {
return g_delete_count - initial_delete_count_;
}
TEST(AllocationCounterTest, CountsHeapAllocations) {
std::vector<int> v;
AllocationCounter counter;
EXPECT_EQ(counter.new_count(), 0u);
EXPECT_EQ(counter.delete_count(), 0u);
v.resize(1000);
EXPECT_EQ(counter.new_count(), 1u);
EXPECT_EQ(counter.delete_count(), 0u);
v.clear();
v.shrink_to_fit();
EXPECT_EQ(counter.new_count(), 1u);
EXPECT_EQ(counter.delete_count(), 1u);
}
} // namespace webrtc
#endif // defined(WEBRTC_ALLOCATION_COUNTER_AVAILABLE)