doomgod

Legacy

Nov 21st, 2013
437
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.22 KB | None | 0 0
  1. // return free and total system memory in bytes
  2. uint64_t I_GetFreeMem(uint64_t *total)
  3. {
  4. #ifdef LINUX
  5.   // LINUX covers all the unix-type OS's.
  6.  
  7. #ifdef FREEBSD
  8.     struct  vmmeter sum;
  9.     kvm_t *kd;
  10.     struct nlist namelist[]= {
  11. #define X_SUM   0
  12.     {"_cnt"},
  13.     { NULL }
  14.     };
  15.     if ((kd = kvm_open(NULL, NULL, NULL, O_RDONLY, "kvm_open")) == NULL)
  16.       goto guess;
  17.  
  18.     if (kvm_nlist(kd, namelist) != 0)
  19.     {
  20.     kvm_close (kd);
  21.     goto guess;
  22.     }
  23.     if (kvm_read(kd,namelist[X_SUM].n_value ,&sum, sizeof(sum)) != sizeof(sum))
  24.     {
  25.     kvm_close (kd);
  26.     goto guess;
  27.     }
  28.     kvm_close (kd);
  29.  
  30.     *total = sum.v_page_count * sum.v_page_size;
  31.     return sum.v_free_count * sum.v_page_size;
  32. #elif defined(SOLARIS)
  33.     goto guess;
  34. #else
  35.     // Actual Linux
  36.  
  37. #define MEMINFO_FILE "/proc/meminfo"
  38. #define MEMTOTAL "MemTotal:"
  39. #define MEMFREE "MemFree:"
  40.  
  41.     char buf[1024];    
  42.     char *memTag;
  43.     uint64_t freeKBytes;
  44.     uint64_t totalKBytes;
  45.  
  46.     int meminfo_fd = open(MEMINFO_FILE, O_RDONLY);
  47.     int n = read(meminfo_fd, buf, 1023);
  48.     close(meminfo_fd);
  49.    
  50.     if(n<0)
  51.       goto guess;
  52.    
  53.     buf[n] = '\0';
  54.     if(NULL == (memTag = strstr(buf, MEMTOTAL)))
  55.       goto guess;
  56.        
  57.     memTag += sizeof(MEMTOTAL);
  58.     totalKBytes = atoi(memTag);
  59.    
  60.     if(NULL == (memTag = strstr(buf, MEMFREE)))
  61.       goto guess;
  62.        
  63.     memTag += sizeof(MEMFREE);
  64.     freeKBytes = atoi(memTag);
  65.    
  66.     *total = totalKBytes << 10;
  67.     return freeKBytes << 10;
  68.  guess:
  69.   // make a conservative guess
  70.   *total = 32 << 20;
  71.   return   32 << 20;
  72. #endif // Unix flavors
  73. #elif defined(WIN32)
  74.   // windows
  75. #if defined(WIN_LARGE_MEM) && defined( _WIN32_WINNT ) && (_WIN32_WINNT >= 0x0500)
  76.   // large memory status, only in newer libraries
  77.   MEMORYSTATUSEX statex;
  78.   statex.dwLength = sizeof(statex);
  79.   GlobalMemoryStatusEx(&statex);
  80.   *total = statex.ullTotalPhys;
  81.   return statex.ullAvailPhys;
  82. #else
  83.   // older memory status
  84.   MEMORYSTATUS statex;
  85.   statex.dwLength = sizeof(statex);
  86.   GlobalMemoryStatus(&statex);
  87.   *total = statex.dwTotalPhys;
  88.   return statex.dwAvailPhys;
  89. #endif
  90.  
  91. #else
  92.   // unknown
  93.   // make a conservative guess
  94.   *total = 32 << 20;
  95.   return   32 << 20;
  96. #endif
  97.  
  98. }
Advertisement
Add Comment
Please, Sign In to add comment