summaryrefslogtreecommitdiffstats
path: root/memory/build/mozmemory_wrap.c
diff options
context:
space:
mode:
Diffstat (limited to 'memory/build/mozmemory_wrap.c')
-rw-r--r--memory/build/mozmemory_wrap.c178
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 */