Constructing vector of POD using boost interprocess throws exception only in debug mode
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Facilidade para iniciantes
- 35/100
- Tipo de issue
- Bug
- Clareza
- Razoavelmente clara
- Status de atividade
- Estagnada
- Stack de tecnologia
- cpp
- Domínio
- operating-systems
Direção de pesquisa
Reproduza o exemplo no modo debug, concentrando-se na construção e no resize do vector boost::container de queue_pool. Inspecione a assertion em boost/interprocess/mem_algo/rbtree_best_fit.hpp:698 e o caminho do allocator para Ringbuffer<65536>. Considera-se concluído quando a falha de alinhamento for explicada e o comportamento corrigido for confirmado tanto nas builds debug quanto release.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
I am trying to construct a bip::vector of POD using boost interprocess managed shared memory. The following code compiles and run in release mode, but crashes in debug mode.
#include <cstdint>
#include <boost/interprocess/allocators/allocator.hpp>
#include <boost/interprocess/containers/string.hpp>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/container/vector.hpp>
#include <iostream>
// Forward declaration of Ringbuffer<65536>
template <uint32_t Bytes>
class Ringbuffer;
namespace shared {
namespace bipc = boost::interprocess;
using Segment = bipc::managed_shared_memory;
using Manager = Segment::segment_manager;
template <typename T>
using Alloc = bipc::allocator<T, Manager>;
template <typename T>
using Vector = boost::container::vector<T, Alloc<T>>;
} // namespace shared
using MsgQueue = Ringbuffer<65536>;
using msg_queue_pool_t = shared::Vector<MsgQueue>;
template <uint32_t Bytes>
class Ringbuffer {
public:
struct MsgHeader {
uint32_t size;
uint32_t userdata;
};
private:
struct Block {
alignas(64) MsgHeader header;
};
static constexpr uint32_t BLK_CNT = Bytes / sizeof(Block);
static_assert(BLK_CNT && !(BLK_CNT & (BLK_CNT - 1)), "BLK_CNT must be a power of 2");
Block blk[BLK_CNT];
alignas(64) uint64_t written_idx{0};
alignas(64) uint64_t last_key_idx{0};
alignas(64) uint64_t writing_idx{0};
alignas(64) bool in_use{false};
};
int main(int argc, char** argv) {
auto segment_ptr =
std::make_unique<boost::interprocess::managed_shared_memory>(boost::interprocess::create_only, "ShareMemory", 65536 * 20);
msg_queue_pool_t* ringbuffer_pool =
segment_ptr->construct<msg_queue_pool_t>("queue_pool")(5, segment_ptr->get_segment_manager());
ringbuffer_pool->resize(10);
std::cout << "hello world!" << std::endl;
return 0;
}
The error when running in debug mode:
boost_interprocess_issue: /home/rnd/.xmake/packages/b/boost/1.81.0/9a76068f70604ea18becd4a3064bdac1/include/boost/interprocess/mem_algo/rbtree_best_fit.hpp:698: T* boost::interprocess::rbtree_best_fit<MutexFamily, VoidMutex, MemAlignment>::allocation_command(boost::container::allocation_type, boost::interprocess::rbtree_best_fit<MutexFamily, VoidMutex, MemAlignment>::size_type, boost::interprocess::rbtree_best_fit<MutexFamily, VoidMutex, MemAlignment>::size_type&, T*&) [with T = Ringbuffer<65536>; MutexFamily = boost::interprocess::mutex_family; VoidPointer = boost::interprocess::offset_ptr; long unsigned int MemAlignment = 0; boost::container::allocation_type = unsigned int; boost::interprocess::rbtree_best_fit<MutexFamily, VoidMutex, MemAlignment>::size_type = long unsigned int]: Assertion `0 == ((std::size_t)ret % ::boost::container::dtl::alignment_of::value)' failed.
how could I fix the issue?
- Linguagem predominante
- C++
- Estrelas
- 185
- Forks
- 131
- Métricas de merge de PRs
- Nenhum PR com merge em 30d
Preparar o ambiente
Ainda não verificamos os arquivos de configuração deste projeto. Comece pelo README e veja nosso guia da primeira contribuição para os passos gerais.
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de boostorg/interprocess
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 68/100
boostorg/interprocess#196 · 1 reação ·
-
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 35/100
boostorg/interprocess#279 ·
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 35/100
boostorg/interprocess#274 · 1 comentário ·
-
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 28/100
boostorg/interprocess#268 · 4 comentários ·
-
Semaphore use in signalsAberta
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 35/100
boostorg/interprocess#262 · 2 comentários ·
Todas as issues de boostorg/interprocess
Issues semelhantes
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
KhronosGroup/Vulkan-Tutorial#524 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 88/100
microsoft/onnxruntime-genai#2633 ·
Mantenedores costumam responder em até 1 dia
-
mapper bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 86/100
firebase/firebase-ios-sdk#16718 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 88/100
tesseract-ocr/tesseract#4627 ·