Infiniband::MemoryManager::Cluster::~Cluster()
{
- char *p = chunk_base;
- for (uint32_t i = 0; i < num_chunk; i++){
- Chunk *chunk = reinterpret_cast<Chunk*>(p);
+ const auto chunk_end = chunk_base + num_chunk;
+ for (auto chunk = chunk_base; chunk != chunk_end; chunk++) {
chunk->~Chunk();
- p += sizeof(Chunk);
}
::free(chunk_base);
}
end = base + bytes;
assert(base);
- chunk_base = (char*)::malloc(sizeof(Chunk) * num);
+ chunk_base = static_cast<Chunk*>(::malloc(sizeof(Chunk) * num));
memset(chunk_base, 0, sizeof(Chunk) * num);
free_chunks.reserve(num);
- char *ptr = chunk_base;
+ Chunk* chunk = chunk_base;
for (uint32_t offset = 0; offset < bytes; offset += buffer_size){
- Chunk *chunk = reinterpret_cast<Chunk*>(ptr);
ibv_mr* m = ibv_reg_mr(manager.pd->pd, base+offset, buffer_size, IBV_ACCESS_REMOTE_WRITE | IBV_ACCESS_LOCAL_WRITE);
assert(m);
new(chunk) Chunk(m, buffer_size, base+offset);
free_chunks.push_back(chunk);
- ptr += sizeof(Chunk);
+ chunk++;
}
return 0;
}
int get_buffers(std::vector<Chunk*> &chunks, size_t bytes);
Chunk *get_chunk_by_buffer(const char *c) {
uint32_t idx = (c - base) / buffer_size;
- Chunk *chunk = reinterpret_cast<Chunk*>(chunk_base + sizeof(Chunk) * idx);
+ Chunk *chunk = chunk_base + idx;
return chunk;
}
bool is_my_buffer(const char *c) const {
std::vector<Chunk*> free_chunks;
char *base = nullptr;
char *end = nullptr;
- char* chunk_base;
+ Chunk* chunk_base = nullptr;
};
MemoryManager(Device *d, ProtectionDomain *p, bool hugepage);