diff options
author | Florian Weimer <fweimer@redhat.com> | 2015-10-28 19:32:46 +0100 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2015-10-28 21:29:23 +0100 |
commit | a62719ba90e2fa1728890ae7dc8df9e32a622e7b (patch) | |
tree | 27408968ee32da2b27effd96bce95fd93c399208 /malloc/malloc.c | |
parent | 0b9af583a5c2d68085e88cece13952bf05dc4882 (diff) | |
download | glibc-a62719ba90e2fa1728890ae7dc8df9e32a622e7b.zip glibc-a62719ba90e2fa1728890ae7dc8df9e32a622e7b.tar.gz glibc-a62719ba90e2fa1728890ae7dc8df9e32a622e7b.tar.bz2 |
malloc: Prevent arena free_list from turning cyclic [BZ #19048]
[BZ# 19048]
* malloc/malloc.c (struct malloc_state): Update comment. Add
attached_threads member.
(main_arena): Initialize attached_threads.
* malloc/arena.c (list_lock): Update comment.
(ptmalloc_lock_all, ptmalloc_unlock_all): Likewise.
(ptmalloc_unlock_all2): Reinitialize arena reference counts.
(deattach_arena): New function.
(_int_new_arena): Initialize arena reference count and deattach
replaced arena.
(get_free_list, reused_arena): Update reference count and deattach
replaced arena.
(arena_thread_freeres): Update arena reference count and only put
unreferenced arenas on the free list.
Diffstat (limited to 'malloc/malloc.c')
-rw-r--r-- | malloc/malloc.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/malloc/malloc.c b/malloc/malloc.c index 9371b5a..35c8863 100644 --- a/malloc/malloc.c +++ b/malloc/malloc.c @@ -1709,9 +1709,15 @@ struct malloc_state /* Linked list */ struct malloc_state *next; - /* Linked list for free arenas. */ + /* Linked list for free arenas. Access to this field is serialized + by list_lock in arena.c. */ struct malloc_state *next_free; + /* Number of threads attached to this arena. 0 if the arena is on + the free list. Access to this field is serialized by list_lock + in arena.c. */ + INTERNAL_SIZE_T attached_threads; + /* Memory allocated from the system in this arena. */ INTERNAL_SIZE_T system_mem; INTERNAL_SIZE_T max_system_mem; @@ -1755,7 +1761,8 @@ struct malloc_par static struct malloc_state main_arena = { .mutex = MUTEX_INITIALIZER, - .next = &main_arena + .next = &main_arena, + .attached_threads = 1 }; /* There is only one instance of the malloc parameters. */ |