[llvm-commits] CVS: llvm-poolalloc/runtime/SafePoolAllocator/PageManager.cpp

Dinakar Dhurjati dhurjati at cs.uiuc.edu
Thu Dec 22 08:50:56 PST 2005



Changes in directory llvm-poolalloc/runtime/SafePoolAllocator:

PageManager.cpp added (r1.1)
---
Log message:

*** empty log message ***

---
Diffs of the changes:  (+128 -0)

 PageManager.cpp |  128 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 128 insertions(+)


Index: llvm-poolalloc/runtime/SafePoolAllocator/PageManager.cpp
diff -c /dev/null llvm-poolalloc/runtime/SafePoolAllocator/PageManager.cpp:1.1
*** /dev/null	Thu Dec 22 10:50:54 2005
--- llvm-poolalloc/runtime/SafePoolAllocator/PageManager.cpp	Thu Dec 22 10:50:44 2005
***************
*** 0 ****
--- 1,128 ----
+ //===- PageManager.cpp - Implementation of the page allocator -------------===//
+ // 
+ //                       The LLVM Compiler Infrastructure
+ //
+ // This file was developed by the LLVM research group and is distributed under
+ // the University of Illinois Open Source License. See LICENSE.TXT for details.
+ // 
+ //===----------------------------------------------------------------------===//
+ //
+ // This file implements the PageManager.h interface.
+ //
+ //===----------------------------------------------------------------------===//
+ 
+ #include "PageManager.h"
+ #ifndef _POSIX_MAPPED_FILES
+ #define _POSIX_MAPPED_FILES
+ #endif
+ #include <unistd.h>
+ #include "poolalloc/Support/MallocAllocator.h"
+ #include "poolalloc/MMAPSupport.h"
+ #include <iostream>
+ #include <vector>
+ #include <cassert>
+ // Define this if we want to use memalign instead of mmap to get pages.
+ // Empirically, this slows down the pool allocator a LOT.
+ #define USE_MEMALIGN 0
+ extern "C" {
+ unsigned PageSize = 0;
+ }
+ extern unsigned poolmemusage;
+ void InitializePageManager() {
+   if (!PageSize) {
+     PageSize =  32 * sysconf(_SC_PAGESIZE) ;
+   }
+ }
+ 
+ #if !USE_MEMALIGN
+ static void *GetPages(unsigned NumPages) {
+ #if defined(i386) || defined(__i386__) || defined(__x86__)
+   /* Linux and *BSD tend to have these flags named differently. */
+ #if defined(MAP_ANON) && !defined(MAP_ANONYMOUS)
+ # define MAP_ANONYMOUS MAP_ANON
+ #endif /* defined(MAP_ANON) && !defined(MAP_ANONYMOUS) */
+ #elif defined(sparc) || defined(__sparc__) || defined(__sparcv9)
+   /* nothing */
+ #else
+   std::cerr << "This architecture is not supported by the pool allocator!\n";
+   abort();
+ #endif
+ 
+ #if defined(__linux__)
+ #define fd 0
+ #else
+ #define fd -1
+ #endif
+   void *Addr;
+   //MMAP DOESNOT WORK !!!!!!!!
+   //  Addr = mmap(0, NumPages*PageSize, PROT_READ|PROT_WRITE,
+   //                 MAP_SHARED|MAP_ANONYMOUS, fd, 0);
+   //  void *pa = malloc(NumPages * PageSize);
+   //  assert(Addr != MAP_FAILED && "MMAP FAILED!");
+    if (posix_memalign(&Addr, PageSize, NumPages*PageSize) != 0){
+      assert(1 && "memalign failed \n");
+    }
+   poolmemusage += NumPages * PageSize;
+   memset(Addr, 0xcc, NumPages *PageSize);
+   return Addr;
+ }
+ #endif
+ 
+ // Explicitly use the malloc allocator here, to avoid depending on the C++
+ // runtime library.
+ typedef std::vector<void*, llvm::MallocAllocator<void*> > FreePagesListType;
+ 
+ static FreePagesListType &getFreePageList() {
+   static FreePagesListType *FreePages = 0;
+ 
+   if (!FreePages) {
+     // Avoid using operator new!
+     FreePages = (FreePagesListType*)malloc(sizeof(FreePagesListType));
+     // Use placement new now.
+     //    new (FreePages) std::vector<void*, llvm::MallocAllocator<void*> >();
+   }
+   return *FreePages;
+ }
+ 
+ /// AllocatePage - This function returns a chunk of memory with size and
+ /// alignment specified by PageSize.
+ void *AllocatePage() {
+ 
+   FreePagesListType &FPL = getFreePageList();
+ 
+   if (!FPL.empty()) {
+     void *Result = FPL.back();
+       FPL.pop_back();
+       return Result;
+   }
+ 
+   // Allocate several pages, and put the extras on the freelist...
+   unsigned NumToAllocate = 8;
+   char *Ptr = (char*)GetPages(NumToAllocate);
+ 
+   for (unsigned i = 1; i != NumToAllocate; ++i)
+     FPL.push_back(Ptr+i*PageSize);
+   return Ptr;
+ }
+ 
+ void *AllocateNPages(unsigned Num) {
+   if (Num <= 1) return AllocatePage();
+   return GetPages(Num);
+ }
+ 
+ /// FreePage - This function returns the specified page to the pagemanager for
+ /// future allocation.
+ #define THRESHOLD 5
+ void FreePage(void *Page) {
+   FreePagesListType &FPL = getFreePageList();
+   FPL.push_back(Page);
+   //munmap(Page, 1);
+   /*
+   if (FPL.size() >  THRESHOLD) {
+     //    printf( "pool allocator : reached a threshold \n");
+     //    exit(-1); 
+     munmap(Page, PageSize);
+     poolmemusage -= PageSize;
+   }
+   */
+ }






More information about the llvm-commits mailing list