implement memory info on freebsd with sysctl
authorFneufneu <fneufneu@xbmc.org>
Mon, 31 Jan 2011 16:46:52 +0000 (17:46 +0100)
committerspiff <spiff@xbmc.org>
Wed, 4 May 2011 19:27:49 +0000 (21:27 +0200)
xbmc/linux/XSyncUtils.cpp

index d41f94d..badccf2 100644 (file)
@@ -104,7 +104,7 @@ bool WINAPI ReleaseMutex( HANDLE hMutex ) {
   return bOk;
 }
 
-#if defined(_LINUX) && !defined(__APPLE__)
+#if defined(_LINUX) && !defined(__APPLE__) && !defined(__FreeBSD__)
 static FILE* procMeminfoFP = NULL;
 #endif
 
@@ -154,6 +154,40 @@ void GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer)
           lpBuffer->dwAvailVirtual  = lpBuffer->dwAvailPhys; // FIXME.
       }
   }
+#elif defined(__FreeBSD__)                                                                                                                                                                   
+  /* sysctl hw.physmem */                                                                                                                                                                    
+  size_t physmem = 0, mem_free = 0, pagesize = 0, swap_free = 0;                                                                                                                             
+  size_t mem_avail = 0, mem_inactive = 0, mem_cache = 0, len = 0;                                                                                                                            
+                                                                                                                                                                                             
+  /* physmem */                                                                                                                                                                              
+  len = sizeof(physmem);                                                                                                                                                                     
+  if (sysctlbyname("hw.physmem", &physmem, &len, NULL, 0) == 0) {                                                                                                                            
+    lpBuffer->dwTotalPhys = physmem;                                                                                                                                                         
+    lpBuffer->dwTotalVirtual = physmem;                                                                                                                                                      
+  }                                                                                                                                                                                          
+  /* pagesize */                                                                                                                                                                             
+  len = sizeof(pagesize);                                                                                                                                                                    
+  if (sysctlbyname("hw.pagesize", &pagesize, &len, NULL, 0) != 0)                                                                                                                            
+    pagesize = 4096;                                                                                                                                                                          
+  /* mem_inactive */                                                                                                                                                                         
+  len = sizeof(mem_inactive);                                                                                                                                                                
+  if (sysctlbyname("vm.stats.vm.v_inactive_count", &mem_inactive, &len, NULL, 0) == 0)                                                                                                       
+    mem_inactive *= pagesize;                                                                                                                                                                 
+  /* mem_cache */                                                                                                                                                                            
+  len = sizeof(mem_cache);                                                                                                                                                                   
+  if (sysctlbyname("vm.stats.vm.v_cache_count", &mem_cache, &len, NULL, 0) == 0)
+    mem_cache *= pagesize;
+  /* mem_free */
+  len = sizeof(mem_free);
+  if (sysctlbyname("vm.stats.vm.v_free_count", &mem_free, &len, NULL, 0) == 0)
+    mem_free *= pagesize;
+
+  /* mem_avail = mem_inactive + mem_cache + mem_free */
+  lpBuffer->dwAvailPhys = mem_inactive + mem_cache + mem_free;
+  lpBuffer->dwAvailVirtual = mem_inactive + mem_cache + mem_free;
+
+  if (sysctlbyname("vm.stats.vm.v_swappgsout", &swap_free, &len, NULL, 0) == 0)
+    lpBuffer->dwAvailPageFile = swap_free * pagesize;
 #else
   struct sysinfo info;
   char name[32];