summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSatish Patel <satish.patel@linaro.org>2016-04-02 18:22:16 +0530
committerSatish Patel <satish.patel@linaro.org>2016-04-02 18:22:16 +0530
commit7eed624495cf23054845c02424305d43a2641610 (patch)
tree2b05eef637b7e4ff58f969588c1c6932f31d6df1
parent042b63cd8d14ecf23f3ae832f35a0f1d0e2ed47f (diff)
downloadnedmalloc-7eed624495cf23054845c02424305d43a2641610.tar.gz
Porting nedmalloc for android
- add Android.mk files - fixed build error - Android specific changes and dummy implementation for APIs malloc_disable/malloc_enable are implemented under flag LINARO_ANDPORT Note: if included from BIONIC then include flag "-DACCESS_FROM_BIONIC" TODO: There is not malloc_info(3) support, so link error when replacing jemalloc in AOSP master Signed-off-by: Satish Patel <satish.patel@linaro.org>
-rw-r--r--Android.mk72
-rw-r--r--malloc.c.h17
-rw-r--r--nedmalloc.c63
-rw-r--r--nedmalloc.h61
4 files changed, 190 insertions, 23 deletions
diff --git a/Android.mk b/Android.mk
new file mode 100644
index 0000000..e1222f3
--- /dev/null
+++ b/Android.mk
@@ -0,0 +1,72 @@
+#
+# Copyright (C) 2016 The Android Open Source Project
+# Copyright (C) 2016 Linaro Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+nedmalloc_common_cflags := \
+ -Werror=pointer-to-int-cast \
+ -Werror=int-to-pointer-cast \
+ -Werror=type-limits \
+ -Wno-unused-parameter \
+ -Werror \
+ -std=gnu99 \
+
+
+nedmalloc_common_cflags += \
+ -Dlinux \
+ -D__linux__\
+
+# Only enable the tcache on non-svelte configurations, to save PSS.
+#TODO - need to debug more on this option, give lot of build error
+ifneq ($(MALLOC_SVELTE),true)
+nedmalloc_common_cflags += \
+ #-DUSE_ALLOCATOR=0
+ #-DUSE_MAGIC_HEADERS=1
+endif
+
+nedmalloc_common_c_includes := \
+ $(LOCAL_PATH)/ \
+
+nedmalloc_lib_src_files := \
+ nedmalloc.c \
+
+#-----------------------------------------------------------------------
+# nedmalloc static library
+#-----------------------------------------------------------------------
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := libnedmalloc
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_ADDITIONAL_DEPENDENCIES := \
+ $(LOCAL_PATH)/Android.mk \
+
+LOCAL_CFLAGS := \
+ $(nedmalloc_common_cflags) \
+ -include bionic/libc/private/libc_logging.h \
+
+LOCAL_C_INCLUDES := \
+ $(nedmalloc_common_c_includes) \
+
+LOCAL_SRC_FILES := \
+ $(nedmalloc_lib_src_files) \
+
+# This is linked into libc, which asan runtime library depends on.
+LOCAL_SANITIZE := never
+LOCAL_STRIP_MODULE := keep_symbols
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/malloc.c.h b/malloc.c.h
index ff33c94..e779a71 100644
--- a/malloc.c.h
+++ b/malloc.c.h
@@ -507,9 +507,14 @@ MAX_RELEASE_CHECK_RATE default: 4095 unless not HAVE_MMAP
*/
/* Version identifier to allow people to support multiple versions */
+#ifndef _MALLOC_C_H_
+#define _MALLOC_C_H_
+
#ifndef DLMALLOC_VERSION
#define DLMALLOC_VERSION 20804
#endif /* DLMALLOC_VERSION */
+#include <time.h>
+#define USE_DL_PREFIX 1
#ifndef WIN32
#ifdef _WIN32
@@ -569,7 +574,6 @@ MAX_RELEASE_CHECK_RATE default: 4095 unless not HAVE_MMAP
/* The maximum possible size_t value has all bits set */
#define MAX_SIZE_T (~(size_t)0)
-
#ifndef ONLY_MSPACES
#define ONLY_MSPACES 0 /* define to a value */
#else
@@ -1169,7 +1173,7 @@ void dlmalloc_stats(void);
p = malloc(n);
assert(malloc_usable_size(p) >= 256);
*/
-size_t dlmalloc_usable_size(void*);
+extern size_t dlmalloc_usable_size(void*);
#if MSPACES
@@ -5029,9 +5033,9 @@ static void** ialloc(mstate m,
/* -------------------------- public routines ---------------------------- */
-
#if !ONLY_MSPACES
+error "should not reach here"
void* dlmalloc(size_t bytes) {
/*
Basic algorithm:
@@ -5158,7 +5162,7 @@ void* dlmalloc(size_t bytes) {
goto postaction;
}
- mem = sys_alloc(gm, nb);
+ mem = sys_alloc(gm, nb, 0);
postaction:
POSTACTION(gm);
@@ -5378,7 +5382,7 @@ int dlmallopt(int param_number, int value) {
}
#endif /* !ONLY_MSPACES */
-
+#if 0 //ANDROID_BUILD
size_t dlmalloc_usable_size(void* mem) {
if (mem != 0) {
mchunkptr p = mem2chunk(mem);
@@ -5387,6 +5391,7 @@ size_t dlmalloc_usable_size(void* mem) {
}
return 0;
}
+#endif
/* ----------------------------- user mspaces ---------------------------- */
@@ -5632,7 +5637,6 @@ void mspace_free(mspace msp, void* mem) {
mchunkptr p = mem2chunk(mem);
#if FOOTERS
mstate fm = get_mstate_for(p);
- msp = msp; /* placate people compiling -Wunused */
#else /* FOOTERS */
mstate fm = (mstate)msp;
#endif /* FOOTERS */
@@ -6184,3 +6188,4 @@ History:
*/
+#endif // _MALLOC_C_H_
diff --git a/nedmalloc.c b/nedmalloc.c
index 999a9c2..e35c7aa 100644
--- a/nedmalloc.c
+++ b/nedmalloc.c
@@ -88,12 +88,14 @@ DEALINGS IN THE SOFTWARE.
#else
#if defined(__cplusplus)
extern "C"
+#include <new>
+#include <memory>
#else
extern
#endif
#if defined(__linux__) || defined(__FreeBSD__)
/* Sadly we can't include <malloc.h> as it causes a redefinition error */
-size_t malloc_usable_size(void *);
+size_t malloc_usable_size(const void *);
#elif defined(__APPLE__)
#if TARGET_OS_IPHONE
#include <malloc/malloc.h>
@@ -305,14 +307,14 @@ extern void *(*sysmalloc)(size_t);
extern void *(*syscalloc)(size_t, size_t);
extern void *(*sysrealloc)(void *, size_t);
extern void (*sysfree)(void *);
-extern size_t (*sysblksize)(void *);
+extern size_t (*sysblksize)(const void *);
#if !defined(REPLACE_SYSTEM_ALLOCATOR) || (!defined(_MSC_VER) && !defined(__MINGW32__))
void *(*sysmalloc)(size_t)=malloc;
void *(*syscalloc)(size_t, size_t)=calloc;
void *(*sysrealloc)(void *, size_t)=realloc;
void (*sysfree)(void *)=free;
-size_t (*sysblksize)(void *)=
+size_t (*sysblksize)(const void *)=
#if defined(_MSC_VER) || defined(__MINGW32__)
/* This is the MSVCRT equivalent */
_msize;
@@ -491,7 +493,7 @@ static FORCEINLINE void CallFree(void *RESTRICT mspace, void *RESTRICT mem, int
#endif
}
-static NEDMALLOCNOALIASATTR mstate nedblkmstate(void *RESTRICT mem) THROWSPEC
+static NEDMALLOCNOALIASATTR mstate nedblkmstate(const void *RESTRICT mem) THROWSPEC
{
if(mem)
{
@@ -624,7 +626,7 @@ static NEDMALLOCNOALIASATTR mstate nedblkmstate(void *RESTRICT mem) THROWSPEC
}
return 0;
}
-NEDMALLOCNOALIASATTR size_t nedblksize(int *RESTRICT isforeign, void *RESTRICT mem, unsigned flags) THROWSPEC
+NEDMALLOCNOALIASATTR size_t nedblksize(int *RESTRICT isforeign, const void *RESTRICT mem, unsigned flags) THROWSPEC
{
if(mem)
{
@@ -660,18 +662,18 @@ NEDMALLOCNOALIASATTR size_t nedblksize(int *RESTRICT isforeign, void *RESTRICT m
}
return 0;
}
-NEDMALLOCNOALIASATTR size_t nedmemsize(void *RESTRICT mem) THROWSPEC { return nedblksize(0, mem, 0); }
+NEDMALLOCNOALIASATTR size_t nedmemsize(const void *mem) THROWSPEC { return nedblksize(0, mem, 0); }
NEDMALLOCNOALIASATTR void nedsetvalue(void *v) THROWSPEC { nedpsetvalue((nedpool *) 0, v); }
NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR void * nedmalloc(size_t size) THROWSPEC { return nedpmalloc((nedpool *) 0, size); }
-NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR void * nedcalloc(size_t no, size_t size) THROWSPEC { return nedpcalloc((nedpool *) 0, no, size); }
+void * nedcalloc(size_t no, size_t size) THROWSPEC { return nedpcalloc((nedpool *) 0, no, size); }
NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR void * nedrealloc(void *mem, size_t size) THROWSPEC { return nedprealloc((nedpool *) 0, mem, size); }
NEDMALLOCNOALIASATTR void nedfree(void *mem) THROWSPEC { nedpfree((nedpool *) 0, mem); }
NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR void * nedmemalign(size_t alignment, size_t bytes) THROWSPEC { return nedpmemalign((nedpool *) 0, alignment, bytes); }
NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR void * nedmalloc2(size_t size, size_t alignment, unsigned flags) THROWSPEC { return nedpmalloc2((nedpool *) 0, size, alignment, flags); }
NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR void * nedrealloc2(void *mem, size_t size, size_t alignment, unsigned flags) THROWSPEC { return nedprealloc2((nedpool *) 0, mem, size, alignment, flags); }
NEDMALLOCNOALIASATTR void nedfree2(void *mem, unsigned flags) THROWSPEC { nedpfree2((nedpool *) 0, mem, flags); }
-NEDMALLOCNOALIASATTR struct nedmallinfo nedmallinfo(void) THROWSPEC { return nedpmallinfo((nedpool *) 0); }
+NEDMALLOCNOALIASATTR struct nedmallinfo nedmallinfo_t(void) THROWSPEC { return nedpmallinfo((nedpool *) 0); }
NEDMALLOCNOALIASATTR int nedmallopt(int parno, int value) THROWSPEC { return nedpmallopt((nedpool *) 0, parno, value); }
NEDMALLOCNOALIASATTR int nedmalloc_trim(size_t pad) THROWSPEC { return nedpmalloc_trim((nedpool *) 0, pad); }
void nedmalloc_stats() THROWSPEC { nedpmalloc_stats((nedpool *) 0); }
@@ -1211,7 +1213,7 @@ size_t nedflushlogs(nedpool *p, char *filepath) THROWSPEC
p=&syspool;
if(!syspool.threads) InitPool(&syspool, 0, -1);
}
- if(p->caches)
+ //if(p->caches)
{
threadcache *tc;
int n;
@@ -1295,7 +1297,7 @@ size_t nedflushlogs(nedpool *p, char *filepath) THROWSPEC
}
static void DestroyCaches(nedpool *RESTRICT p) THROWSPEC
{
- if(p->caches)
+ //if(p->caches)
{
threadcache *tc;
int n;
@@ -1347,7 +1349,7 @@ static NOINLINE threadcache *AllocCache(nedpool *RESTRICT p) THROWSPEC
1;
#endif
for(end=1; p->m[end]; end++);
- tc->mymspace=abs(tc->threadid) % end;
+ tc->mymspace=labs(tc->threadid) % end;
#if ENABLE_LOGGING
{
mchunkptr cp;
@@ -2102,7 +2104,10 @@ NEDMALLOCNOALIASATTR void nedpfree(nedpool *p, void *mem) THROWSPEC
struct nedmallinfo nedpmallinfo(nedpool *p) THROWSPEC
{
int n;
- struct nedmallinfo ret={0};
+ // LINARO FIX : Build error: missing field 'ordblks' initializer
+ //struct nedmallinfo ret={0};
+ struct nedmallinfo ret;
+ memset(&ret, 0, sizeof(ret));
if(!p) { p=&syspool; if(!syspool.threads) InitPool(&syspool, 0, -1); }
for(n=0; p->m[n]; n++)
{
@@ -2265,6 +2270,40 @@ NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR void **nedpindependent_comalloc(nedpool *p
#endif
return ret;
}
+#ifdef LINARO_ANDPORT
+/* Wrapper functions to fix build */
+void* ned_dlpvalloc(size_t bytes) {
+ return NULL;
+}
+
+void* ned_dlvalloc(size_t bytes) {
+ return NULL;
+}
+
+int nedposix_memalign(void **memptr, size_t alignment, size_t bytes) {
+ *memptr = nedpmemalign((nedpool *) 0, alignment, bytes);
+ if (*memptr != NULL)
+ return 0;
+ else
+ return -1;
+}
+
+void nedmalloc_disable()
+{}
+
+void nedmalloc_enable()
+{}
+
+int nediterate(__attribute__((__unused__)) uintptr_t base,
+ __attribute__((__unused__)) size_t size,
+ __attribute__((__unused__)) void (*callback)(uintptr_t ptr,
+ size_t size,
+ void* arg),
+ __attribute__((__unused__)) void* arg)
+{
+ return 0;
+}
+#endif //LINARO_ANDPORT
#if defined(__cplusplus)
}
diff --git a/nedmalloc.h b/nedmalloc.h
index ba699be..325f344 100644
--- a/nedmalloc.h
+++ b/nedmalloc.h
@@ -96,6 +96,18 @@ indicates a C++0x compiler, otherwise you'll need to set it yourself.
Define to enable the usage of &lt;type_traits&gt;. Automatically defined if __cplusplus
indicates a C++0x compiler, otherwise you'll need to set it yourself.
*/
+/* Changes to port nedmalloc on android*/
+#define LINARO_ANDPORT 1
+#ifdef ACCESS_FROM_BIONIC
+/** LINARO FIX:
+ * header file gets included from .cpp file, but library has only .c
+ * files, so either move nemalloc.c --> nedmalloc.cpp and build the library or
+ * expose header file as normal c header file only
+ */
+#ifdef __cplusplus
+#undef __cplusplus
+#endif
+#endif //ACCESS_FROM_BIONIC
#if __cplusplus > 199711L || defined(HAVE_CPP0X) /* Do we have C++0x? */
#undef HAVE_CPP0XRVALUEREFS
@@ -261,6 +273,22 @@ on non-Windows builds (it uses Win32 SEH to trap segfaults on Windows and there
is no comparable system on POSIX).
*/
+#ifdef LINARO_ANDPORT
+// This to match the return type.
+/* Note: Not using REPLACE_SYSTEM_ALLOCATOR flag, as it raises multiple
+ * defination errors which are already defined in system malloc.h.
+ * Also if its usage leads to change in approach defined (to use alternate
+ * malloc) in malloc_common.cpp
+ */
+
+/* use default name for mallinfo. Function & Structure has same name.
+ * so changed function name from nedmallinfo() to nedmallinfo_t()
+ */
+#define nedmallinfo mallinfo
+/* malloc.h should not re-defined this structure again, hence defining the
+ * macro here, used by malloc.h
+ */
+#define STRUCT_MALLINFO_DECLARED 1
#if defined(__cplusplus)
extern "C" {
#endif
@@ -281,6 +309,8 @@ struct nedmallinfo {
}
#endif
+#endif // _LINARO_ANDPORT
+
/*! \def NO_NED_NAMESPACE
\brief Defines the use of the nedalloc namespace for the C functions.
@@ -452,12 +482,14 @@ asked for due to rounding etc. Optionally returns 1 in isforeign if the block ca
system allocator - note that there is a small (>0.01%) but real chance of segfault on non-Windows
systems when passing non-nedmalloc blocks if you don't use USE_MAGIC_HEADERS.
*/
-NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR size_t nedblksize(int *RESTRICT isforeign, void *RESTRICT mem, unsigned flags=0) THROWSPEC;
+NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR size_t nedblksize(int *RESTRICT isforeign, const void *RESTRICT mem, unsigned flags=0) THROWSPEC;
#else
-NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR size_t nedblksize(int *RESTRICT isforeign, void *RESTRICT mem, unsigned flags) THROWSPEC;
+NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR size_t nedblksize(int *RESTRICT isforeign, const void *RESTRICT mem, unsigned flags) THROWSPEC;
#endif
+
+__BEGIN_DECLS
/*! \brief Identical to nedblksize() except without the isforeign */
-NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR size_t nedmemsize(void *RESTRICT mem) THROWSPEC;
+NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR size_t nedmemsize(const void *RESTRICT mem) THROWSPEC;
/*! \brief Equivalent to nedpsetvalue((nedpool *) 0, v) */
NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR void nedsetvalue(void *v) THROWSPEC;
@@ -472,6 +504,9 @@ NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR void * nedrealloc(void *m
NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR void nedfree(void *mem) THROWSPEC;
/*! \brief Equivalent to nedpmalloc2((nedpool *) 0, size, alignment, 0) */
NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR void * nedmemalign(size_t alignment, size_t bytes) THROWSPEC;
+/*! \brief Equivalent to nedpmallinfo((nedpool *) 0) */
+NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR struct nedmallinfo nedmallinfo_t(void) THROWSPEC;
+__END_DECLS
#if defined(__cplusplus)
/*! \ingroup v2malloc
@@ -489,8 +524,6 @@ NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR void * nedrealloc2(void *
NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR void nedfree2(void *mem, unsigned flags) THROWSPEC;
#endif
-/*! \brief Equivalent to nedpmallinfo((nedpool *) 0) */
-NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR struct nedmallinfo nedmallinfo(void) THROWSPEC;
/*! \brief Equivalent to nedpmallopt((nedpool *) 0, parno, value) */
NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR int nedmallopt(int parno, int value) THROWSPEC;
/*! \brief Returns the internal allocation granularity and the magic header XOR used for internal consistency checks. */
@@ -514,6 +547,24 @@ get a fatal exception!
*/
NEDMALLOCEXTSPEC void neddestroysyspool() THROWSPEC;
+
+#define _LINARO_AND_PORT 1
+#ifdef _LINARO_AND_PORT
+__BEGIN_DECLS
+void* ned_dlpvalloc(size_t);
+void* ned_dlvalloc(size_t);
+/* Dummy function to fix build */
+int nedposix_memalign(void **memptr, size_t alignment, size_t bytes);
+void nedmalloc_disable();
+void nedmalloc_enable();
+int nediterate(__attribute__((__unused__)) uintptr_t base,
+ __attribute__((__unused__)) size_t size,
+ __attribute__((__unused__)) void (*callback)(uintptr_t ptr,
+ size_t size,
+ void* arg),
+ __attribute__((__unused__)) void* arg);
+__END_DECLS
+#endif //_LINARO_AND_PORT
/*! \brief A nedpool type */
struct nedpool_t;
/*! \brief A nedpool type */