1
0
Fork 0
mirror of https://github.com/transmission/transmission synced 2024-12-22 15:54:57 +00:00
transmission/libtransmission/open-files.h

80 lines
2.1 KiB
C
Raw Normal View History

// This file Copyright © Mnemosyne LLC.
2022-08-08 18:05:39 +00:00
// It may be used under GPLv2 (SPDX: GPL-2.0-only), GPLv3 (SPDX: GPL-3.0-only),
// or any future license endorsed by Mnemosyne LLC.
// License text can be found in the licenses/ folder.
#pragma once
#ifndef __TRANSMISSION__
#error only libtransmission should #include this header.
#endif
2022-08-17 16:08:36 +00:00
#include <cstddef> // for size_t
#include <cstdint> // for uintX_t
#include <optional>
2022-07-26 02:45:54 +00:00
#include <string_view>
#include <utility>
2023-11-03 17:03:26 +00:00
#include "libtransmission/transmission.h"
2023-11-03 17:03:26 +00:00
#include "libtransmission/file.h" // tr_sys_file_t
#include "libtransmission/lru-cache.h"
// A pool of open files that are cached while reading / writing torrents' data
class tr_open_files
{
public:
enum class Preallocation
{
None,
Sparse,
Full
};
[[nodiscard]] std::optional<tr_sys_file_t> get(tr_torrent_id_t tor_id, tr_file_index_t file_num, bool writable);
[[nodiscard]] std::optional<tr_sys_file_t> get(
tr_torrent_id_t tor_id,
tr_file_index_t file_num,
bool writable,
std::string_view filename,
Preallocation allocation,
uint64_t file_size);
void close_all();
void close_torrent(tr_torrent_id_t tor_id);
void close_file(tr_torrent_id_t tor_id, tr_file_index_t file_num);
private:
using Key = std::pair<tr_torrent_id_t, tr_file_index_t>;
[[nodiscard]] static Key make_key(tr_torrent_id_t tor_id, tr_file_index_t file_num) noexcept
{
return std::make_pair(tor_id, file_num);
}
struct Val
{
Val() noexcept = default;
Val(Val const&) = delete;
Val& operator=(Val const&) = delete;
2022-05-01 18:06:32 +00:00
Val(Val&& that) noexcept
{
*this = std::move(that);
}
2022-05-01 18:06:32 +00:00
Val& operator=(Val&& that) noexcept
{
std::swap(this->fd_, that.fd_);
std::swap(this->writable_, that.writable_);
return *this;
}
~Val();
tr_sys_file_t fd_ = TR_BAD_SYS_FILE;
bool writable_ = false;
};
static constexpr size_t MaxOpenFiles = 32U;
tr_lru_cache<Key, Val, MaxOpenFiles> pool_;
};