19 #ifndef FILEHANDLER_IMPL
20 #error "This file should not be included directly! Use FileHandler.h instead"
26 template <
typename TFD>
28 auto manager = m_file_manager.lock();
31 UniqueLock unique_lock(m_file_mutex, boost::defer_lock);
32 if (try_lock && !unique_lock.try_lock()) {
44 for (
auto& fd : m_available_fd) {
47 m_available_fd.clear();
48 m_is_readonly =
false;
51 assert(m_available_fd.size() <= 1);
54 if (!m_available_fd.empty()) {
55 auto typed_ptr =
dynamic_cast<TypedFdWrapper<TFD>*
>(m_available_fd.begin()->second.get());
57 m_available_fd.clear();
62 if (m_available_fd.empty()) {
64 auto fd = manager->open<TFD>(m_path,
true, [
this](
FileManager::FileId id) {
return this->close(
id); });
66 m_available_fd[fd.first].reset(
new TypedFdWrapper<TFD>(fd.first,
std::move(fd.second), manager.get()));
69 assert(m_available_fd.size() == 1);
72 fd_ptr =
std::move(m_available_fd.begin()->second);
73 m_available_fd.clear();
76 auto typed_ptr =
dynamic_cast<TypedFdWrapper<TFD>*
>(fd_ptr.get());
77 assert(typed_ptr !=
nullptr);
79 auto id = typed_ptr->m_id;
81 auto return_callback = [
this, id, manager](TFD&& returned_fd) {
87 manager->notifyUsed(
id);
92 template <
typename TFD>
94 auto manager = m_file_manager.lock();
97 SharedLock shared_lock(m_file_mutex, boost::defer_lock);
98 if (try_lock && !shared_lock.try_lock()) {
109 if (!m_is_readonly) {
110 for (
auto& fd : m_available_fd) {
113 m_available_fd.clear();
114 m_is_readonly =
true;
118 auto avail_i = m_available_fd.begin();
119 TypedFdWrapper<TFD>* typed_ptr =
nullptr;
120 while (typed_ptr ==
nullptr && avail_i != m_available_fd.end()) {
121 if ((typed_ptr =
dynamic_cast<TypedFdWrapper<TFD>*
>(avail_i->second.get())) ==
nullptr)
128 auto fd = manager->open<TFD>(m_path,
false, [
this](
FileManager::FileId id) {
return this->close(
id); });
129 typed_ptr =
new TypedFdWrapper<TFD>(fd.first,
std::move(fd.second), manager.get());
131 avail_i = m_available_fd.emplace(fd.first,
std::unique_ptr<TypedFdWrapper<TFD>>(typed_ptr)).first;
134 assert(typed_ptr && avail_i != m_available_fd.end());
137 m_available_fd.erase(avail_i);
141 TypedFdWrapper<TFD>* typed_ptr =
dynamic_cast<TypedFdWrapper<TFD>*
>(fd_ptr.get());
142 assert(typed_ptr !=
nullptr);
144 auto id = typed_ptr->m_id;
146 auto return_callback = [
this, id, manager](TFD&& returned_fd) {
152 manager->notifyUsed(
id);
157 template <
typename TFD>
159 bool write_bool = mode & kWrite;
160 bool try_bool = mode & kTry;
163 return getWriteAccessor<TFD>(try_bool);
165 return getReadAccessor<TFD>(try_bool);
std::unique_ptr< FileAccessor< TFD > > getWriteAccessor(bool try_lock)
std::unique_ptr< FileAccessor< TFD > > getReadAccessor(bool try_lock)
intptr_t FileId
Opaque FileId, its concrete type should only be assumed to be copyable and hashable.
std::unique_ptr< FileAccessor< TFD > > getAccessor(Mode mode=kRead)