24#include <flow/error/error.hpp>
25#include <flow/common.hpp>
26#include <boost/interprocess/exceptions.hpp>
33template<
typename Func>
39 using flow::error::Runtime_error;
40 using bipc::interprocess_exception;
41 using boost::system::system_category;
43 if (flow::error::exec_void_and_throw_on_error
52 FLOW_LOG_SET_CONTEXT(logger_ptr, Log_component::S_UTIL);
58 catch (
const interprocess_exception& exc)
66 const auto native_code_raw = exc.get_native_error();
67 const auto bipc_err_code_enum = exc.get_error_code();
68 FLOW_LOG_WARNING(
"bipc threw interprocess_exception; will emit some hopefully suitable Flow-IPC Error_code; "
69 "but here are all the details of the original exception: native code int "
70 "[" << native_code_raw <<
"]; bipc error_code_t enum->int "
71 "[" <<
int(bipc_err_code_enum) <<
"]; message = [" << exc.what() <<
"]; "
72 "context = [" << context <<
"].");
74 if (native_code_raw != 0)
76 const auto& sys_err_code = *err_code =
Error_code(native_code_raw, system_category());
77 FLOW_ERROR_SYS_ERROR_LOG_WARNING();
82 *err_code = misc_bipc_lib_error;
89template<
typename Handle_name_func>
92 using fs::directory_iterator;
94 assert(persistent_obj_dev_dir_path.is_absolute() &&
"Expecting absolute path like /dev/shm (by contract).");
101 for (
const auto& dir_entry : directory_iterator(persistent_obj_dev_dir_path, sink))
115# error "We rely on Linux /dev/... (etc.) semantics, where the object-mapped files are classified as regular files."
118 const auto dir_entry_status = dir_entry.status(err_code);
119 if (err_code || !fs::is_regular_file(dir_entry_status))
125 handle_name_func(
Shared_name::ct(dir_entry.path().filename().native()));
129template<
typename Handle_name_func>
133# error "This method relies on/has been tested only with Linux /dev/shm semantics."
static Shared_name ct(const Source &src)
Copy-constructs from a char-sequence container (including string, util::String_view,...
Flow-IPC module containing miscellaneous general-use facilities that ubiquitously used by ~all Flow-I...
void for_each_persistent_impl(const fs::path &persistent_obj_dev_dir_path, const Handle_name_func &handle_name_func)
Implementation of Persistent_object::for_each_persistent(); for example see shm::classic::Pool_arena:...
void for_each_persistent_shm_pool(const Handle_name_func &handle_name_func)
Equivalent to shm::classic::Pool_arena::for_each_persistent().
void op_with_possible_bipc_exception(flow::log::Logger *logger_ptr, Error_code *err_code, const Error_code &misc_bipc_lib_error, String_view context, const Func &func)
Internal (to ipc) utility that invokes the given function that invokes a boost.interprocess operation...
flow::util::String_view String_view
Short-hand for Flow's String_view.
flow::Error_code Error_code
Short-hand for flow::Error_code which is very common.