[llvm-commits] [poolalloc] r57669 - in /poolalloc/trunk/include/poolalloc_runtime: PoolAllocator.h Support/SplayTree.h test.ex
Andrew Lenharth
alenhar2 at cs.uiuc.edu
Thu Oct 16 21:44:25 PDT 2008
Author: alenhar2
Date: Thu Oct 16 23:44:25 2008
New Revision: 57669
URL: http://llvm.org/viewvc/llvm-project?rev=57669&view=rev
Log:
Use c++ allocators. Allow seperation of data and metadata by using different allocators
Modified:
poolalloc/trunk/include/poolalloc_runtime/PoolAllocator.h
poolalloc/trunk/include/poolalloc_runtime/Support/SplayTree.h
poolalloc/trunk/include/poolalloc_runtime/test.ex
Modified: poolalloc/trunk/include/poolalloc_runtime/PoolAllocator.h
URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/include/poolalloc_runtime/PoolAllocator.h?rev=57669&r1=57668&r2=57669&view=diff
==============================================================================
--- poolalloc/trunk/include/poolalloc_runtime/PoolAllocator.h (original)
+++ poolalloc/trunk/include/poolalloc_runtime/PoolAllocator.h Thu Oct 16 23:44:25 2008
@@ -1,43 +1,50 @@
#include "poolalloc_runtime/Support/SplayTree.h"
+#include "llvm/ADT/hash_map.h"
#include <cstdlib>
-template<class PageManager, template <typename T> class SlabManager >
-class PoolAllocator : SlabManager<PageManager> {
- using SlabManager<PageManager>::slab_alloc;
- using SlabManager<PageManager>::slab_free;
- using SlabManager<PageManager>::slab_valid;
- using SlabManager<PageManager>::slab_getbounds;
+template<class SlabManager >
+class PoolAllocator : SlabManager {
+ using SlabManager::slab_alloc;
+ using SlabManager::slab_free;
+ using SlabManager::slab_valid;
+ using SlabManager::slab_getbounds;
+ using SlabManager::slab_managed;
+
public:
PoolAllocator(unsigned objsize, unsigned Alignment)
- : SlabManager<PageManager>(objsize, Alignment)
+ : SlabManager(objsize, Alignment)
{}
-
- //In-place new operator
+ // In-place new operator
static void* operator new( std::size_t s, void* p ) throw() {
return p;
}
- //Allocate an object of size objsize
+ // Allocate an object of size objsize
void* alloc() {
return slab_alloc(1);
}
- //Allocate an array with num objects of size objsize
+ // Allocate an array with num objects of size objsize
void* alloc_array(unsigned num) {
return slab_alloc(num);
}
- //Free allocated object
+ // Free allocated object
void dealloc(void* obj) {
slab_free(obj);
}
- //Tests if obj is in an allocated object
+ // Tests if obj is in an allocated object
bool isAllocated(void* obj) {
return slab_valid(obj);
}
+ // Tests if the obj is in the managed set
+ bool isManaged(void* obj) {
+ return slab_managed(obj);
+ }
+
// Returns the start and end of an object, return value is true if found
bool getBounds(void* obj, void*& start, void*& end) {
return slab_getbounds(obj, start, end);
@@ -45,25 +52,31 @@
};
-class mmapPageManager {
- enum { pageSize = 4096 };
-};
-
-template<class PageManager>
+template<class SafeAllocator = std::allocator<void>, class DataAllocator = std::allocator<void> >
class MallocSlabManager {
- RangeSplaySet objs;
+ typedef typename DataAllocator::template rebind<char>::other DAlloc;
+ typedef typename SafeAllocator::template rebind<void>::other SAlloc;
+
+ RangeSplaySet<SAlloc> objs;
unsigned objsize;
+
+ DAlloc allocator;
+
protected:
MallocSlabManager(unsigned Osize, unsigned Alignment) : objsize(Osize) {}
void* slab_alloc(unsigned num) {
- void* x = malloc(num*objsize);
+ void* x = allocator.allocate(num*objsize);
objs.insert(x, (char*)x + num*objsize - 1);
return x;
}
void slab_free(void* obj) {
- objs.remove(obj);
- free(obj);
+ void* start;
+ void* end;
+ if (objs.find(obj, start, end)) {
+ objs.remove(obj);
+ allocator.deallocate((char*)start, ((char*)end-(char*)start) + 1);
+ }
}
bool slab_valid(void* obj) {
return objs.find(obj);
@@ -71,6 +84,9 @@
bool slab_contains(void* obj) {
return objs.find(obj);
}
+ bool slab_managed(void* obj) {
+ return objs.find(obj);
+ }
bool slab_getbounds(void* obj, void*& start, void*& end) {
return objs.find(obj, start, end);
}
@@ -78,5 +94,8 @@
template<class PageManager, unsigned PageShiftAmount>
class BitMaskSlabManager {
+ hash_map<void*, std::pair<unsigned, unsigned*> >slabmetadata;
+
+ unsigned objsize;
};
Modified: poolalloc/trunk/include/poolalloc_runtime/Support/SplayTree.h
URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/include/poolalloc_runtime/Support/SplayTree.h?rev=57669&r1=57668&r2=57669&view=diff
==============================================================================
--- poolalloc/trunk/include/poolalloc_runtime/Support/SplayTree.h (original)
+++ poolalloc/trunk/include/poolalloc_runtime/Support/SplayTree.h Thu Oct 16 23:44:25 2008
@@ -1,5 +1,9 @@
+#include <memory>
+
template<typename dataTy>
struct range_tree_node {
+ range_tree_node(void* s, void* e) : left(0), right(0), start(s), end(e) {}
+ range_tree_node() : left(0), right(0), start(0), end(0) {}
range_tree_node* left;
range_tree_node* right;
void* start;
@@ -9,23 +13,30 @@
template<>
struct range_tree_node <void>{
+ range_tree_node(void* s, void* e) : left(0), right(0), start(s), end(e) {}
+ range_tree_node() : left(0), right(0), start(0), end(0) {}
range_tree_node* left;
range_tree_node* right;
void* start;
void* end;
};
-template<typename tree_node>
+template<typename T, class _Alloc>
class RangeSplayTree {
+ public:
+ typedef range_tree_node<T> tree_node;
+ private:
+ typename _Alloc::template rebind<tree_node >::other __node_alloc;
+
tree_node* Tree;
-
+
tree_node* rotate_right(tree_node* p) {
- tree_node* x = p->left;
- p->left = x->right;
+ tree_node* x = p->left;
+ p->left = x->right;
x->right = p;
return x;
}
-
+
tree_node* rotate_left(tree_node* p) {
tree_node* x = p->right;
p->right = x->left;
@@ -90,12 +101,13 @@
if (!t) return;
__clear_internal(t->left);
__clear_internal(t->right);
- delete t;
+ __node_alloc.destroy(t);
+ __node_alloc.deallocate(t, 1);
}
- protected:
+ public:
- RangeSplayTree() : Tree(0) {}
+ explicit RangeSplayTree(const _Alloc& a) :__node_alloc(a), Tree(0) {}
~RangeSplayTree() { __clear(); }
tree_node* __insert(void* start, void* end) {
@@ -104,10 +116,8 @@
if (Tree && !key_lt(start, Tree) && !key_gt(start, Tree))
return 0;
- tree_node* n = new tree_node();
- n->start = start;
- n->end = end;
- n->right = n->left = 0;
+ tree_node* n = __node_alloc.allocate(1);
+ __node_alloc.construct(n, tree_node(start,end));
if (Tree) {
if (key_lt(start, Tree)) {
n->left = Tree->left;
@@ -136,7 +146,8 @@
}
tree_node* y = Tree;
Tree = x;
- delete y;
+ __node_alloc.destroy(y);
+ __node_alloc.deallocate(y, 1);
return true;
}
return false; /* not there */
@@ -161,74 +172,75 @@
}
};
-class RangeSplaySet : RangeSplayTree<range_tree_node<void> > {
- public:
- RangeSplaySet() : RangeSplayTree<range_tree_node<void> >() {}
-
- bool insert(void* start, void* end) {
- return 0 != __insert(start,end);
- }
+template<class Allocator = std::allocator<void> >
+class RangeSplaySet
+{
+ RangeSplayTree<void, Allocator> Tree;
- bool remove(void* key) {
- return __remove(key);
- }
-
- bool count() { return __count(); }
-
- void clear() { __clear(); }
-
- bool find(void* key, void*& start, void*& end) {
- range_tree_node<void>* t = __find(key);
- if (!t) return false;
- start = t->start;
- end = t->end;
- return true;
- }
- bool find(void* key) {
- range_tree_node<void>* t = __find(key);
- if (!t) return false;
- return true;
- }
+ public:
+ explicit RangeSplaySet(const Allocator& A = Allocator() )
+ : Tree(A) {}
+
+ bool insert(void* start, void* end) {
+ return 0 != Tree.__insert(start,end);
+ }
+
+ bool remove(void* key) {
+ return Tree.__remove(key);
+ }
+
+ bool count() { return Tree.__count(); }
+
+ void clear() { Tree.__clear(); }
+
+ bool find(void* key, void*& start, void*& end) {
+ range_tree_node<void>* t = Tree.__find(key);
+ if (!t) return false;
+ start = t->start;
+ end = t->end;
+ return true;
+ }
+ bool find(void* key) {
+ range_tree_node<void>* t = Tree.__find(key);
+ if (!t) return false;
+ return true;
+ }
};
-template<typename T>
-class RangeSplayMap : RangeSplayTree<range_tree_node<T> > {
+template<typename T, class Allocator = std::allocator<T> >
+class RangeSplayMap {
+ RangeSplayTree<range_tree_node<T>, Allocator> Tree;
+
public:
- RangeSplayMap() : RangeSplayTree<range_tree_node<T> >() {}
+ explicit RangeSplayMap(const Allocator& A= Allocator() )
+ : Tree(A) {}
- using RangeSplayTree<range_tree_node<T> >::__insert;
- using RangeSplayTree<range_tree_node<T> >::__remove;
- using RangeSplayTree<range_tree_node<T> >::__count;
- using RangeSplayTree<range_tree_node<T> >::__clear;
- using RangeSplayTree<range_tree_node<T> >::__find;
-
-
- bool insert(void* start, void* end, T& d) {
- range_tree_node<T>* t = __insert(start,end);
- if (t == 0) return false;
- t->data = d;
- return true;
- }
-
- bool remove(void* key) {
- return __remove(key);
- }
-
- bool count() { return __count(); }
-
- void clear() { __clear(); }
-
- bool find(void* key, void*& start, void*& end, T& d) {
- range_tree_node<T>* t = __find(key);
- if (!t) return false;
- start = t->start;
- end = t->end;
- d = t->data;
- return true;
- }
- bool find(void* key) {
- range_tree_node<T>* t = __find(key);
- if (!t) return false;
- return true;
- }
+ bool insert(void* start, void* end, T& d) {
+ range_tree_node<T>* t = Tree.__insert(start,end);
+ if (t == 0) return false;
+ t->data = d;
+ return true;
+ }
+
+ bool remove(void* key) {
+ return Tree.__remove(key);
+ }
+
+ bool count() { return Tree.__count(); }
+
+ void clear() { Tree.__clear(); }
+
+ bool find(void* key, void*& start, void*& end, T& d) {
+ range_tree_node<T>* t = Tree.__find(key);
+ if (!t) return false;
+ start = t->start;
+ end = t->end;
+ d = t->data;
+ return true;
+ }
+ bool find(void* key) {
+ range_tree_node<T>* t = Tree.__find(key);
+ if (!t) return false;
+ return true;
+ }
};
Modified: poolalloc/trunk/include/poolalloc_runtime/test.ex
URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/include/poolalloc_runtime/test.ex?rev=57669&r1=57668&r2=57669&view=diff
==============================================================================
--- poolalloc/trunk/include/poolalloc_runtime/test.ex (original)
+++ poolalloc/trunk/include/poolalloc_runtime/test.ex Thu Oct 16 23:44:25 2008
@@ -1,7 +1,7 @@
#include "PoolAllocator.h"
#include <iostream>
-PoolAllocator<mmapPageManager, MallocSlabManager> a(10, 16);
+PoolAllocator<MallocSlabManager<> > a(10, 16);
RangeSplayMap<unsigned> x;
More information about the llvm-commits
mailing list