diff options
Diffstat (limited to 'vbench/src/vbench/core/mapped_file_input.cpp')
-rw-r--r-- | vbench/src/vbench/core/mapped_file_input.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/vbench/src/vbench/core/mapped_file_input.cpp b/vbench/src/vbench/core/mapped_file_input.cpp new file mode 100644 index 00000000000..c4edc619e5d --- /dev/null +++ b/vbench/src/vbench/core/mapped_file_input.cpp @@ -0,0 +1,41 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#include <vespa/fastos/fastos.h> +#include "mapped_file_input.h" + +namespace vbench { + +MappedFileInput::MappedFileInput(const string &name) + : _file(open(name.c_str(), O_RDONLY)), + _data(static_cast<char*>(MAP_FAILED)), + _size(0), + _taint(strfmt("could not open file: %s", name.c_str())), + _pos(0) +{ + struct stat info; + if (_file >= 0 && fstat(_file, &info) == 0) { + _data = static_cast<char*>(mmap(0, info.st_size, + PROT_READ, MAP_SHARED, _file, 0)); + if (_data != MAP_FAILED) { + _size = info.st_size; + madvise(_data, _size, MADV_SEQUENTIAL); + _taint.reset(); + } + } +} + +Memory +MappedFileInput::obtain(size_t bytes, size_t) +{ + return Memory(_data + _pos, std::min(bytes, (_size - _pos))); +} + +Input & +MappedFileInput::evict(size_t bytes) +{ + assert(bytes <= (_size - _pos)); + _pos += bytes; + return *this; +} + +} // namespace vbench |