diff --git a/be/src/common/object_pool.h b/be/src/common/object_pool.h index 78cde83f5004d1..db82bdf79edce5 100644 --- a/be/src/common/object_pool.h +++ b/be/src/common/object_pool.h @@ -30,51 +30,42 @@ namespace doris { // Thread-safe. class ObjectPool { public: - ObjectPool() : _objects() {} + ObjectPool() = default; ~ObjectPool() { clear(); } template T* add(T* t) { - // Create the object to be pushed to the shared vector outside the critical section. // TODO: Consider using a lock-free structure. - SpecificElement* obj = new SpecificElement(t); - DCHECK(obj != NULL); std::lock_guard l(_lock); - _objects.push_back(obj); + _objects.emplace_back(Element{t, [](void* obj) { delete reinterpret_cast(obj); }}); return t; } void clear() { std::lock_guard l(_lock); - for (auto i = _objects.rbegin(); i != _objects.rend(); ++i) { - delete *i; - } + for (Element& elem : _objects) elem.delete_fn(elem.obj); _objects.clear(); } - // Absorb all objects from src pool - // Note: This method is not thread safe void acquire_data(ObjectPool* src) { _objects.insert(_objects.end(), src->_objects.begin(), src->_objects.end()); src->_objects.clear(); } private: - struct GenericElement { - virtual ~GenericElement() {} - }; + DISALLOW_COPY_AND_ASSIGN(ObjectPool); - template - struct SpecificElement : GenericElement { - SpecificElement(T* t) : t(t) {} - ~SpecificElement() { delete t; } + /// A generic deletion function pointer. Deletes its first argument. + using DeleteFn = void (*)(void*); - T* t; + /// For each object, a pointer to the object and a function that deletes it. + struct Element { + void* obj; + DeleteFn delete_fn; }; - - typedef std::vector ElementVector; - ElementVector _objects; + + std::vector _objects; SpinLock _lock; };