Use ashmem to name our various anonymous regions.

Change-Id: If64576b831a2fdcb83ffce40e6ec8ece8d902672
diff --git a/src/mem_map.cc b/src/mem_map.cc
index f1c85da..0d014c2 100644
--- a/src/mem_map.cc
+++ b/src/mem_map.cc
@@ -1,9 +1,3 @@
-#include "mem_map.h"
-
-#include <sys/mman.h>
-
-#include "utils.h"
-
 /*
  * Copyright (C) 2008 The Android Open Source Project
  *
@@ -24,6 +18,15 @@
 
 #include <sys/mman.h>
 
+#include "ScopedFd.h"
+#include "utils.h"
+
+#define USE_ASHMEM 1
+
+#ifdef USE_ASHMEM
+#include <cutils/ashmem.h>
+#endif
+
 namespace art {
 
 size_t ParseHex(const std::string& string) {
@@ -100,19 +103,27 @@
 #endif
 }
 
-MemMap* MemMap::Map(byte* addr, size_t length, int prot) {
+MemMap* MemMap::Map(const char* name, byte* addr, size_t length, int prot) {
   CHECK_NE(0U, length);
   CHECK_NE(0, prot);
   size_t page_aligned_size = RoundUp(length, kPageSize);
   CheckMapRequest(addr, page_aligned_size);
-  byte* actual = reinterpret_cast<byte*>(mmap(addr,
-                                              page_aligned_size,
-                                              prot,
-                                              MAP_PRIVATE | MAP_ANONYMOUS,
-                                              -1,
-                                              0));
+
+#ifdef USE_ASHMEM
+  ScopedFd fd(ashmem_create_region(name, page_aligned_size));
+  int flags = MAP_PRIVATE;
+  if (fd.get() == -1) {
+    PLOG(ERROR) << "ashmem_create_region failed (" << name << ")";
+    return NULL;
+  }
+#else
+  ScopedFd fd(-1);
+  int flags = MAP_PRIVATE | MAP_ANONYMOUS;
+#endif
+
+  byte* actual = reinterpret_cast<byte*>(mmap(addr, page_aligned_size, prot, flags, fd.get(), 0));
   if (actual == MAP_FAILED) {
-    PLOG(ERROR) << "mmap failed";
+    PLOG(ERROR) << "mmap failed (" << name << ")";
     return NULL;
   }
   return new MemMap(actual, length, actual, page_aligned_size);