#pragma once
#include <executorch/runtime/core/data_loader.h>
#include <executorch/runtime/core/result.h>
#include <executorch/runtime/platform/compiler.h>
namespace executorch {
namespace extension {
class MmapDataLoader final : public executorch::runtime::DataLoader {
public:
enum class MlockConfig {
NoMlock,
UseMlock,
UseMlockIgnoreErrors,
UseMadvise,
};
static executorch::runtime::Result<MmapDataLoader> from(
const char* file_name,
MlockConfig mlock_config = MlockConfig::UseMlock);
ET_DEPRECATED static executorch::runtime::Result<MmapDataLoader> From(
const char* file_name,
MlockConfig mlock_config = MlockConfig::UseMlock) {
return from(file_name, mlock_config);
}
ET_DEPRECATED
static executorch::runtime::Result<MmapDataLoader> From(
const char* file_name,
bool use_mlock) {
MlockConfig mlock_config =
use_mlock ? MlockConfig::UseMlock : MlockConfig::NoMlock;
return from(file_name, mlock_config);
}
MmapDataLoader(MmapDataLoader&& rhs) noexcept
: file_name_(rhs.file_name_),
file_size_(rhs.file_size_),
page_size_(rhs.page_size_),
fd_(rhs.fd_),
mlock_config_(rhs.mlock_config_) {
const_cast<const char*&>(rhs.file_name_) = nullptr;
const_cast<size_t&>(rhs.file_size_) = 0;
const_cast<size_t&>(rhs.page_size_) = 0;
const_cast<int&>(rhs.fd_) = -1;
const_cast<MlockConfig&>(rhs.mlock_config_) = MlockConfig::NoMlock;
}
~MmapDataLoader() override;
ET_NODISCARD
executorch::runtime::Result<executorch::runtime::FreeableBuffer> load(
size_t offset,
size_t size,
const DataLoader::SegmentInfo& segment_info) const override;
ET_NODISCARD executorch::runtime::Result<size_t> size() const override;
ET_NODISCARD
executorch::runtime::Error load_into(
size_t offset,
size_t size,
ET_UNUSED const SegmentInfo& segment_info,
void* buffer) const override;
private:
MmapDataLoader(
int fd,
size_t file_size,
const char* file_name,
size_t page_size,
MlockConfig mlock_config)
: file_name_(file_name),
file_size_(file_size),
page_size_(page_size),
fd_(fd),
mlock_config_(mlock_config) {}
MmapDataLoader(const MmapDataLoader&) = delete;
MmapDataLoader& operator=(const MmapDataLoader&) = delete;
MmapDataLoader& operator=(MmapDataLoader&&) = delete;
ET_NODISCARD executorch::runtime::Error validate_input(
size_t offset,
size_t size) const;
const char* const file_name_; const size_t file_size_;
const size_t page_size_;
const int fd_; const MlockConfig mlock_config_;
};
} }
namespace torch {
namespace executor {
namespace util {
using ::executorch::extension::MmapDataLoader;
} } }