34namespace fs = std::filesystem;
50inline bool is_busy(fs::path
const& path_dir)
52 [[maybe_unused]]
auto __expected_fn = [](
auto&&){
return std::nullopt; };
54 std::vector<std::string>
const pids = std::filesystem::directory_iterator(
"/proc")
56 | std::views::filter([](
auto&& e){
return fs::is_directory(e); })
58 | std::views::transform([](
auto&& e){
return e.path().filename().string(); })
60 | std::views::filter([](
auto&& e){
return not e.empty(); })
62 | std::views::filter([](
auto&& e){
return Catch(std::stoi(e)).has_value(); })
63 | std::ranges::to<std::vector<std::string>>();
65 for (std::string
const& pid : pids)
68 std::ifstream file_info(
"/proc/" + pid +
"/mountinfo");
69 continue_if(not file_info.is_open());
71 auto lines = std::ranges::istream_view<std::string>(file_info);
72 auto it = std::ranges::find_if(lines, [&](
auto const& line)
74 return line.find(path_dir) != std::string::npos;
76 return_if(it != lines.end(),
true,
"D::Busy '{}' due to '{}'", path_dir, *it);
94 using namespace std::chrono;
96 auto const start_time = steady_clock::now();
97 constexpr auto poll_interval = milliseconds(100);
106 auto const elapsed = steady_clock::now() - start_time;
107 if(elapsed >= timeout)
109 auto const timeout_ms = duration_cast<milliseconds>(timeout).count();
110 return Error(
"C::Another instance is running on {} (timeout after {}ms)", path_dir, timeout_ms);
113 std::this_thread::sleep_for(poll_interval);
137[[nodiscard]]
inline std::vector<Instance>
get_instances(fs::path
const& path_dir_instances)
140 auto f_pid = [&](
auto&& e) {
return Catch(std::stoi(e.path().filename().string())).value_or(0); };
142 auto instances = fs::directory_iterator(path_dir_instances)
143 | std::views::transform([&](
auto&& e){
return Instance(f_pid(e), e.path()); })
144 | std::views::filter([&](
auto&& e){
return e.pid > 0; })
145 | std::views::filter([&](
auto&& e){
return fs::exists(fs::path{
"/proc"} / std::to_string(e.pid)); })
146 | std::views::filter([&](
auto&& e){
return e.pid != getpid(); })
147 | std::ranges::to<std::vector<Instance>>();
149 std::ranges::sort(instances, {}, [](
auto&& e){
return e.pid; });
166 std::vector<fs::path> vec_path_dir_layer = fs::directory_iterator(path_dir_layers)
167 | std::views::filter([](
auto&& e){
return fs::is_directory(e.path()); })
168 | std::views::transform([](
auto&& e){
return e.path(); })
169 | std::ranges::to<std::vector<fs::path>>();
170 std::ranges::sort(vec_path_dir_layer);
171 return vec_path_dir_layer;
Enhanced error handling framework built on std::expected.
constexpr auto __expected_fn
Lambda helper for Pop macro error returns.
Simplified macros for common control flow patterns with optional logging.
Filesystem utility functions.
std::vector< fs::path > get_mounted_layers(fs::path const &path_dir_layers)
Get a path for each layer directory.
Value< void > wait_busy(fs::path const &path_dir, std::chrono::nanoseconds timeout)
Waits for a filesystem path to become available (not busy).
bool is_busy(fs::path const &path_dir)
Checks if a filesystem path is currently in use by any active process.
std::vector< Instance > get_instances(fs::path const &path_dir_instances)
Get the running FlatImage instances.
Enhanced expected type with integrated logging capabilities.
pid_t pid
PID of the running instance.
fs::path path
Path to FIM_DIR_INSTANCE.