mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 15:53:54 -06:00
tcg: use QTree instead of GTree
qemu-user can hang in a multi-threaded fork. One common reason is that when creating a TB, between fork and exec we manipulate a GTree whose memory allocator (GSlice) is not fork-safe. Although POSIX does not mandate it, the system's allocator (e.g. tcmalloc, libc malloc) is probably fork-safe. Fix some of these hangs by using QTree, which uses the system's allocator regardless of the Glib version that we used at configuration time. Tested with the test program in the original bug report, i.e.: ``` void garble() { int pid = fork(); if (pid == 0) { exit(0); } else { int wstatus; waitpid(pid, &wstatus, 0); } } void supragarble(unsigned depth) { if (depth == 0) return ; std::thread a(supragarble, depth-1); std::thread b(supragarble, depth-1); garble(); a.join(); b.join(); } int main() { supragarble(10); } ``` Resolves: https://gitlab.com/qemu-project/qemu/-/issues/285 Reported-by: Valentin David <me@valentindavid.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Emilio Cota <cota@braap.org> Message-Id: <20230205163758.416992-3-cota@braap.org> [rth: Add QEMU_DISABLE_CFI for all callback using functions.] Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
e3feb2cc22
commit
1ff4a81bd3
3 changed files with 23 additions and 21 deletions
|
@ -310,7 +310,7 @@ q_tree_node_next(QTreeNode *node)
|
|||
*
|
||||
* Since: 2.70 in GLib. Internal in Qtree, i.e. not in the public API.
|
||||
*/
|
||||
static void
|
||||
static void QEMU_DISABLE_CFI
|
||||
q_tree_remove_all(QTree *tree)
|
||||
{
|
||||
QTreeNode *node;
|
||||
|
@ -532,7 +532,7 @@ q_tree_replace(QTree *tree,
|
|||
}
|
||||
|
||||
/* internal insert routine */
|
||||
static QTreeNode *
|
||||
static QTreeNode * QEMU_DISABLE_CFI
|
||||
q_tree_insert_internal(QTree *tree,
|
||||
gpointer key,
|
||||
gpointer value,
|
||||
|
@ -721,7 +721,7 @@ q_tree_steal(QTree *tree,
|
|||
}
|
||||
|
||||
/* internal remove routine */
|
||||
static gboolean
|
||||
static gboolean QEMU_DISABLE_CFI
|
||||
q_tree_remove_internal(QTree *tree,
|
||||
gconstpointer key,
|
||||
gboolean steal)
|
||||
|
@ -1182,7 +1182,7 @@ q_tree_node_balance(QTreeNode *node)
|
|||
return node;
|
||||
}
|
||||
|
||||
static QTreeNode *
|
||||
static QTreeNode * QEMU_DISABLE_CFI
|
||||
q_tree_find_node(QTree *tree,
|
||||
gconstpointer key)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue