Files
snmalloc/src/test/perf/low_memory/low-memory.cc
Matthew Parkinson 9d6bf750f7 Clang format.
2020-02-04 13:22:56 +00:00

119 lines
2.1 KiB
C++

#include <iostream>
#include <snmalloc.h>
#include <test/measuretime.h>
#include <test/setup.h>
#include <unordered_set>
#include <vector>
using namespace snmalloc;
struct Node
{
Node* next;
};
class Queue
{
Node* head;
Node* tail;
Node* new_node(size_t size)
{
auto result = (Node*)ThreadAlloc::get()->alloc(size);
result->next = nullptr;
return result;
}
public:
Queue()
{
head = new_node(1);
tail = head;
}
void add(size_t size)
{
tail->next = new_node(size);
tail = tail->next;
}
void try_remove()
{
if (head->next == nullptr)
return;
Node* next = head->next;
ThreadAlloc::get()->dealloc(head);
head = next;
}
};
bool has_pressure()
{
static thread_local uint64_t epoch;
if constexpr (!pal_supports<LowMemoryNotification, GlobalVirtual>)
{
return false;
}
uint64_t current_epoch = default_memory_provider.low_memory_epoch();
bool result = epoch != current_epoch;
epoch = current_epoch;
return result;
}
void reach_pressure(Queue& allocations)
{
size_t size = 4096;
while (!has_pressure())
{
allocations.add(size);
allocations.try_remove();
allocations.add(size);
allocations.add(size);
}
}
void reduce_pressure(Queue& allocations)
{
size_t size = 4096;
for (size_t n = 0; n < 1000; n++)
{
allocations.try_remove();
allocations.try_remove();
allocations.add(size);
}
}
int main(int, char**)
{
#ifndef NDEBUG
Queue allocations;
if constexpr (!pal_supports<LowMemoryNotification, GlobalVirtual>)
{
std::cout << "Pal does not support low-memory notification! Test not run"
<< std::endl;
return 0;
}
# if defined(WIN32) && !defined(SNMALLOC_VA_BITS_64)
std::cout << "32-bit windows not supported for this test." << std::endl;
# else
setup();
for (size_t i = 0; i < 10; i++)
{
reach_pressure(allocations);
std::cout << "Pressure " << i << std::endl;
reduce_pressure(allocations);
}
# endif
#else
std::cout << "Release test only." << std::endl;
#endif
return 0;
}