Beispiel #1
0
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);
}
Beispiel #2
0
		static T makeObject() {
			if(allocator_)
				return allocator_();
			return new T();
		}