aboutsummaryrefslogtreecommitdiffstats
path: root/util/system/madvise.cpp
diff options
context:
space:
mode:
authorDevtools Arcadia <arcadia-devtools@yandex-team.ru>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /util/system/madvise.cpp
downloadydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'util/system/madvise.cpp')
-rw-r--r--util/system/madvise.cpp126
1 files changed, 126 insertions, 0 deletions
diff --git a/util/system/madvise.cpp b/util/system/madvise.cpp
new file mode 100644
index 0000000000..58c894e3ef
--- /dev/null
+++ b/util/system/madvise.cpp
@@ -0,0 +1,126 @@
+#include "madvise.h"
+#include "align.h"
+#include "info.h"
+
+#include <util/generic/yexception.h>
+
+#if defined(_win_)
+ #include <util/system/winint.h>
+#else
+ #include <sys/types.h>
+ #include <sys/mman.h>
+#endif
+
+#ifndef MADV_DONTDUMP /* This flag is defined in sys/mman.h since Linux 3.4, but currently old libc header is in use \
+ for capability with Ubuntu 12.04, so we need to define it here manually */
+ #define MADV_DONTDUMP 16 /* Explicity exclude from the core dump, overrides the coredump filter bits */
+#endif
+
+#ifndef MADV_DODUMP /* This flag is defined in sys/mman.h since Linux 3.4, but currently old libc header is in use \
+ for capability with Ubuntu 12.04, so we need to define it here manually */
+ #define MADV_DODUMP 17 /* Undo the effect of an earlier MADV_DONTDUMP */
+#endif
+
+namespace {
+ void Madvise(int flag, const void* cbegin, size_t size) {
+ static const size_t pageSize = NSystemInfo::GetPageSize();
+ void* begin = AlignDown(const_cast<void*>(cbegin), pageSize);
+ size = AlignUp(size, pageSize);
+
+#if defined(_win_)
+ if (!VirtualFree((LPVOID)begin, size, flag)) {
+ TString err(LastSystemErrorText());
+ ythrow yexception() << "VirtualFree(" << begin << ", " << size << ", " << flag << ")"
+ << " returned error: " << err;
+ }
+#else
+ if (-1 == madvise(begin, size, flag)) {
+ TString err(LastSystemErrorText());
+ ythrow yexception() << "madvise(" << begin << ", " << size << ", " << flag << ")"
+ << " returned error: " << err;
+ }
+#endif
+ }
+}
+
+void MadviseSequentialAccess(const void* begin, size_t size) {
+#if !defined(_win_)
+ Madvise(MADV_SEQUENTIAL, begin, size);
+#endif
+}
+
+void MadviseSequentialAccess(TArrayRef<const char> data) {
+ MadviseSequentialAccess(data.data(), data.size());
+}
+
+void MadviseSequentialAccess(TArrayRef<const ui8> data) {
+ MadviseSequentialAccess(data.data(), data.size());
+}
+
+void MadviseRandomAccess(const void* begin, size_t size) {
+#if !defined(_win_)
+ Madvise(MADV_RANDOM, begin, size);
+#endif
+}
+
+void MadviseRandomAccess(TArrayRef<const char> data) {
+ MadviseRandomAccess(data.data(), data.size());
+}
+
+void MadviseRandomAccess(TArrayRef<const ui8> data) {
+ MadviseRandomAccess(data.data(), data.size());
+}
+
+void MadviseEvict(const void* begin, size_t size) {
+#if defined(_win_)
+ Madvise(MEM_DECOMMIT, begin, size);
+#elif defined(_linux_) || defined(_cygwin_)
+ Madvise(MADV_DONTNEED, begin, size);
+#else // freebsd, osx
+ Madvise(MADV_FREE, begin, size);
+#endif
+}
+
+void MadviseEvict(TArrayRef<const char> data) {
+ MadviseEvict(data.data(), data.size());
+}
+
+void MadviseEvict(TArrayRef<const ui8> data) {
+ MadviseEvict(data.data(), data.size());
+}
+
+void MadviseExcludeFromCoreDump(const void* begin, size_t size) {
+#if defined(_darwin_)
+ // Don't try to call function with flag which doesn't work
+ // https://st.yandex-team.ru/PASSP-31755#6050bbafc68f501f2c22caab
+ Y_UNUSED(begin);
+ Y_UNUSED(size);
+#elif !defined(_win_)
+ Madvise(MADV_DONTDUMP, begin, size);
+#endif
+}
+
+void MadviseExcludeFromCoreDump(TArrayRef<const char> data) {
+ MadviseExcludeFromCoreDump(data.data(), data.size());
+}
+
+void MadviseExcludeFromCoreDump(TArrayRef<const ui8> data) {
+ MadviseExcludeFromCoreDump(data.data(), data.size());
+}
+
+void MadviseIncludeIntoCoreDump(const void* begin, size_t size) {
+#if defined(_darwin_)
+ Y_UNUSED(begin);
+ Y_UNUSED(size);
+#elif !defined(_win_)
+ Madvise(MADV_DODUMP, begin, size);
+#endif
+}
+
+void MadviseIncludeIntoCoreDump(TArrayRef<const char> data) {
+ MadviseIncludeIntoCoreDump(data.data(), data.size());
+}
+
+void MadviseIncludeIntoCoreDump(TArrayRef<const ui8> data) {
+ MadviseIncludeIntoCoreDump(data.data(), data.size());
+}