]>
git.saurik.com Git - apple/xnu.git/blob - tools/tests/perf_index/perfindex-memory.c
1 #include "perf_index.h"
6 #include <sys/sysctl.h>
11 size_t hw_memsize(void) {
19 len
= sizeof(my_memsize
);
21 retval
= sysctl(mib
, 2, &my_memsize
, &len
, NULL
, 0);
32 int pgsz
= getpagesize();
34 /* Heuristic: use half the physical memory, hopefully this should work on all
35 * devices. We use the amount of physical memory, rather than some softer
36 * metric, like amount of free memory, so that the memory allocated is always
37 * consistent for a given device.
39 memsize
= hw_memsize();
40 VERIFY(memsize
> 0, "hw_memsize failed");
43 memblock
= (char*)malloc(memsize
);
44 VERIFY(memblock
!= NULL
, "malloc failed");
46 memblockfiller
= memblock
;
48 /* Do this manually, to make sure everything is paged in */
49 for(i
=0; i
<memsize
; i
+=pgsz
) {
50 memblockfiller
[i
] = 1;
53 return PERFINDEX_SUCCESS
;
56 /* figures out what region of memory to copy, so it does interfere with other
59 long long left
= length
;
60 long long region_len
= memsize
/ num_threads
/ 2;
61 long long region_start
= memsize
/ num_threads
* thread_id
/ 2;
64 if(thread_id
< memsize
/ 2 % num_threads
) {
65 region_start
+= thread_id
;
69 region_start
+= memsize
/ 2 % num_threads
;
73 copy_len
= region_len
< left
? region_len
: left
;
74 memcpy(memblock
+region_start
+memsize
/2, memblock
+region_start
, copy_len
);
78 return PERFINDEX_SUCCESS
;
83 return PERFINDEX_SUCCESS
;