ram.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. /* See LICENSE file for copyright and license details. */
  2. #include <stdio.h>
  3. #include "../util.h"
  4. #if defined(__linux__)
  5. const char *
  6. ram_free(void)
  7. {
  8. long free;
  9. return (pscanf("/proc/meminfo", "MemFree: %ld kB\n", &free) == 1) ?
  10. bprintf("%f", (float)free / 1024 / 1024) : NULL;
  11. }
  12. const char *
  13. ram_perc(void)
  14. {
  15. long total, free, buffers, cached;
  16. return (pscanf("/proc/meminfo",
  17. "MemTotal: %ld kB\n"
  18. "MemFree: %ld kB\n"
  19. "MemAvailable: %ld kB\nBuffers: %ld kB\n"
  20. "Cached: %ld kB\n",
  21. &total, &free, &buffers, &buffers, &cached) == 5) ?
  22. bprintf("%d", 100 * ((total - free) - (buffers + cached)) /
  23. total) :
  24. NULL;
  25. }
  26. const char *
  27. ram_total(void)
  28. {
  29. long total;
  30. return (pscanf("/proc/meminfo", "MemTotal: %ld kB\n", &total) == 1) ?
  31. bprintf("%f", (float)total / 1024 / 1024) : NULL;
  32. }
  33. const char *
  34. ram_used(void)
  35. {
  36. long total, free, buffers, cached;
  37. return (pscanf("/proc/meminfo",
  38. "MemTotal: %ld kB\n"
  39. "MemFree: %ld kB\n"
  40. "MemAvailable: %ld kB\nBuffers: %ld kB\n"
  41. "Cached: %ld kB\n",
  42. &total, &free, &buffers, &buffers, &cached) == 5) ?
  43. bprintf("%f", (float)(total - free - buffers - cached) /
  44. 1024 / 1024) :
  45. NULL;
  46. }
  47. #elif defined(__OpenBSD__)
  48. #include <stdlib.h>
  49. #include <sys/sysctl.h>
  50. #include <sys/types.h>
  51. #include <unistd.h>
  52. #define LOG1024 10
  53. inline int
  54. load_uvmexp(struct uvmexp *uvmexp)
  55. {
  56. int uvmexp_mib[] = {CTL_VM, VM_UVMEXP};
  57. size_t size;
  58. size = sizeof(*uvmexp);
  59. return sysctl(uvmexp_mib, 2, uvmexp, &size, NULL, 0) >= 0 ? 1 : 0;
  60. }
  61. const char *
  62. ram_free(void)
  63. {
  64. struct uvmexp uvmexp;
  65. float free;
  66. int free_pages;
  67. if (load_uvmexp(&uvmexp)) {
  68. free_pages = uvmexp.npages - uvmexp.active;
  69. free = (float)(free_pages << (uvmexp.pageshift - LOG1024)) / 1024 / 1024;
  70. return bprintf("%f", free);
  71. }
  72. return NULL;
  73. }
  74. const char *
  75. ram_perc(void)
  76. {
  77. struct uvmexp uvmexp;
  78. int percent;
  79. if (load_uvmexp(&uvmexp)) {
  80. percent = uvmexp.active * 100 / uvmexp.npages;
  81. return bprintf("%d", percent);
  82. }
  83. return NULL;
  84. }
  85. const char *
  86. ram_total(void)
  87. {
  88. struct uvmexp uvmexp;
  89. float total;
  90. if (load_uvmexp(&uvmexp)) {
  91. total = (float)(uvmexp.npages << (uvmexp.pageshift - LOG1024)) / 1024 / 1024;
  92. return bprintf("%f", total);
  93. }
  94. return NULL;
  95. }
  96. const char *
  97. ram_used(void)
  98. {
  99. struct uvmexp uvmexp;
  100. float used;
  101. if (load_uvmexp(&uvmexp)) {
  102. used = (double) (uvmexp.active * uvmexp.pagesize) /
  103. 1024 / 1024 / 1024;
  104. return bprintf("%f", used);
  105. }
  106. return NULL;
  107. }
  108. #endif