[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