diff options
author | Satish Patel <satish.patel@linaro.org> | 2016-04-02 18:22:16 +0530 |
---|---|---|
committer | Satish Patel <satish.patel@linaro.org> | 2016-04-02 18:22:16 +0530 |
commit | 7eed624495cf23054845c02424305d43a2641610 (patch) | |
tree | 2b05eef637b7e4ff58f969588c1c6932f31d6df1 | |
parent | 042b63cd8d14ecf23f3ae832f35a0f1d0e2ed47f (diff) | |
download | nedmalloc-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.mk | 72 | ||||
-rw-r--r-- | malloc.c.h | 17 | ||||
-rw-r--r-- | nedmalloc.c | 63 | ||||
-rw-r--r-- | nedmalloc.h | 61 |
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) @@ -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 <type_traits>. 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 */ |