Skip to content

Commit 8a000cf

Browse files
committed
Add option to use or not use fadvise in decompressors
This way we can make this configurable from outside.
1 parent 7f9c486 commit 8a000cf

3 files changed

Lines changed: 24 additions & 6 deletions

File tree

include/osmium/io/bzip2_compression.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ namespace osmium {
276276

277277
std::string read() override {
278278
const auto offset = ftell(m_file.file());
279-
if (offset > 0) {
279+
if (offset > 0 && want_buffered_pages_removed()) {
280280
osmium::io::detail::remove_buffered_pages(fileno(m_file.file()), static_cast<std::size_t>(offset));
281281
}
282282
#ifdef _MSC_VER
@@ -325,7 +325,9 @@ namespace osmium {
325325

326326
void close() override {
327327
if (m_bzfile) {
328-
osmium::io::detail::remove_buffered_pages(fileno(m_file.file()));
328+
if (want_buffered_pages_removed()) {
329+
osmium::io::detail::remove_buffered_pages(fileno(m_file.file()));
330+
}
329331
#ifdef _MSC_VER
330332
osmium::detail::disable_invalid_parameter_handler diph;
331333
#endif

include/osmium/io/compression.hpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ namespace osmium {
9393
std::atomic<std::size_t> m_file_size{0};
9494
std::atomic<std::size_t> m_offset{0};
9595

96+
std::atomic_bool m_want_buffered_pages_removed{true};
97+
9698
public:
9799

98100
enum {
@@ -133,6 +135,14 @@ namespace osmium {
133135
m_offset = offset;
134136
}
135137

138+
bool want_buffered_pages_removed() const noexcept {
139+
return m_want_buffered_pages_removed;
140+
}
141+
142+
void set_want_buffered_pages_removed(bool value) noexcept {
143+
m_want_buffered_pages_removed = value;
144+
}
145+
136146
}; // class Decompressor
137147

138148
/**
@@ -352,7 +362,9 @@ namespace osmium {
352362
}
353363
} else {
354364
buffer.resize(osmium::io::Decompressor::input_buffer_size);
355-
osmium::io::detail::remove_buffered_pages(m_fd, m_offset);
365+
if (want_buffered_pages_removed()) {
366+
osmium::io::detail::remove_buffered_pages(m_fd, m_offset);
367+
}
356368
const auto nread = detail::reliable_read(m_fd, &*buffer.begin(), osmium::io::Decompressor::input_buffer_size);
357369
buffer.resize(std::string::size_type(nread));
358370
}
@@ -365,7 +377,9 @@ namespace osmium {
365377

366378
void close() override {
367379
if (m_fd >= 0) {
368-
osmium::io::detail::remove_buffered_pages(m_fd);
380+
if (want_buffered_pages_removed()) {
381+
osmium::io::detail::remove_buffered_pages(m_fd);
382+
}
369383
const int fd = m_fd;
370384
m_fd = -1;
371385
osmium::io::detail::reliable_close(fd);

include/osmium/io/gzip_compression.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ namespace osmium {
223223
#else
224224
# if ZLIB_VERNUM >= 0x1240
225225
const auto offset = ::gzoffset(m_gzfile);
226-
if (offset > 0) {
226+
if (offset > 0 && want_buffered_pages_removed()) {
227227
osmium::io::detail::remove_buffered_pages(m_fd, static_cast<std::size_t>(offset));
228228
}
229229
# endif
@@ -243,7 +243,9 @@ namespace osmium {
243243

244244
void close() override {
245245
if (m_gzfile) {
246-
osmium::io::detail::remove_buffered_pages(m_fd);
246+
if (want_buffered_pages_removed()) {
247+
osmium::io::detail::remove_buffered_pages(m_fd);
248+
}
247249
#ifdef _MSC_VER
248250
osmium::detail::disable_invalid_parameter_handler diph;
249251
#endif

0 commit comments

Comments
 (0)