boost/interprocess/detail/tmp_dir_helpers.hpp больше не присутствует в boost с 1.56
У меня есть старый код, который использует
boost::interprocess::ipcdetail::create_tmp_and_clean_old
переинициализировать boost::message_queue при запуске программы. До повышения 1.56 эта функция находилась в
boost/interprocess/detail/tmp_dir_helpers.hpp
но как только я обновился до 1,57, я понял, что весь заголовок просто исчез... Может кто-нибудь сказать мне правильный способ обработки этого? Есть ли какая-то новая функция / механизм?
1 ответ
Проблема здесь, очевидно, заключается в том, что никогда не следует использовать недокументированные части библиотеки. Они не являются частью API.
В данном конкретном случае это особенно заметно в именах файлов (detail
) и имена пространств имен (ipcdetail
). Но это только бонус: как правило, авторы библиотек "не обязаны" давать такие подсказки.
Таким образом, нет никакой "новой функции / механизма", на самом деле даже нет критических изменений (по всей вероятности, это "изменение" не отражено в примечаниях к выпуску).
Повысить реализацию 1_55
Что сделал create_tmp_and_clean_old
делать?
inline void create_tmp_and_clean_old(std::string &tmp_name)
{
//First get the temp directory
std::string root_tmp_name;
get_tmp_base_dir(root_tmp_name);
//If fails, check that it's because already exists
if(!create_directory(root_tmp_name.c_str())){
error_info info(system_error_code());
if(info.get_error_code() != already_exists_error){
throw interprocess_exception(info);
}
}
#if defined(BOOST_INTERPROCESS_HAS_KERNEL_BOOTTIME)
tmp_folder(tmp_name);
//If fails, check that it's because already exists
if(!create_directory(tmp_name.c_str())){
error_info info(system_error_code());
if(info.get_error_code() != already_exists_error){
throw interprocess_exception(info);
}
}
//Now erase all old directories created in the previous boot sessions
std::string subdir = tmp_name;
subdir.erase(0, root_tmp_name.size()+1);
delete_subdirectories(root_tmp_name, subdir.c_str());
#else
tmp_name = root_tmp_name;
#endif
}
Это только внутренне используется в межпроцессных механизмах Windows (
semaphore
,mutex
,mapped_region
) косвенно через*_intermodule_singleton
,
Как исправить?
Вы можете посмотреть на реализацию классов intermodule_singleton, чтобы увидеть, как они достигают своей цели в 1_56+.
В идеале вы могли бы очень внимательно взглянуть на то, почему вашей программе даже нужно вмешиваться в детали реализации библиотеки на этом уровне (подсказка: скорее всего, она не нужна / лучше ее можно было бы достичь другим способом).
Похоже, create_shared_dir_and_clean_old
функция все еще существует в boost/interprocess/detail/shared_dir_helpers.hpp