ram.c 2.9 KB

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