42 MemAdvisor(uint8_t* ptr,
size_t len,
size_t initial_offset)
50 if(physical_offset >=
m_len)
53 length =
m_len - physical_offset;
56 if(physical_offset + length >
m_len)
57 length =
m_len - physical_offset;
60 long page_size = sysconf(_SC_PAGESIZE);
62 throw std::runtime_error(
"Failed to get page size");
65 if(length <
static_cast<size_t>(page_size))
68 uintptr_t base =
reinterpret_cast<uintptr_t
>(
m_ptr);
69 uintptr_t start = base + physical_offset;
70 uintptr_t end = start + length;
73 uintptr_t aligned_start = start & ~(
static_cast<uintptr_t
>(page_size) - 1);
74 uintptr_t aligned_end =
75 (end +
static_cast<uintptr_t
>(page_size) - 1) & ~(
static_cast<uintptr_t
>(page_size) - 1);
77 if(aligned_start >= aligned_end)
80 size_t advise_len = aligned_end - aligned_start;
81 void* advise_addr =
reinterpret_cast<void*
>(aligned_start);
87 advice = MADV_SEQUENTIAL;
96 advice = MADV_DONTNEED;
99 throw std::runtime_error(
"Invalid access pattern");
102 if(madvise(advise_addr, advise_len, advice) != 0)
104 throw std::runtime_error(
"madvise failed");
void advise(size_t virtual_offset, size_t length, GrkAccessPattern pattern)
Definition MemAdvisor.h:46
size_t m_initial_offset
Definition MemAdvisor.h:39
uint8_t * m_ptr
Definition MemAdvisor.h:37
size_t m_len
Definition MemAdvisor.h:38
MemAdvisor(uint8_t *ptr, size_t len, size_t initial_offset)
Definition MemAdvisor.h:42
ResWindow.
Definition CompressedChunkCache.h:36
GrkAccessPattern
Definition IMemAdvisor.h:24
@ ACCESS_SEQUENTIAL
Definition IMemAdvisor.h:25
@ ACCESS_RANDOM
Definition IMemAdvisor.h:26
@ ACCESS_NORMAL
Definition IMemAdvisor.h:27
@ ACCESS_DONTNEED
Definition IMemAdvisor.h:28