mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-01-13 15:56:23 +01:00
Fix race condition in gapplication/basic test
The three processes this test creates need to be executed in order, and g_usleep was used to guarantee that. However, under heavy load, that is not enough. Instead, wait until the children start by making sure they have written to stdout before proceeding any further. https://bugzilla.gnome.org/show_bug.cgi?id=664627
This commit is contained in:
parent
3e5214c15c
commit
edf94ba263
@ -61,6 +61,7 @@ spawn (const gchar *expected_stdout,
|
|||||||
gchar **args;
|
gchar **args;
|
||||||
va_list ap;
|
va_list ap;
|
||||||
GPid pid;
|
GPid pid;
|
||||||
|
GPollFD fd;
|
||||||
|
|
||||||
va_start (ap, first_arg);
|
va_start (ap, first_arg);
|
||||||
array = g_ptr_array_new ();
|
array = g_ptr_array_new ();
|
||||||
@ -83,6 +84,14 @@ spawn (const gchar *expected_stdout,
|
|||||||
|
|
||||||
g_child_watch_add (pid, child_quit, data);
|
g_child_watch_add (pid, child_quit, data);
|
||||||
outstanding_watches++;
|
outstanding_watches++;
|
||||||
|
|
||||||
|
/* we block until the children write to stdout to make sure
|
||||||
|
* they have started, as they need to be executed in order;
|
||||||
|
* see https://bugzilla.gnome.org/show_bug.cgi?id=664627
|
||||||
|
*/
|
||||||
|
fd.fd = data->stdout_pipe;
|
||||||
|
fd.events = G_IO_IN | G_IO_HUP | G_IO_ERR;
|
||||||
|
g_poll (&fd, 1, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -102,16 +111,10 @@ basic (void)
|
|||||||
"exit status: 0\n",
|
"exit status: 0\n",
|
||||||
"./app", NULL);
|
"./app", NULL);
|
||||||
|
|
||||||
/* make sure it becomes the master */
|
|
||||||
g_usleep (100000);
|
|
||||||
|
|
||||||
/* send it some files */
|
/* send it some files */
|
||||||
spawn ("exit status: 0\n",
|
spawn ("exit status: 0\n",
|
||||||
"./app", "/a", "/b", NULL);
|
"./app", "/a", "/b", NULL);
|
||||||
|
|
||||||
/* make sure the commandline arrives after the files */
|
|
||||||
g_usleep (100000);
|
|
||||||
|
|
||||||
spawn ("40 + 2 = 42\n"
|
spawn ("40 + 2 = 42\n"
|
||||||
"exit status: 42\n",
|
"exit status: 42\n",
|
||||||
"./cmd", "40 +", "2", NULL);
|
"./cmd", "40 +", "2", NULL);
|
||||||
|
Loading…
Reference in New Issue
Block a user