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

Другие вопросы по тегам