update chunk_storage_info

This commit is contained in:
mutouyun 2021-07-11 23:01:36 +08:00
parent d0f965359d
commit 1bb96fe2f1

View File

@ -131,7 +131,7 @@ struct chunk_info_t {
}; };
auto& chunk_storages() { auto& chunk_storages() {
class chunk_t { class chunk_handle_t {
ipc::shm::handle handle_; ipc::shm::handle handle_;
public: public:
@ -150,12 +150,24 @@ auto& chunk_storages() {
return info; return info;
} }
}; };
thread_local ipc::unordered_map<std::size_t, chunk_t> chunk_s; static ipc::map<std::size_t, chunk_handle_t> chunk_hs;
return chunk_s; return chunk_hs;
} }
chunk_info_t *chunk_storage_info(std::size_t chunk_size) { chunk_info_t *chunk_storage_info(std::size_t chunk_size) {
return chunk_storages()[chunk_size].get_info(chunk_size); auto &storages = chunk_storages();
std::decay_t<decltype(storages)>::iterator it;
{
static ipc::rw_lock lock;
IPC_UNUSED_ std::shared_lock<ipc::rw_lock> guard {lock};
if ((it = storages.find(chunk_size)) == storages.end()) {
using chunk_handle_t = std::decay_t<decltype(storages)>::value_type::second_type;
guard.unlock();
IPC_UNUSED_ std::lock_guard<ipc::rw_lock> guard {lock};
it = storages.emplace(chunk_size, chunk_handle_t{}).first;
}
}
return it->second.get_info(chunk_size);
} }
std::pair<ipc::storage_id_t, void*> acquire_storage(std::size_t size, ipc::circ::cc_t conns) { std::pair<ipc::storage_id_t, void*> acquire_storage(std::size_t size, ipc::circ::cc_t conns) {