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()) {
42 for (
auto& fd : m_available_fd) {
45 m_available_fd.clear();
46 m_is_readonly =
false;
49 assert(m_available_fd.size() <= 1);
52 if (!m_available_fd.empty()) {
53 auto typed_ptr =
dynamic_cast<TypedFdWrapper<TFD>*
>(m_available_fd.begin()->second.get());
55 m_available_fd.clear();
60 if (m_available_fd.empty()) {
61 auto fd = manager->open<TFD>(m_path,
true, [
this](
FileManager::FileId id) {
return this->close(
id); });
62 m_available_fd[fd.first] =
66 assert(m_available_fd.size() == 1);
69 auto typed_ptr =
dynamic_cast<TypedFdWrapper<TFD>*
>(m_available_fd.begin()->second.get());
71 auto id = typed_ptr->m_id;
72 m_available_fd.clear();
74 auto return_callback = [
this, id, manager](TFD&& returned_fd) {
79 manager->notifyUsed(
id);
84 template <
typename TFD>
86 auto manager = m_file_manager.lock();
89 SharedLock shared_lock(m_file_mutex, boost::defer_lock);
90 if (try_lock && !shared_lock.try_lock()) {
100 for (
auto& fd : m_available_fd) {
103 m_available_fd.clear();
104 m_is_readonly =
true;
108 TypedFdWrapper<TFD>* typed_ptr =
nullptr;
109 auto avail_i = m_available_fd.begin();
110 while (typed_ptr ==
nullptr && avail_i != m_available_fd.end()) {
111 if ((typed_ptr =
dynamic_cast<TypedFdWrapper<TFD>*
>(avail_i->second.get())) ==
nullptr)
117 auto fd = manager->open<TFD>(m_path,
false, [
this](
FileManager::FileId id) {
return this->close(
id); });
118 typed_ptr =
new TypedFdWrapper<TFD>(fd.first,
std::move(fd.second), manager.get());
119 avail_i = m_available_fd.emplace(fd.first,
std::unique_ptr<TypedFdWrapper<TFD>>(typed_ptr)).first;
122 assert(typed_ptr && avail_i != m_available_fd.end());
126 auto id = typed_ptr->m_id;
127 m_available_fd.erase(avail_i);
129 auto return_callback = [
this, id, manager](TFD&& returned_fd) {
134 manager->notifyUsed(
id);
138 template <
typename TFD>
140 bool write_bool = mode & kWrite;
141 bool try_bool = mode & kTry;
144 return getWriteAccessor<TFD>(try_bool);
146 return getReadAccessor<TFD>(try_bool);
std::unique_ptr< FileAccessor< TFD > > getWriteAccessor(bool try_lock)
std::unique_ptr< FileAccessor< TFD > > getReadAccessor(bool try_lock)
FileMetadata * FileId
Opaque FileId, its concrete type should only be assumed to be copyable and hashable.
std::unique_ptr< FileAccessor< TFD > > getAccessor(Mode mode=kRead)