meminfo_solaris.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. // +build solaris,cgo
  2. package system
  3. import (
  4. "fmt"
  5. "unsafe"
  6. )
  7. // #cgo CFLAGS: -std=c99
  8. // #cgo LDFLAGS: -lkstat
  9. // #include <unistd.h>
  10. // #include <stdlib.h>
  11. // #include <stdio.h>
  12. // #include <kstat.h>
  13. // #include <sys/swap.h>
  14. // #include <sys/param.h>
  15. // struct swaptable *allocSwaptable(int num) {
  16. // struct swaptable *st;
  17. // struct swapent *swapent;
  18. // st = (struct swaptable *)malloc(num * sizeof(swapent_t) + sizeof (int));
  19. // swapent = st->swt_ent;
  20. // for (int i = 0; i < num; i++,swapent++) {
  21. // swapent->ste_path = (char *)malloc(MAXPATHLEN * sizeof (char));
  22. // }
  23. // st->swt_n = num;
  24. // return st;
  25. //}
  26. // void freeSwaptable (struct swaptable *st) {
  27. // struct swapent *swapent = st->swt_ent;
  28. // for (int i = 0; i < st->swt_n; i++,swapent++) {
  29. // free(swapent->ste_path);
  30. // }
  31. // free(st);
  32. // }
  33. // swapent_t getSwapEnt(swapent_t *ent, int i) {
  34. // return ent[i];
  35. // }
  36. // int64_t getPpKernel() {
  37. // int64_t pp_kernel = 0;
  38. // kstat_ctl_t *ksc;
  39. // kstat_t *ks;
  40. // kstat_named_t *knp;
  41. // kid_t kid;
  42. //
  43. // if ((ksc = kstat_open()) == NULL) {
  44. // return -1;
  45. // }
  46. // if ((ks = kstat_lookup(ksc, "unix", 0, "system_pages")) == NULL) {
  47. // return -1;
  48. // }
  49. // if (((kid = kstat_read(ksc, ks, NULL)) == -1) ||
  50. // ((knp = kstat_data_lookup(ks, "pp_kernel")) == NULL)) {
  51. // return -1;
  52. // }
  53. // switch (knp->data_type) {
  54. // case KSTAT_DATA_UINT64:
  55. // pp_kernel = knp->value.ui64;
  56. // break;
  57. // case KSTAT_DATA_UINT32:
  58. // pp_kernel = knp->value.ui32;
  59. // break;
  60. // }
  61. // pp_kernel *= sysconf(_SC_PAGESIZE);
  62. // return (pp_kernel > 0 ? pp_kernel : -1);
  63. // }
  64. import "C"
  65. // Get the system memory info using sysconf same as prtconf
  66. func getTotalMem() int64 {
  67. pagesize := C.sysconf(C._SC_PAGESIZE)
  68. npages := C.sysconf(C._SC_PHYS_PAGES)
  69. return int64(pagesize * npages)
  70. }
  71. func getFreeMem() int64 {
  72. pagesize := C.sysconf(C._SC_PAGESIZE)
  73. npages := C.sysconf(C._SC_AVPHYS_PAGES)
  74. return int64(pagesize * npages)
  75. }
  76. // ReadMemInfo retrieves memory statistics of the host system and returns a
  77. // MemInfo type.
  78. func ReadMemInfo() (*MemInfo, error) {
  79. ppKernel := C.getPpKernel()
  80. MemTotal := getTotalMem()
  81. MemFree := getFreeMem()
  82. SwapTotal, SwapFree, err := getSysSwap()
  83. if ppKernel < 0 || MemTotal < 0 || MemFree < 0 || SwapTotal < 0 ||
  84. SwapFree < 0 {
  85. return nil, fmt.Errorf("error getting system memory info %v\n", err)
  86. }
  87. meminfo := &MemInfo{}
  88. // Total memory is total physical memory less than memory locked by kernel
  89. meminfo.MemTotal = MemTotal - int64(ppKernel)
  90. meminfo.MemFree = MemFree
  91. meminfo.SwapTotal = SwapTotal
  92. meminfo.SwapFree = SwapFree
  93. return meminfo, nil
  94. }
  95. func getSysSwap() (int64, int64, error) {
  96. var tSwap int64
  97. var fSwap int64
  98. var diskblksPerPage int64
  99. num, err := C.swapctl(C.SC_GETNSWP, nil)
  100. if err != nil {
  101. return -1, -1, err
  102. }
  103. st := C.allocSwaptable(num)
  104. _, err = C.swapctl(C.SC_LIST, unsafe.Pointer(st))
  105. if err != nil {
  106. C.freeSwaptable(st)
  107. return -1, -1, err
  108. }
  109. diskblksPerPage = int64(C.sysconf(C._SC_PAGESIZE) >> C.DEV_BSHIFT)
  110. for i := 0; i < int(num); i++ {
  111. swapent := C.getSwapEnt(&st.swt_ent[0], C.int(i))
  112. tSwap += int64(swapent.ste_pages) * diskblksPerPage
  113. fSwap += int64(swapent.ste_free) * diskblksPerPage
  114. }
  115. C.freeSwaptable(st)
  116. return tSwap, fSwap, nil
  117. }