30 #ifndef GOOGLE_BREAKPAD_COMMON_MEMORY_H_ 31 #define GOOGLE_BREAKPAD_COMMON_MEMORY_H_ 43 #define sys_mmap2 mmap 44 #define sys_munmap munmap 45 #define MAP_ANONYMOUS MAP_ANON 60 : page_size_(getpagesize()),
74 if (current_page_ && page_size_ - page_offset_ >= bytes) {
75 uint8_t *
const ret = current_page_ + page_offset_;
76 page_offset_ += bytes;
77 if (page_offset_ == page_size_) {
85 const unsigned pages =
86 (bytes +
sizeof(PageHeader) + page_size_ - 1) / page_size_;
87 uint8_t *
const ret = GetNPages(pages);
92 (page_size_ - (page_size_ * pages - (bytes +
sizeof(PageHeader)))) %
94 current_page_ = page_offset_ ? ret + page_size_ * (pages - 1) : NULL;
96 return ret +
sizeof(PageHeader);
102 for (PageHeader* header = last_; header; header = header->next) {
103 const char* current =
reinterpret_cast<char*
>(header);
104 if ((p >= current) && (p < current + header->num_pages * page_size_))
112 uint8_t *GetNPages(
unsigned num_pages) {
114 void *a = sys_mmap(NULL, page_size_ * num_pages, PROT_READ | PROT_WRITE,
115 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
117 void *a = sys_mmap2(NULL, page_size_ * num_pages, PROT_READ | PROT_WRITE,
118 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
123 struct PageHeader *header =
reinterpret_cast<PageHeader*
>(a);
124 header->next = last_;
125 header->num_pages = num_pages;
128 return reinterpret_cast<uint8_t*
>(a);
134 for (PageHeader *cur = last_; cur; cur = next) {
136 sys_munmap(cur, cur->num_pages * page_size_);
145 const unsigned page_size_;
147 uint8_t *current_page_;
148 unsigned page_offset_;
152 template <
typename T>
154 typedef typename std::allocator<T>::pointer
pointer;
155 typedef typename std::allocator<T>::size_type
size_type;
159 : allocator_(other.allocator_) {}
161 inline pointer
allocate(size_type n,
const void* = 0) {
162 return static_cast<pointer
>(allocator_.Alloc(
sizeof(T) * n));
190 std::vector<T, PageStdAllocator<T> >::reserve(size_hint);
196 inline void*
operator new(
size_t nbytes,
198 return allocator.Alloc(nbytes);
201 #endif // GOOGLE_BREAKPAD_COMMON_MEMORY_H_
void deallocate(pointer, size_type)
pointer allocate(size_type n, const void *=0)
PageStdAllocator< U > other
std::allocator< T >::pointer pointer
PageStdAllocator(PageAllocator &allocator)
std::allocator< T >::size_type size_type
PageStdAllocator(const PageStdAllocator< Other > &other)
void * Alloc(unsigned bytes)
bool OwnsPointer(const void *p)
wasteful_vector(PageAllocator *allocator, unsigned size_hint=16)