static void free_atfork(Void_t* mem, const Void_t *caller) { Void_t *vptr = NULL; mstate ar_ptr; mchunkptr p; /* chunk corresponding to mem */ if (mem == 0) /* free(0) has no effect */ return; p = mem2chunk(mem); /* do not bother to replicate free_check here */ #if HAVE_MMAP if (chunk_is_mmapped(p)) /* release mmapped memory. */ { munmap_chunk(p); return; } #endif #ifdef ATOMIC_FASTBINS ar_ptr = arena_for_chunk(p); tsd_getspecific(arena_key, vptr); _int_free(ar_ptr, p, vptr == ATFORK_ARENA_PTR); #else ar_ptr = arena_for_chunk(p); tsd_getspecific(arena_key, vptr); if(vptr != ATFORK_ARENA_PTR) (void)mutex_lock(&ar_ptr->mutex); _int_free(ar_ptr, p); if(vptr != ATFORK_ARENA_PTR) (void)mutex_unlock(&ar_ptr->mutex); #endif }
static void free_check (void *mem, const void *caller) { mchunkptr p; if (!mem) return; (void) mutex_lock (&main_arena.mutex); p = mem2chunk_check (mem, NULL); if (!p) { (void) mutex_unlock (&main_arena.mutex); malloc_printerr (check_action, "free(): invalid pointer", mem); return; } if (chunk_is_mmapped (p)) { (void) mutex_unlock (&main_arena.mutex); munmap_chunk (p); return; } _int_free (&main_arena, p, 1); (void) mutex_unlock (&main_arena.mutex); }
static void free_atfork (void *mem, const void *caller) { void *vptr = NULL; mstate ar_ptr; mchunkptr p; /* chunk corresponding to mem */ if (mem == 0) /* free(0) has no effect */ return; p = mem2chunk (mem); /* do not bother to replicate free_check here */ if (chunk_is_mmapped (p)) /* release mmapped memory. */ { munmap_chunk (p); return; } ar_ptr = arena_for_chunk (p); tsd_getspecific (arena_key, vptr); _int_free (ar_ptr, p, vptr == ATFORK_ARENA_PTR); }