Skip to content

Commit

Permalink
Update.
Browse files Browse the repository at this point in the history
2004-12-10  Ulrich Drepper  <drepper@redhat.com>

	* malloc/arena.c (arena_get2): Prevent endless loop if arenas and
	list lock are taken.
  • Loading branch information
Ulrich Drepper committed Dec 10, 2004
1 parent 410b107 commit 8c7d369
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 13 deletions.
5 changes: 5 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
2004-12-10 Ulrich Drepper <drepper@redhat.com>

* malloc/arena.c (arena_get2): Prevent endless loop if arenas and
list lock are taken.

2004-12-08 Thorsten Kukuk <kukuk@suse.de>

* nis/nss_nisplus/nisplus-netgrp.c (_nss_nisplus_getnetgrent_r):
Expand Down
33 changes: 20 additions & 13 deletions malloc/arena.c
Original file line number Diff line number Diff line change
Expand Up @@ -782,9 +782,12 @@ arena_get2(a_tsd, size) mstate a_tsd; size_t size;
}

/* Check the global, circularly linked list for available arenas. */
bool retried = false;
repeat:
do {
if(!mutex_trylock(&a->mutex)) {
if (retried)
(void)mutex_unlock(&list_lock);
THREAD_STAT(++(a->stat_lock_loop));
tsd_setspecific(arena_key, (Void_t *)a);
return a;
Expand All @@ -796,29 +799,33 @@ arena_get2(a_tsd, size) mstate a_tsd; size_t size;
happen during `atfork', or for example on systems where thread
creation makes it temporarily impossible to obtain _any_
locks. */
if(mutex_trylock(&list_lock)) {
if(!retried && mutex_trylock(&list_lock)) {
/* We will block to not run in a busy loop. */
(void)mutex_lock(&list_lock);

/* Since we blocked there might be an arena available now. */
retried = true;
a = a_tsd;
goto repeat;
}
(void)mutex_unlock(&list_lock);

/* Nothing immediately available, so generate a new arena. */
a = _int_new_arena(size);
if(!a)
return 0;
if(a)
{
tsd_setspecific(arena_key, (Void_t *)a);
mutex_init(&a->mutex);
mutex_lock(&a->mutex); /* remember result */

tsd_setspecific(arena_key, (Void_t *)a);
mutex_init(&a->mutex);
mutex_lock(&a->mutex); /* remember result */
/* Add the new arena to the global list. */
a->next = main_arena.next;
atomic_write_barrier ();
main_arena.next = a;

/* Add the new arena to the global list. */
(void)mutex_lock(&list_lock);
a->next = main_arena.next;
atomic_write_barrier ();
main_arena.next = a;
THREAD_STAT(++(a->stat_lock_loop));
}
(void)mutex_unlock(&list_lock);

THREAD_STAT(++(a->stat_lock_loop));
return a;
}

Expand Down

0 comments on commit 8c7d369

Please sign in to comment.