<rdar://problem/13498504>
authorHan Ming Ong <hanming@apple.com>
Mon, 25 Mar 2013 20:44:40 +0000 (20:44 +0000)
committerHan Ming Ong <hanming@apple.com>
Mon, 25 Mar 2013 20:44:40 +0000 (20:44 +0000)
 Don't hard code vm page size in profiling code

llvm-svn: 177907

lldb/tools/debugserver/source/MacOSX/MachTask.cpp
lldb/tools/debugserver/source/MacOSX/MachVMMemory.cpp

index 21c10dd..783a751 100644 (file)
@@ -417,12 +417,20 @@ MachTask::GetProfileData (DNBProfileDataScanType scanType)
         
         if (scanType & eProfileMemory)
         {
-            profile_data_stream << "wired:" << vm_stats.wire_count * vm_page_size << ';';
-            profile_data_stream << "active:" << vm_stats.active_count * vm_page_size << ';';
-            profile_data_stream << "inactive:" << vm_stats.inactive_count * vm_page_size << ';';
+            static vm_size_t pagesize;
+            static bool calculated = false;
+            if (!calculated)
+            {
+                calculated = true;
+                host_page_size(mach_host_self(), &pagesize);
+            }
+            
+            profile_data_stream << "wired:" << vm_stats.wire_count * pagesize << ';';
+            profile_data_stream << "active:" << vm_stats.active_count * pagesize << ';';
+            profile_data_stream << "inactive:" << vm_stats.inactive_count * pagesize << ';';
             uint64_t total_used_count = vm_stats.wire_count + vm_stats.inactive_count + vm_stats.active_count;
-            profile_data_stream << "used:" << total_used_count * vm_page_size << ';';
-            profile_data_stream << "free:" << vm_stats.free_count * vm_page_size << ';';
+            profile_data_stream << "used:" << total_used_count * pagesize << ';';
+            profile_data_stream << "free:" << vm_stats.free_count * pagesize << ';';
             
             profile_data_stream << "rprvt:" << rprvt << ';';
             profile_data_stream << "rsize:" << rsize << ';';
index 6ef4342..56d79fa 100644 (file)
@@ -186,7 +186,9 @@ static uint64_t GetStolenPages()
                        if(stolen >= mb128)
             {
                 stolen = (stolen & ~((128 * 1024 * 1024ULL) - 1)); // rounding down
-                stolenPages = stolen/vm_page_size;
+                vm_size_t pagesize = vm_page_size;
+                host_page_size(mach_host_self(), &pagesize);
+                stolenPages = stolen/pagesize;
                        }
                }
        }
@@ -222,7 +224,7 @@ static void GetRegionSizes(task_t task, mach_vm_size_t &rsize, mach_vm_size_t &d
     
     while (1)
     {
-        mach_msg_type_number_t  count;
+        mach_msg_type_number_t count;
         struct vm_region_submap_info_64 info;
         
         count = VM_REGION_SUBMAP_INFO_COUNT_64;
@@ -260,8 +262,16 @@ static void GetRegionSizes(task_t task, mach_vm_size_t &rsize, mach_vm_size_t &d
         }
     }
     
-    rsize = pages_resident * vm_page_size;
-    dirty_size = pages_dirtied * vm_page_size;
+    static vm_size_t pagesize;
+    static bool calculated = false;
+    if (!calculated)
+    {
+        calculated = true;
+        host_page_size(mach_host_self(), &pagesize);
+    }
+    
+    rsize = pages_resident * pagesize;
+    dirty_size = pages_dirtied * pagesize;
 }
 
 // Test whether the virtual address is within the architecture's shared region.
@@ -302,9 +312,16 @@ static void GetMemorySizes(task_t task, cpu_type_t cputype, nub_process_t pid, m
     mach_vm_size_t fw_private = 0;
     
     mach_vm_size_t aliased = 0;
-    mach_vm_size_t pagesize = vm_page_size;
     bool global_shared_text_data_mapped = false;
     
+    static vm_size_t pagesize;
+    static bool calculated = false;
+    if (!calculated)
+    {
+        calculated = true;
+        host_page_size(mach_host_self(), &pagesize);
+    }
+    
     for (mach_vm_address_t addr=0, size=0; ; addr += size)
     {
         vm_region_top_info_data_t info;
@@ -321,7 +338,7 @@ static void GetMemorySizes(task_t task, cpu_type_t cputype, nub_process_t pid, m
             
             // Check if this process has the globally shared text and data regions mapped in.  If so, set global_shared_text_data_mapped to TRUE and avoid checking again.
             if (global_shared_text_data_mapped == FALSE && info.share_mode == SM_EMPTY) {
-                vm_region_basic_info_data_64_t  b_info;
+                vm_region_basic_info_data_64_t b_info;
                 mach_vm_address_t b_addr = addr;
                 mach_vm_size_t b_size = size;
                 count = VM_REGION_BASIC_INFO_COUNT_64;