]>
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
;