[llvm] r217563 - shared_ptrify ownershp of PoolEntries in PBQP's CostPool
David Blaikie
dblaikie at gmail.com
Wed Sep 10 16:54:46 PDT 2014
Author: dblaikie
Date: Wed Sep 10 18:54:45 2014
New Revision: 217563
URL: http://llvm.org/viewvc/llvm-project?rev=217563&view=rev
Log:
shared_ptrify ownershp of PoolEntries in PBQP's CostPool
Leveraging both intrusive shared_ptr-ing (std::enable_shared_from_this)
and shared_ptr<T>-owning-U (to allow external users to hold
std::shared_ptr<CostT> while keeping the underlying PoolEntry alive).
The intrusiveness could be removed if we had a weak_set that implicitly
removed items from the set when their underlying data went away.
This /might/ fix an existing memory leak reported by LeakSanitizer in
r217504.
Modified:
llvm/trunk/include/llvm/CodeGen/PBQP/CostAllocator.h
Modified: llvm/trunk/include/llvm/CodeGen/PBQP/CostAllocator.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/PBQP/CostAllocator.h?rev=217563&r1=217562&r2=217563&view=diff
==============================================================================
--- llvm/trunk/include/llvm/CodeGen/PBQP/CostAllocator.h (original)
+++ llvm/trunk/include/llvm/CodeGen/PBQP/CostAllocator.h Wed Sep 10 18:54:45 2014
@@ -18,6 +18,7 @@
#ifndef LLVM_CODEGEN_PBQP_COSTALLOCATOR_H
#define LLVM_CODEGEN_PBQP_COSTALLOCATOR_H
+#include <memory>
#include <set>
#include <type_traits>
@@ -27,57 +28,20 @@ template <typename CostT,
typename CostKeyTComparator>
class CostPool {
public:
-
- class PoolEntry {
+ class PoolEntry : public std::enable_shared_from_this<PoolEntry> {
public:
template <typename CostKeyT>
PoolEntry(CostPool &pool, CostKeyT cost)
- : pool(pool), cost(std::move(cost)), refCount(0) {}
+ : pool(pool), cost(std::move(cost)) {}
~PoolEntry() { pool.removeEntry(this); }
- void incRef() { ++refCount; }
- bool decRef() { --refCount; return (refCount == 0); }
CostT& getCost() { return cost; }
const CostT& getCost() const { return cost; }
private:
CostPool &pool;
CostT cost;
- std::size_t refCount;
};
- class PoolRef {
- public:
- PoolRef(PoolEntry *entry) : entry(entry) {
- this->entry->incRef();
- }
- PoolRef(const PoolRef &r) {
- entry = r.entry;
- entry->incRef();
- }
- PoolRef& operator=(const PoolRef &r) {
- assert(entry != nullptr && "entry should not be null.");
- PoolEntry *temp = r.entry;
- temp->incRef();
- entry->decRef();
- entry = temp;
- return *this;
- }
-
- ~PoolRef() {
- if (entry->decRef())
- delete entry;
- }
- void reset(PoolEntry *entry) {
- entry->incRef();
- this->entry->decRef();
- this->entry = entry;
- }
- CostT& operator*() { return entry->getCost(); }
- const CostT& operator*() const { return entry->getCost(); }
- CostT* operator->() { return &entry->getCost(); }
- const CostT* operator->() const { return &entry->getCost(); }
- private:
- PoolEntry *entry;
- };
+ typedef std::shared_ptr<CostT> PoolRef;
private:
class EntryComparator {
@@ -104,19 +68,19 @@ private:
void removeEntry(PoolEntry *p) { entrySet.erase(p); }
public:
-
template <typename CostKeyT>
- PoolRef getCost(CostKeyT costKey) {
+ std::shared_ptr<CostT> getCost(CostKeyT costKey) {
typename EntrySet::iterator itr =
std::lower_bound(entrySet.begin(), entrySet.end(), costKey,
EntryComparator());
if (itr != entrySet.end() && costKey == (*itr)->getCost())
- return PoolRef(*itr);
+ return std::shared_ptr<CostT>((*itr)->shared_from_this(),
+ &(*itr)->getCost());
- PoolEntry *p = new PoolEntry(*this, std::move(costKey));
- entrySet.insert(itr, p);
- return PoolRef(p);
+ auto p = std::make_shared<PoolEntry>(*this, std::move(costKey));
+ entrySet.insert(itr, p.get());
+ return std::shared_ptr<CostT>(std::move(p), &p->getCost());
}
};
More information about the llvm-commits
mailing list