diff options
Diffstat (limited to 'memory/build/mozmemory_wrap.c')
-rw-r--r-- | memory/build/mozmemory_wrap.c | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/memory/build/mozmemory_wrap.c b/memory/build/mozmemory_wrap.c new file mode 100644 index 000000000..dba3ace56 --- /dev/null +++ b/memory/build/mozmemory_wrap.c @@ -0,0 +1,178 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include <string.h> +#include "mozmemory_wrap.h" +#include "mozilla/Types.h" + +/* Declare malloc implementation functions with the right return and + * argument types. */ +#define MALLOC_DECL(name, return_type, ...) \ + MOZ_MEMORY_API return_type name ## _impl(__VA_ARGS__); +#include "malloc_decls.h" + +#ifdef MOZ_WRAP_NEW_DELETE +/* operator new(unsigned int) */ +MOZ_MEMORY_API void * +mozmem_malloc_impl(_Znwj)(unsigned int size) +{ + return malloc_impl(size); +} +/* operator new[](unsigned int) */ +MOZ_MEMORY_API void * +mozmem_malloc_impl(_Znaj)(unsigned int size) +{ + return malloc_impl(size); +} +/* operator delete(void*) */ +MOZ_MEMORY_API void +mozmem_malloc_impl(_ZdlPv)(void *ptr) +{ + free_impl(ptr); +} +/* operator delete[](void*) */ +MOZ_MEMORY_API void +mozmem_malloc_impl(_ZdaPv)(void *ptr) +{ + free_impl(ptr); +} +/*operator new(unsigned int, std::nothrow_t const&)*/ +MOZ_MEMORY_API void * +mozmem_malloc_impl(_ZnwjRKSt9nothrow_t)(unsigned int size) +{ + return malloc_impl(size); +} +/*operator new[](unsigned int, std::nothrow_t const&)*/ +MOZ_MEMORY_API void * +mozmem_malloc_impl(_ZnajRKSt9nothrow_t)(unsigned int size) +{ + return malloc_impl(size); +} +/* operator delete(void*, std::nothrow_t const&) */ +MOZ_MEMORY_API void +mozmem_malloc_impl(_ZdlPvRKSt9nothrow_t)(void *ptr) +{ + free_impl(ptr); +} +/* operator delete[](void*, std::nothrow_t const&) */ +MOZ_MEMORY_API void +mozmem_malloc_impl(_ZdaPvRKSt9nothrow_t)(void *ptr) +{ + free_impl(ptr); +} +#endif + +/* strndup and strdup may be defined as macros in string.h, which would + * clash with the definitions below. */ +#undef strndup +#undef strdup + +#ifndef XP_DARWIN +MOZ_MEMORY_API char * +strndup_impl(const char *src, size_t len) +{ + char* dst = (char*) malloc_impl(len + 1); + if (dst) { + strncpy(dst, src, len); + dst[len] = '\0'; + } + return dst; +} + +MOZ_MEMORY_API char * +strdup_impl(const char *src) +{ + size_t len = strlen(src); + return strndup_impl(src, len); +} +#endif /* XP_DARWIN */ + +#ifdef ANDROID +#include <stdarg.h> +#include <stdio.h> + +MOZ_MEMORY_API int +vasprintf_impl(char **str, const char *fmt, va_list ap) +{ + char* ptr, *_ptr; + int ret; + + if (str == NULL || fmt == NULL) { + return -1; + } + + ptr = (char*)malloc_impl(128); + if (ptr == NULL) { + *str = NULL; + return -1; + } + + ret = vsnprintf(ptr, 128, fmt, ap); + if (ret < 0) { + free_impl(ptr); + *str = NULL; + return -1; + } + + _ptr = realloc_impl(ptr, ret + 1); + if (_ptr == NULL) { + free_impl(ptr); + *str = NULL; + return -1; + } + + *str = _ptr; + + return ret; +} + +MOZ_MEMORY_API int +asprintf_impl(char **str, const char *fmt, ...) +{ + int ret; + va_list ap; + va_start(ap, fmt); + + ret = vasprintf_impl(str, fmt, ap); + + va_end(ap); + + return ret; +} +#endif + +#ifdef XP_WIN +/* + * There's a fun allocator mismatch in (at least) the VS 2010 CRT + * (see the giant comment in $(topsrcdir)/mozglue/build/Makefile.in) + * that gets redirected here to avoid a crash on shutdown. + */ +void +dumb_free_thunk(void *ptr) +{ + return; /* shutdown leaks that we don't care about */ +} + +#include <wchar.h> + +/* + * We also need to provide our own impl of wcsdup so that we don't ask + * the CRT for memory from its heap (which will then be unfreeable). + */ +wchar_t * +wcsdup_impl(const wchar_t *src) +{ + size_t len = wcslen(src); + wchar_t *dst = (wchar_t*) malloc_impl((len + 1) * sizeof(wchar_t)); + if (dst) + wcsncpy(dst, src, len + 1); + return dst; +} + +void * +_aligned_malloc(size_t size, size_t alignment) +{ + return memalign_impl(alignment, size); +} +#endif /* XP_WIN */ |