Advertisement
Guest User

Untitled

a guest
Jul 24th, 2016
294
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.58 KB | None | 0 0
  1. #include <sys/mman.h>
  2. #include <unistd.h>
  3. #include <utility>
  4.  
  5.  
  6. template<typename T>
  7. struct vector_mmap_allocator {
  8.     using value_type = T;
  9.  
  10.     vector_mmap_allocator() = default;
  11.  
  12.     ~vector_mmap_allocator()
  13.     {
  14.         munmap(mem1, len1);
  15.         munmap(mem2, len2);
  16.     }
  17.  
  18.     template<typename U>
  19.     vector_mmap_allocator(const vector_mmap_allocator<U>& that)
  20.     {
  21.         munmap(mem1, len1);
  22.         munmap(mem2, len2);
  23.  
  24.         len1 = that.len1;
  25.         len2 = that.len2;
  26.         mem1 = alloc(len1);
  27.         mem2 = alloc(len2);
  28.     }
  29.  
  30.     T* allocate(size_t n)
  31.     {
  32.  
  33.         if (n * sizeof(value_type) > len2) {
  34.             munmap(mem2, len2);
  35.             len2 = round_up(n * sizeof(value_type));
  36.             mem2 = alloc(len2);
  37.         }
  38.  
  39.         std::swap(len1, len2);
  40.         std::swap(mem1, mem2);
  41.  
  42.         return mem1;
  43.     }
  44.  
  45.     void deallocate(T*, size_t)
  46.     {
  47.     }
  48.  
  49. private:
  50.     static size_t PAGESIZE;
  51.  
  52.     size_t len1 = PAGESIZE;
  53.     size_t len2 = PAGESIZE;
  54.     T* mem1 = alloc(len1);
  55.     T* mem2 = alloc(len2);
  56.  
  57.     static size_t round_up(size_t size)
  58.     { return (size + PAGESIZE - 1) & ~(PAGESIZE - 1); }
  59.  
  60.     static T* alloc(size_t size)
  61.     {
  62.         return static_cast<T*>(mmap(NULL, size, PROT_READ | PROT_WRITE,
  63.                                     MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));
  64.     }
  65.  
  66. template <class R, class S>
  67. friend bool operator==(const vector_mmap_allocator<R>& lhs, const vector_mmap_allocator<S>& rhs)
  68. { return lhs.mem1 == rhs.mem2; }
  69. template <class R, class S>
  70. friend bool operator!=(const vector_mmap_allocator<R>& lhs, const vector_mmap_allocator<S>& rhs)
  71. { return lhs.mem1 != rhs.mem2; }
  72.  
  73. };
  74.  
  75. template<typename T>
  76. size_t vector_mmap_allocator<T>::PAGESIZE = sysconf(_SC_PAGESIZE);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement