Revert "Upgrade to dlmalloc 2.8.5."
This reverts commit 2d13791ce7ff61221ca047553891f31a23b2e943.
diff --git a/libpixelflinger/codeflinger/CodeCache.cpp b/libpixelflinger/codeflinger/CodeCache.cpp
index 60fc771..a713feb 100644
--- a/libpixelflinger/codeflinger/CodeCache.cpp
+++ b/libpixelflinger/codeflinger/CodeCache.cpp
@@ -23,13 +23,10 @@
#include <sys/mman.h>
#include <cutils/log.h>
-#include <cutils/ashmem.h>
#include <cutils/atomic.h>
#include "codeflinger/CodeCache.h"
-#define LOG_TAG "CodeCache"
-
namespace android {
// ----------------------------------------------------------------------------
@@ -41,72 +38,12 @@
// ----------------------------------------------------------------------------
-// A dlmalloc mspace is used to manage the code cache over a mmaped region.
-#define HAVE_MMAP 0
-#define HAVE_MREMAP 0
-#define HAVE_MORECORE 0
-#define MALLOC_ALIGNMENT 16
-#define MSPACES 1
-#define NO_MALLINFO 1
-#define ONLY_MSPACES 1
-// Custom heap error handling.
-#define PROCEED_ON_ERROR 0
-static void heap_error(const char* msg, const char* function, void* p);
-#define CORRUPTION_ERROR_ACTION(m) \
- heap_error("HEAP MEMORY CORRUPTION", __FUNCTION__, NULL)
-#define USAGE_ERROR_ACTION(m,p) \
- heap_error("ARGUMENT IS INVALID HEAP ADDRESS", __FUNCTION__, p)
-
-
-#pragma GCC diagnostic ignored "-Wstrict-aliasing"
-#pragma GCC diagnostic ignored "-Wempty-body"
-#include "../../../../bionic/libc/upstream-dlmalloc/malloc.c"
-#pragma GCC diagnostic warning "-Wstrict-aliasing"
-#pragma GCC diagnostic warning "-Wempty-body"
-
-static void heap_error(const char* msg, const char* function, void* p) {
- ALOG(LOG_FATAL, LOG_TAG, "@@@ ABORTING: CODE FLINGER: %s IN %s addr=%p",
- msg, function, p);
- /* So that we can get a memory dump around p */
- *((int **) 0xdeadbaad) = (int *) p;
-}
-
-// ----------------------------------------------------------------------------
-
-static void* gExecutableStore = NULL;
-static mspace gMspace = NULL;
-const size_t kMaxCodeCacheCapacity = 1024 * 1024;
-
-static mspace getMspace()
-{
- if (gExecutableStore == NULL) {
- int fd = ashmem_create_region("CodeFlinger code cache",
- kMaxCodeCacheCapacity);
- LOG_ALWAYS_FATAL_IF(fd < 0,
- "Creating code cache, ashmem_create_region "
- "failed with error '%s'", strerror(errno));
- gExecutableStore = mmap(NULL, kMaxCodeCacheCapacity,
- PROT_READ | PROT_WRITE | PROT_EXEC,
- MAP_PRIVATE, fd, 0);
- LOG_ALWAYS_FATAL_IF(gExecutableStore == NULL,
- "Creating code cache, mmap failed with error "
- "'%s'", strerror(errno));
- close(fd);
- gMspace = create_mspace_with_base(gExecutableStore, kMaxCodeCacheCapacity,
- /*locked=*/ false);
- mspace_set_footprint_limit(gMspace, kMaxCodeCacheCapacity);
- }
- return gMspace;
-}
-
Assembly::Assembly(size_t size)
: mCount(1), mSize(0)
{
mBase = (uint32_t*)mspace_malloc(getMspace(), size);
- LOG_ALWAYS_FATAL_IF(mBase == NULL,
- "Failed to create Assembly of size %zd in executable "
- "store of size %zd", size, kMaxCodeCacheCapacity);
mSize = size;
+ ensureMbaseExecutable();
}
Assembly::~Assembly()
@@ -140,13 +77,31 @@
ssize_t Assembly::resize(size_t newSize)
{
mBase = (uint32_t*)mspace_realloc(getMspace(), mBase, newSize);
- LOG_ALWAYS_FATAL_IF(mBase == NULL,
- "Failed to resize Assembly to %zd in code cache "
- "of size %zd", newSize, kMaxCodeCacheCapacity);
mSize = newSize;
+ ensureMbaseExecutable();
return size();
}
+mspace Assembly::getMspace()
+{
+ static mspace msp = create_contiguous_mspace(2 * 1024, 1024 * 1024, /*locked=*/ false);
+ return msp;
+}
+
+void Assembly::ensureMbaseExecutable()
+{
+ long pagesize = sysconf(_SC_PAGESIZE);
+ long pagemask = ~(pagesize - 1); // assumes pagesize is a power of 2
+
+ uint32_t* pageStart = (uint32_t*) (((uintptr_t) mBase) & pagemask);
+ size_t adjustedLength = (mBase - pageStart) * sizeof(uint32_t) + mSize;
+
+ if (mBase && mprotect(pageStart, adjustedLength, PROT_READ | PROT_WRITE | PROT_EXEC) != 0) {
+ mspace_free(getMspace(), mBase);
+ mBase = NULL;
+ }
+}
+
// ----------------------------------------------------------------------------
CodeCache::CodeCache(size_t size)
diff --git a/libpixelflinger/codeflinger/CodeCache.h b/libpixelflinger/codeflinger/CodeCache.h
index 54fd69b..aaafd26 100644
--- a/libpixelflinger/codeflinger/CodeCache.h
+++ b/libpixelflinger/codeflinger/CodeCache.h
@@ -22,6 +22,7 @@
#include <stdint.h>
#include <pthread.h>
#include <sys/types.h>
+#include <cutils/mspace.h>
#include "tinyutils/KeyedVector.h"
#include "tinyutils/smartpointer.h"
@@ -67,6 +68,9 @@
typedef void weakref_type;
private:
+ static mspace getMspace();
+ void ensureMbaseExecutable();
+
mutable int32_t mCount;
uint32_t* mBase;
size_t mSize;