float* PooledDataStore::CreateData(uint64_t id, size_t length) { lock_guard<mutex> lck(access_mutex_); DLOG(INFO) << "create data #" << id << " length " << length; auto it = data_states_.emplace(id, DataState()); CHECK(it.second) << "data already existed"; auto& ds = it.first->second; ds.length = length; auto find_free_space_ = free_space_.find(length); if (find_free_space_ != free_space_.end()) { // Reuse ds.ptr = find_free_space_->second.front(); find_free_space_->second.pop(); if (!find_free_space_->second.size()) { free_space_.erase(find_free_space_); } } else { ds.ptr = allocator_(length); total_ += length; if (threshold_ < total_) { ReleaseFreeSpace(); } } return static_cast<float*>(ds.ptr); }
static T makeObject() { if(allocator_) return allocator_(); return new T(); }