Temporary repository used to save branch code
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

142 lines
4.5 KiB

/**
* @file mimalloc_test.cpp
* @brief mimalloc
*
*
* 1. /
* 2.
* 3. 线
* 4. 线
* 5. API
*/
#include <windows.h>
#include <iostream>
#include <thread>
#include <mimalloc.h>
#define TEST_ASSERT(cond, msg) \
if (!(cond)) { \
std::cerr << "✗ FAILED: " << msg << "\n"; \
std::cerr << " at " << __FILE__ << ":" << __LINE__ << "\n"; \
std::terminate(); \
} else { \
std::cout << "✓ PASSED: " << msg << "\n"; \
}
void test_basic_alloc()
{
std::cout << "\n1. Basic Allocation\n";
void* ptr = mi_malloc(1024);
TEST_ASSERT(ptr != nullptr, "mi_malloc returned non-null");
TEST_ASSERT(mi_is_in_heap_region(ptr), "Memory in mimalloc heap");
size_t usable = mi_usable_size(ptr);
TEST_ASSERT(usable >= 1024, "Usable size >= requested");
std::cout << " Usable size: " << usable << " bytes\n";
mi_free(ptr);
}
void test_aligned_alloc()
{
std::cout << "\n2. Aligned Allocation\n";
void* ptr = mi_aligned_alloc(64, 1024);
TEST_ASSERT(ptr != nullptr, "mi_aligned_alloc returned non-null");
TEST_ASSERT(reinterpret_cast<uintptr_t>(ptr) % 64 == 0, "64-byte alignment");
TEST_ASSERT(mi_is_in_heap_region(ptr), "Aligned memory in heap");
mi_free_aligned(ptr, 64);
}
void test_thread_local()
{
std::cout << "\n3. Thread-local Heap\n";
mi_heap_t* main_heap = mi_heap_get_default();
TEST_ASSERT(main_heap != nullptr, "Main thread has default heap");
void* main_ptr = mi_heap_malloc(main_heap, 256);
TEST_ASSERT(main_ptr != nullptr, "Main heap allocation succeeded");
std::thread t([]() {
mi_heap_t* thread_heap = mi_heap_get_default();
void* thread_ptr = mi_heap_malloc(thread_heap, 128);
if (thread_ptr && mi_is_in_heap_region(thread_ptr)) {
std::cout << " ✓ Thread-local heap works correctly\n";
mi_free(thread_ptr);
}
});
t.join();
mi_free(main_ptr);
}
void test_cross_thread_free()
{
std::cout << "\n4. Cross-thread Free\n";
void* ptr = nullptr;
std::thread t1([&ptr]() {
ptr = mi_malloc(512);
std::cout << " Thread 1 allocated: " << ptr << "\n";
});
t1.join();
if (ptr) {
mi_free(ptr);
std::cout << " ✓ Cross-thread free succeeded\n";
}
}
void test_statistics()
{
std::cout << "\n5. Statistics API\n";
// 进程信息
size_t current_rss, peak_rss, page_faults;
mi_process_info(nullptr, nullptr, nullptr, &current_rss, &peak_rss, nullptr, nullptr, &page_faults);
std::cout << " Current RSS: " << (current_rss / 1024) << " KB\n";
std::cout << " Peak RSS: " << (peak_rss / 1024) << " KB\n";
std::cout << " Page faults: " << page_faults << "\n";
}
int main()
{
SetConsoleOutputCP(CP_UTF8);
std::cout << "╔══════════════════════════════════════════════╗\n";
std::cout << "║ MIMALLOC DYNAMIC LINKING TEST SUITE ║\n";
std::cout << "╚══════════════════════════════════════════════╝\n";
std::cout << "Version: " << mi_version() << "\n";
// 预检查
void* test_ptr = mi_malloc(100);
if (test_ptr && mi_is_in_heap_region(test_ptr)) {
std::cout << "✓ Mimalloc DLL correctly linked\n";
mi_free(test_ptr);
} else {
std::cerr << "✗ Mimalloc linking failed!\n";
return 1;
}
try {
test_basic_alloc();
test_aligned_alloc();
test_thread_local();
test_cross_thread_free();
test_statistics();
std::cout << "\n╔══════════════════════════════════════════════╗\n";
std::cout << "║ 🎉 ALL TESTS PASSED! 🎉 ║\n";
std::cout << "╚══════════════════════════════════════════════╝\n";
return 0;
} catch (...) {
std::cerr << "\n✗ EXCEPTION CAUGHT\n";
return 1;
}
}