madvise.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #include "madvise.h"
  2. #include "align.h"
  3. #include "info.h"
  4. #include <util/generic/yexception.h>
  5. #if defined(_win_)
  6. #include <util/system/winint.h>
  7. #else
  8. #include <sys/types.h>
  9. #include <sys/mman.h>
  10. #endif
  11. #ifndef MADV_DONTDUMP /* This flag is defined in sys/mman.h since Linux 3.4, but currently old libc header is in use \
  12. for capability with Ubuntu 12.04, so we need to define it here manually */
  13. #define MADV_DONTDUMP 16 /* Explicity exclude from the core dump, overrides the coredump filter bits */
  14. #endif
  15. #ifndef MADV_DODUMP /* This flag is defined in sys/mman.h since Linux 3.4, but currently old libc header is in use \
  16. for capability with Ubuntu 12.04, so we need to define it here manually */
  17. #define MADV_DODUMP 17 /* Undo the effect of an earlier MADV_DONTDUMP */
  18. #endif
  19. namespace {
  20. void Madvise(int flag, const void* cbegin, size_t size) {
  21. static const size_t pageSize = NSystemInfo::GetPageSize();
  22. void* begin = AlignDown(const_cast<void*>(cbegin), pageSize);
  23. size = AlignUp(size, pageSize);
  24. #if defined(_win_)
  25. if (!VirtualFree((LPVOID)begin, size, flag)) {
  26. TString err(LastSystemErrorText());
  27. ythrow yexception() << "VirtualFree(" << begin << ", " << size << ", " << flag << ")"
  28. << " returned error: " << err;
  29. }
  30. #else
  31. if (-1 == madvise(begin, size, flag)) {
  32. TString err(LastSystemErrorText());
  33. ythrow yexception() << "madvise(" << begin << ", " << size << ", " << flag << ")"
  34. << " returned error: " << err;
  35. }
  36. #endif
  37. }
  38. }
  39. void MadviseSequentialAccess(const void* begin, size_t size) {
  40. #if !defined(_win_)
  41. Madvise(MADV_SEQUENTIAL, begin, size);
  42. #endif
  43. }
  44. void MadviseSequentialAccess(TArrayRef<const char> data) {
  45. MadviseSequentialAccess(data.data(), data.size());
  46. }
  47. void MadviseSequentialAccess(TArrayRef<const ui8> data) {
  48. MadviseSequentialAccess(data.data(), data.size());
  49. }
  50. void MadviseRandomAccess(const void* begin, size_t size) {
  51. #if !defined(_win_)
  52. Madvise(MADV_RANDOM, begin, size);
  53. #endif
  54. }
  55. void MadviseRandomAccess(TArrayRef<const char> data) {
  56. MadviseRandomAccess(data.data(), data.size());
  57. }
  58. void MadviseRandomAccess(TArrayRef<const ui8> data) {
  59. MadviseRandomAccess(data.data(), data.size());
  60. }
  61. void MadviseEvict(const void* begin, size_t size) {
  62. #if defined(_win_)
  63. Madvise(MEM_DECOMMIT, begin, size);
  64. #elif defined(_linux_) || defined(_cygwin_)
  65. Madvise(MADV_DONTNEED, begin, size);
  66. #else // freebsd, osx
  67. Madvise(MADV_FREE, begin, size);
  68. #endif
  69. }
  70. void MadviseEvict(TArrayRef<const char> data) {
  71. MadviseEvict(data.data(), data.size());
  72. }
  73. void MadviseEvict(TArrayRef<const ui8> data) {
  74. MadviseEvict(data.data(), data.size());
  75. }
  76. void MadviseExcludeFromCoreDump(const void* begin, size_t size) {
  77. #if defined(_darwin_)
  78. // Don't try to call function with flag which doesn't work
  79. // https://st.yandex-team.ru/PASSP-31755#6050bbafc68f501f2c22caab
  80. Y_UNUSED(begin);
  81. Y_UNUSED(size);
  82. #elif !defined(_win_)
  83. Madvise(MADV_DONTDUMP, begin, size);
  84. #endif
  85. }
  86. void MadviseExcludeFromCoreDump(TArrayRef<const char> data) {
  87. MadviseExcludeFromCoreDump(data.data(), data.size());
  88. }
  89. void MadviseExcludeFromCoreDump(TArrayRef<const ui8> data) {
  90. MadviseExcludeFromCoreDump(data.data(), data.size());
  91. }
  92. void MadviseIncludeIntoCoreDump(const void* begin, size_t size) {
  93. #if defined(_darwin_)
  94. Y_UNUSED(begin);
  95. Y_UNUSED(size);
  96. #elif !defined(_win_)
  97. Madvise(MADV_DODUMP, begin, size);
  98. #endif
  99. }
  100. void MadviseIncludeIntoCoreDump(TArrayRef<const char> data) {
  101. MadviseIncludeIntoCoreDump(data.data(), data.size());
  102. }
  103. void MadviseIncludeIntoCoreDump(TArrayRef<const ui8> data) {
  104. MadviseIncludeIntoCoreDump(data.data(), data.size());
  105. }