mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 12:30:06 +00:00
hurdmalloc: Run fork handler as late as possible [BZ #19431]
This is the hurd-specific follow-up for
29d794863c
: hurdmalloc also needs the
same fix
* hurd/hurdmalloc.c (malloc_fork_prepare): Rename to
_hurd_malloc_fork_prepare.
(malloc_fork_parent): Rename to _hurd_malloc_fork_parent.
(malloc_fork_child): Rename to _hurd_malloc_fork_child.
(_hurd_fork_prepare_hook): Drop malloc_fork_prepare.
(_hurd_fork_parent_hook): Drop malloc_fork_parent.
(_hurd_fork_child_hook): Drop malloc_fork_child.
* hurd/hurdmalloc.h (_hurd_malloc_fork_prepare,
_hurd_malloc_fork_parent, _hurd_malloc_fork_child): Add declarations.
* sysdeps/mach/hurd/fork.c (__fork): Call __malloc_fork_lock_parent
after locking locks (notably hurd_dtable_lock). Call
_hurd_malloc_fork_prepare after that. Call _hurd_malloc_fork_parent
before __malloc_fork_unlock_parent and _hurd_malloc_fork_child before
__malloc_fork_unlock_child.
This commit is contained in:
parent
87ab10d652
commit
e67f54ab1a
17
ChangeLog
17
ChangeLog
@ -1,3 +1,20 @@
|
|||||||
|
2016-09-22 Samuel Thibault <samuel.thibault@ens-lyon.org>
|
||||||
|
|
||||||
|
* hurd/hurdmalloc.c (malloc_fork_prepare): Rename to
|
||||||
|
_hurd_malloc_fork_prepare.
|
||||||
|
(malloc_fork_parent): Rename to _hurd_malloc_fork_parent.
|
||||||
|
(malloc_fork_child): Rename to _hurd_malloc_fork_child.
|
||||||
|
(_hurd_fork_prepare_hook): Drop malloc_fork_prepare.
|
||||||
|
(_hurd_fork_parent_hook): Drop malloc_fork_parent.
|
||||||
|
(_hurd_fork_child_hook): Drop malloc_fork_child.
|
||||||
|
* hurd/hurdmalloc.h (_hurd_malloc_fork_prepare,
|
||||||
|
_hurd_malloc_fork_parent, _hurd_malloc_fork_child): Add declarations.
|
||||||
|
* sysdeps/mach/hurd/fork.c (__fork): Call __malloc_fork_lock_parent
|
||||||
|
after locking locks (notably hurd_dtable_lock). Call
|
||||||
|
_hurd_malloc_fork_prepare after that. Call _hurd_malloc_fork_parent
|
||||||
|
before __malloc_fork_unlock_parent and _hurd_malloc_fork_child before
|
||||||
|
__malloc_fork_unlock_child.
|
||||||
|
|
||||||
2016-09-21 James Greenhalgh <james.greenhalgh@arm.com>
|
2016-09-21 James Greenhalgh <james.greenhalgh@arm.com>
|
||||||
|
|
||||||
* soft-fp/extendhftf2.c: New.
|
* soft-fp/extendhftf2.c: New.
|
||||||
|
@ -405,8 +405,8 @@ print_malloc_free_list (void)
|
|||||||
}
|
}
|
||||||
#endif /* DEBUG */
|
#endif /* DEBUG */
|
||||||
|
|
||||||
static void
|
void
|
||||||
malloc_fork_prepare(void)
|
_hurd_malloc_fork_prepare(void)
|
||||||
/*
|
/*
|
||||||
* Prepare the malloc module for a fork by insuring that no thread is in a
|
* Prepare the malloc module for a fork by insuring that no thread is in a
|
||||||
* malloc critical section.
|
* malloc critical section.
|
||||||
@ -419,8 +419,8 @@ malloc_fork_prepare(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
void
|
||||||
malloc_fork_parent(void)
|
_hurd_malloc_fork_parent(void)
|
||||||
/*
|
/*
|
||||||
* Called in the parent process after a fork() to resume normal operation.
|
* Called in the parent process after a fork() to resume normal operation.
|
||||||
*/
|
*/
|
||||||
@ -432,8 +432,8 @@ malloc_fork_parent(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
void
|
||||||
malloc_fork_child(void)
|
_hurd_malloc_fork_child(void)
|
||||||
/*
|
/*
|
||||||
* Called in the child process after a fork() to resume normal operation.
|
* Called in the child process after a fork() to resume normal operation.
|
||||||
*/
|
*/
|
||||||
@ -446,7 +446,4 @@ malloc_fork_child(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
text_set_element (_hurd_fork_prepare_hook, malloc_fork_prepare);
|
|
||||||
text_set_element (_hurd_fork_parent_hook, malloc_fork_parent);
|
|
||||||
text_set_element (_hurd_fork_child_hook, malloc_fork_child);
|
|
||||||
text_set_element (_hurd_preinit_hook, malloc_init);
|
text_set_element (_hurd_preinit_hook, malloc_init);
|
||||||
|
@ -12,6 +12,10 @@ extern void *_hurd_malloc (size_t);
|
|||||||
extern void *_hurd_realloc (void *, size_t);
|
extern void *_hurd_realloc (void *, size_t);
|
||||||
extern void _hurd_free (void *);
|
extern void _hurd_free (void *);
|
||||||
|
|
||||||
|
extern void _hurd_malloc_fork_prepare (void);
|
||||||
|
extern void _hurd_malloc_fork_parent (void);
|
||||||
|
extern void _hurd_malloc_fork_child (void);
|
||||||
|
|
||||||
#define malloc _hurd_malloc
|
#define malloc _hurd_malloc
|
||||||
#define realloc _hurd_realloc
|
#define realloc _hurd_realloc
|
||||||
#define free _hurd_free
|
#define free _hurd_free
|
||||||
|
@ -108,12 +108,6 @@ __fork (void)
|
|||||||
/* Run things that prepare for forking before we create the task. */
|
/* Run things that prepare for forking before we create the task. */
|
||||||
RUN_HOOK (_hurd_fork_prepare_hook, ());
|
RUN_HOOK (_hurd_fork_prepare_hook, ());
|
||||||
|
|
||||||
/* Acquire malloc locks. This needs to come last because fork
|
|
||||||
handlers may use malloc, and the libio list lock has an
|
|
||||||
indirect malloc dependency as well (via the getdelim
|
|
||||||
function). */
|
|
||||||
call_function_static_weak (__malloc_fork_lock_parent);
|
|
||||||
|
|
||||||
/* Lock things that want to be locked before we fork. */
|
/* Lock things that want to be locked before we fork. */
|
||||||
{
|
{
|
||||||
void *const *p;
|
void *const *p;
|
||||||
@ -124,6 +118,13 @@ __fork (void)
|
|||||||
}
|
}
|
||||||
__mutex_lock (&_hurd_siglock);
|
__mutex_lock (&_hurd_siglock);
|
||||||
|
|
||||||
|
/* Acquire malloc locks. This needs to come last because fork
|
||||||
|
handlers may use malloc, and the libio list lock has an
|
||||||
|
indirect malloc dependency as well (via the getdelim
|
||||||
|
function). */
|
||||||
|
call_function_static_weak (__malloc_fork_lock_parent);
|
||||||
|
_hurd_malloc_fork_prepare ();
|
||||||
|
|
||||||
newtask = MACH_PORT_NULL;
|
newtask = MACH_PORT_NULL;
|
||||||
thread = sigthread = MACH_PORT_NULL;
|
thread = sigthread = MACH_PORT_NULL;
|
||||||
newproc = MACH_PORT_NULL;
|
newproc = MACH_PORT_NULL;
|
||||||
@ -612,6 +613,7 @@ __fork (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Release malloc locks. */
|
/* Release malloc locks. */
|
||||||
|
_hurd_malloc_fork_parent ();
|
||||||
call_function_static_weak (__malloc_fork_unlock_parent);
|
call_function_static_weak (__malloc_fork_unlock_parent);
|
||||||
|
|
||||||
/* Run things that want to run in the parent to restore it to
|
/* Run things that want to run in the parent to restore it to
|
||||||
@ -666,6 +668,7 @@ __fork (void)
|
|||||||
__sigemptyset (&_hurdsig_traced);
|
__sigemptyset (&_hurdsig_traced);
|
||||||
|
|
||||||
/* Release malloc locks. */
|
/* Release malloc locks. */
|
||||||
|
_hurd_malloc_fork_child ();
|
||||||
call_function_static_weak (__malloc_fork_unlock_child);
|
call_function_static_weak (__malloc_fork_unlock_child);
|
||||||
|
|
||||||
/* Run things that want to run in the child task to set up. */
|
/* Run things that want to run in the child task to set up. */
|
||||||
|
Loading…
Reference in New Issue
Block a user