@@ -66,7 +66,9 @@ namespace osmium {
6666 class PBFParser final : public Parser {
6767
6868 std::string m_input_buffer{};
69+ std::size_t m_offset = 0 ;
6970 int m_fd;
71+ bool m_want_buffered_pages_removed;
7072
7173 /* *
7274 * Make sure the input data contains at least the specified
@@ -118,17 +120,26 @@ namespace osmium {
118120 * @returns true if size bytes could be read
119121 * false if EOF was encountered
120122 */
121- static bool read_exactly (int fd, char * buffer, std::size_t size) {
123+ bool read_exactly (char * buffer, std::size_t size) {
122124 std::size_t to_read = size;
123125
124126 while (to_read > 0 ) {
125- auto const read_size = osmium::io::detail::reliable_read (fd , buffer + (size - to_read), to_read);
127+ auto const read_size = osmium::io::detail::reliable_read (m_fd , buffer + (size - to_read), to_read);
126128 if (read_size == 0 ) { // EOF
127129 return false ;
128130 }
129131 to_read -= read_size;
130132 }
131133
134+ m_offset += size;
135+
136+ if (m_want_buffered_pages_removed && size > 100 ) {
137+ // The size check is there to avoid the system call
138+ // when we have only been reading a small number of
139+ // bytes, i.e. for a header.
140+ osmium::io::detail::remove_buffered_pages (m_fd, m_offset);
141+ }
142+
132143 return true ;
133144 }
134145
@@ -139,7 +150,7 @@ namespace osmium {
139150 uint32_t read_blob_header_size_from_file () {
140151 if (m_fd != -1 ) {
141152 std::array<char , sizeof (uint32_t )> buffer;
142- if (!read_exactly (m_fd, buffer.data (), buffer.size ())) {
153+ if (!read_exactly (buffer.data (), buffer.size ())) {
143154 return 0 ; // EOF
144155 }
145156 return check_size (get_size_in_network_byte_order (buffer.data ()));
@@ -225,7 +236,7 @@ namespace osmium {
225236 if (m_fd != -1 ) {
226237 buffer.resize (size);
227238
228- if (!read_exactly (m_fd, &*buffer.begin (), size)) {
239+ if (!read_exactly (&*buffer.begin (), size)) {
229240 throw osmium::pbf_error{" unexpected EOF" };
230241 }
231242 } else {
@@ -263,7 +274,8 @@ namespace osmium {
263274
264275 explicit PBFParser (parser_arguments& args) :
265276 Parser(args),
266- m_fd(args.fd) {
277+ m_fd(args.fd),
278+ m_want_buffered_pages_removed(args.want_buffered_pages_removed) {
267279 }
268280
269281 PBFParser (const PBFParser&) = delete ;
0 commit comments