X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/143464d58d2bd6378e74eec636961ceb0d32fb91..fe8ab488e9161c46dd9885d58fc52996dc0249ff:/tools/tests/perf_index/perfindex-memory.c diff --git a/tools/tests/perf_index/perfindex-memory.c b/tools/tests/perf_index/perfindex-memory.c new file mode 100644 index 000000000..759468ed9 --- /dev/null +++ b/tools/tests/perf_index/perfindex-memory.c @@ -0,0 +1,84 @@ +#include "perf_index.h" +#include "fail.h" +#include +#include +#include +#include + +static char *memblock; +static size_t memsize; + +size_t hw_memsize(void) { + int mib[2]; + size_t len; + size_t my_memsize; + int retval; + + mib[0] = CTL_HW; + mib[1] = HW_MEMSIZE; + len = sizeof(my_memsize); + + retval = sysctl(mib, 2, &my_memsize, &len, NULL, 0); + + if(retval != 0) + return 0; + + return my_memsize; +} + +DECL_SETUP { + char *memblockfiller; + long long i; + int pgsz = getpagesize(); + + /* Heuristic: use half the physical memory, hopefully this should work on all + * devices. We use the amount of physical memory, rather than some softer + * metric, like amount of free memory, so that the memory allocated is always + * consistent for a given device. + */ + memsize = hw_memsize(); + VERIFY(memsize > 0, "hw_memsize failed"); + memsize = memsize/2; + + memblock = (char*)malloc(memsize); + VERIFY(memblock != NULL, "malloc failed"); + + memblockfiller = memblock; + + /* Do this manually, to make sure everything is paged in */ + for(i=0; i0) { + copy_len = region_len < left ? region_len : left; + memcpy(memblock+region_start+memsize/2, memblock+region_start, copy_len); + left -= copy_len; + } + + return PERFINDEX_SUCCESS; +} + +DECL_CLEANUP { + free(memblock); + return PERFINDEX_SUCCESS; +}