boostorg / boostorg/interprocess

Constructing vector of POD using boost interprocess throws exception only in debug mode

Aperta
#208 1 commento 0 reazioni 0 assegnatari Vedi su GitHub
Lingua principale
C++
Stelle
185
Fork
131
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

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
#include
#include
#include
#include
#include

// Forward declaration of Ringbuffer<65536>
template
class Ringbuffer;

namespace shared {
namespace bipc = boost::interprocess;
using Segment = bipc::managed_shared_memory;
using Manager = Segment::segment_manager;

template
using Alloc = bipc::allocator;

template
using Vector = boost::container::vector>;
} // namespace shared

using MsgQueue = Ringbuffer<65536>;

using msg_queue_pool_t = shared::Vector;

template
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::create_only, "ShareMemory", 65536 * 20);

msg_queue_pool_t* ringbuffer_pool =
segment_ptr->construct("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::allocation_command(boost::container::allocation_type, boost::interprocess::rbtree_best_fit::size_type, boost::interprocess::rbtree_best_fit::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::size_type = long unsigned int]: Assertion `0 == ((std::size_t)ret % ::boost::container::dtl::alignment_of::value)' failed.
```

how could I fix the issue?

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Direzione di ricerca

Riproduci l’esempio in modalità debug, concentrandoti sulla costruzione e sul resize del vector boost::container di queue_pool. Ispeziona l’assertion in boost/interprocess/mem_algo/rbtree_best_fit.hpp:698 e il percorso dell’allocator per Ringbuffer<65536>. Il lavoro è completato quando viene spiegato il fallimento dell’allineamento e viene confermato il comportamento corretto sia nelle build debug che release.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
cpp
Ambito
operating-systems
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.