|
@@ -27,7 +27,9 @@ libc_hidden_proto(sbrk)
|
|
programs can do a little mallocing without mmaping in more space. */
|
|
programs can do a little mallocing without mmaping in more space. */
|
|
HEAP_DECLARE_STATIC_FREE_AREA (initial_fa, 256);
|
|
HEAP_DECLARE_STATIC_FREE_AREA (initial_fa, 256);
|
|
struct heap_free_area *__malloc_heap = HEAP_INIT_WITH_FA (initial_fa);
|
|
struct heap_free_area *__malloc_heap = HEAP_INIT_WITH_FA (initial_fa);
|
|
|
|
+#ifdef HEAP_USE_LOCKING
|
|
malloc_mutex_t __malloc_heap_lock = PTHREAD_MUTEX_INITIALIZER;
|
|
malloc_mutex_t __malloc_heap_lock = PTHREAD_MUTEX_INITIALIZER;
|
|
|
|
+#endif
|
|
|
|
|
|
#if defined(MALLOC_USE_LOCKING) && defined(MALLOC_USE_SBRK)
|
|
#if defined(MALLOC_USE_LOCKING) && defined(MALLOC_USE_SBRK)
|
|
|
|
|
|
@@ -45,12 +47,18 @@ struct malloc_mmb *__malloc_mmapped_blocks = 0;
|
|
annoying ways. */
|
|
annoying ways. */
|
|
HEAP_DECLARE_STATIC_FREE_AREA (initial_mmb_fa, 48);
|
|
HEAP_DECLARE_STATIC_FREE_AREA (initial_mmb_fa, 48);
|
|
struct heap_free_area *__malloc_mmb_heap = HEAP_INIT_WITH_FA (initial_mmb_fa);
|
|
struct heap_free_area *__malloc_mmb_heap = HEAP_INIT_WITH_FA (initial_mmb_fa);
|
|
|
|
+#ifdef HEAP_USE_LOCKING
|
|
malloc_mutex_t __malloc_mmb_heap_lock = PTHREAD_MUTEX_INITIALIZER;
|
|
malloc_mutex_t __malloc_mmb_heap_lock = PTHREAD_MUTEX_INITIALIZER;
|
|
|
|
+#endif
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
|
|
static void *
|
|
static void *
|
|
|
|
+#ifdef HEAP_USE_LOCKING
|
|
malloc_from_heap (size_t size, struct heap_free_area *heap, malloc_mutex_t *heap_lock)
|
|
malloc_from_heap (size_t size, struct heap_free_area *heap, malloc_mutex_t *heap_lock)
|
|
|
|
+#else
|
|
|
|
+malloc_from_heap (size_t size, struct heap_free_area *heap)
|
|
|
|
+#endif
|
|
{
|
|
{
|
|
void *mem;
|
|
void *mem;
|
|
|
|
|
|
@@ -59,12 +67,12 @@ malloc_from_heap (size_t size, struct heap_free_area *heap, malloc_mutex_t *heap
|
|
|
|
|
|
size += MALLOC_HEADER_SIZE;
|
|
size += MALLOC_HEADER_SIZE;
|
|
|
|
|
|
- __pthread_mutex_lock (heap_lock);
|
|
+ __heap_do_lock (heap_lock);
|
|
|
|
|
|
|
|
|
|
mem = __heap_alloc (heap, &size);
|
|
mem = __heap_alloc (heap, &size);
|
|
|
|
|
|
- __pthread_mutex_unlock (heap_lock);
|
|
+ __heap_do_unlock (heap_lock);
|
|
|
|
|
|
if (unlikely (! mem))
|
|
if (unlikely (! mem))
|
|
|
|
|
|
@@ -128,7 +136,7 @@ malloc_from_heap (size_t size, struct heap_free_area *heap, malloc_mutex_t *heap
|
|
(long)block, (long)block + block_size, block_size);
|
|
(long)block, (long)block + block_size, block_size);
|
|
|
|
|
|
|
|
|
|
- __pthread_mutex_lock (heap_lock);
|
|
+ __heap_do_lock (heap_lock);
|
|
|
|
|
|
|
|
|
|
__heap_free (heap, block, block_size);
|
|
__heap_free (heap, block, block_size);
|
|
@@ -138,7 +146,7 @@ malloc_from_heap (size_t size, struct heap_free_area *heap, malloc_mutex_t *heap
|
|
|
|
|
|
mem = __heap_alloc (heap, &size);
|
|
mem = __heap_alloc (heap, &size);
|
|
|
|
|
|
- __pthread_mutex_unlock (heap_lock);
|
|
+ __heap_do_unlock (heap_lock);
|
|
|
|
|
|
#if !defined(MALLOC_USE_SBRK) && defined(__UCLIBC_UCLINUX_BROKEN_MUNMAP__)
|
|
#if !defined(MALLOC_USE_SBRK) && defined(__UCLIBC_UCLINUX_BROKEN_MUNMAP__)
|
|
|
|
|
|
@@ -150,7 +158,11 @@ malloc_from_heap (size_t size, struct heap_free_area *heap, malloc_mutex_t *heap
|
|
if (block < mmb->mem)
|
|
if (block < mmb->mem)
|
|
break;
|
|
break;
|
|
|
|
|
|
|
|
+#ifdef HEAP_USE_LOCKING
|
|
new_mmb = malloc_from_heap (sizeof *new_mmb, __malloc_mmb_heap, &__malloc_mmb_heap_lock);
|
|
new_mmb = malloc_from_heap (sizeof *new_mmb, __malloc_mmb_heap, &__malloc_mmb_heap_lock);
|
|
|
|
+#else
|
|
|
|
+ new_mmb = malloc_from_heap (sizeof *new_mmb, __malloc_mmb_heap);
|
|
|
|
+#endif
|
|
new_mmb->next = mmb;
|
|
new_mmb->next = mmb;
|
|
new_mmb->mem = block;
|
|
new_mmb->mem = block;
|
|
new_mmb->size = block_size;
|
|
new_mmb->size = block_size;
|
|
@@ -193,7 +205,7 @@ malloc (size_t size)
|
|
__malloc_debug_init ();
|
|
__malloc_debug_init ();
|
|
}
|
|
}
|
|
if (__malloc_check)
|
|
if (__malloc_check)
|
|
- __heap_check (&__malloc_heap, "malloc");
|
|
+ __heap_check (__malloc_heap, "malloc");
|
|
#endif
|
|
#endif
|
|
|
|
|
|
#ifdef __MALLOC_GLIBC_COMPAT__
|
|
#ifdef __MALLOC_GLIBC_COMPAT__
|
|
@@ -209,7 +221,11 @@ malloc (size_t size)
|
|
if (unlikely(((unsigned long)size > (unsigned long)(MALLOC_HEADER_SIZE*-2))))
|
|
if (unlikely(((unsigned long)size > (unsigned long)(MALLOC_HEADER_SIZE*-2))))
|
|
goto oom;
|
|
goto oom;
|
|
|
|
|
|
|
|
+#ifdef HEAP_USE_LOCKING
|
|
mem = malloc_from_heap (size, __malloc_heap, &__malloc_heap_lock);
|
|
mem = malloc_from_heap (size, __malloc_heap, &__malloc_heap_lock);
|
|
|
|
+#else
|
|
|
|
+ mem = malloc_from_heap (size, __malloc_heap);
|
|
|
|
+#endif
|
|
if (unlikely (!mem))
|
|
if (unlikely (!mem))
|
|
{
|
|
{
|
|
oom:
|
|
oom:
|