18 Commits

Author SHA1 Message Date
Vasily Galkin
387739b018 gspawn, tests: check passing special chars in args
The existing singlethread g_spawn_sync test is modified and now tests
that special characters in arguments are correctly passed to child.
The test is added before spawn escaping fixing on win32
and covers the case currently broken on win32:
'trailing \ in argument containing space'.
2018-12-26 23:30:57 +03:00
Daniel Drake
16c3409888 gspawn: treat all negative fds as unset
Philip Withnall suggests that glib should treat all negative
file descriptors as unset/invalid, rather than explicitly requiring
them to be -1.

This can simplify the logic for some users of this code.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/132
2018-06-29 11:44:12 -05:00
Philip Withnall
6a22663d9a tests: Various minor leak fixes in the GLib tests
Signed-off-by: Philip Withnall <withnall@endlessm.com>
2018-06-29 12:13:32 +01:00
Daniel Drake
61f54591ac gspawn: Optimize with posix_spawn codepath
When the amount of free memory on the system is somewhat low, gnome-shell
will sometimes fail to launch apps, reporting the error:
  fork(): Cannot allocate memory

fork() is failing here because while cloning the process virtual address
space, Linux worries that the thread being forked may end up COWing the
entire address space of the parent process (gnome-shell, which is
memory-hungry), and there is not enough free memory to permit that to
happen.

In this case we are simply calling fork() in order to quickly call exec(),
which will throw away the entirity of the duplicated VM, so we should
look for ways to avoid the overcommit check.

The well known solution to this is to use clone(CLONE_VM) or vfork(), which
completely avoids creating a new memory address space for the child.
However, that comes with a bunch of caveats and complications:

  https://gist.github.com/nicowilliams/a8a07b0fc75df05f684c23c18d7db234
  https://ewontfix.com/7/

In 2016, glibc's posix_spawn() was rewritten to use this approach
while also resolving the concerns.
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=9ff72da471a509a8c19791efe469f47fa6977410

I experimented with a similar approach in glib, but it was not practical
because glibc has several items of important internal knowledge (such as
knowing which signals should be given special treatment because they are
NPTL implementation details) that are not cleanly exposed elsewhere.

Instead, this patch adapts the gspawn code to use posix_spawn() where
possible, which will reap the benefits of that implementation.
The posix_spawn API is more limited than the gspawn API though,
partly due to natural limitations of using CLONE_VM, so the posix_spawn
path is added as a separate codepath which is only executed when the
conditions are right. Callers such as gnome-shell will have to be modified
to meet these conditions, such as not having a child_setup function.

In addition to allowing for the gnome-shell "Cannot allocate memory"
failure to be avoided, this should result in a general speedup in this
area, because fork()'s behaviour of cloning the entire VM space
has a cost which is now avoided. posix_spawn() has also recently
been optimized on OpenSolaris as the most performant way to spawn
a child process.
2018-06-21 11:43:32 -05:00
Daniel Drake
3524de16e4 gspawn: Add g_spawn_async_with_fds variant
Add a new process spawning function variant which allows the caller
to pass specific file descriptors for stdin, stdout and stderr.
It is otherwise identical to g_spawn_async_with_pipes.

Allow the same fd to be passed in multiple parameters. To make this
workable, the child process logic that closes the fd after the first time
it has been dup2'ed needed tweaking; we now just set those fds to be
closed upon exec using the CLOEXEC flag. Add a test for this case.

This will be used by gnome-shell to avoid performing equivalent
dup2 actions in a child_setup function. Dropping use of child_setup will
enable use of an upcoming optimized process spawning codepath.
2018-06-21 11:43:32 -05:00
Philip Withnall
6c8da69443 gspawn: Make error codes on Windows more specific
A slightly modified patch originally written by Morten Welinder
<terra@gnome.org> to make the error codes returned by g_spawn_*()
functions more specific when on Windows. They are already this specific
on Linux.

Add a unit test for the ENOENT case.

https://gitlab.gnome.org/GNOME/glib/issues/303

Signed-off-by: Philip Withnall <withnall@endlessm.com>
2018-06-12 16:13:44 +01:00
Chun-wei Fan
a7707ec60b glib/tests/spawn-singlethread: Improve test for Windows
Use a Windows-style .bat script for the test_spawn_script() test, at least
when the code is built with Visual C++ (due to differences in how scripts
are written for shells and Windows cmd.exe), and account for Windows-style
line endings for that test too.

Let the MinGW builds (which are normally done in an MSYS BASH-style shell) continue to use the
*NIX-style script for that test.

https://bugzilla.gnome.org/show_bug.cgi?id=711047
2013-11-11 22:38:36 +08:00
Ryan Lortie
e66abbe2ef Some final g_test_build_filename() porting
This should be the last users that need to be ported.

For some of the oldschool non-gtester-ified tests, we call g_test_init()
from main() because it is necessary in order to use
g_test_build_filename().
2013-05-31 23:03:19 -04:00
Ryan Lortie
aa3db2c91b tests: fix a srcdir vs. destdir issue
The target file is a script, so it'll always be in SRCDIR for the uninstalled
case.  Just look there and avoid the libtool trickery.
2013-05-27 18:12:54 -04:00
Colin Walters
91d7c8de6b glib/tests: Drop unnecessary SRCDIR definitions
It's always going to be defined, we don't support compiling these
tests "by hand".  This is a cleanup commit for the installed tests
work.

https://bugzilla.gnome.org/show_bug.cgi?id=699079
2013-05-16 08:51:57 -04:00
Dan Winship
4c356443b8 tests/spawn-*.c: fix on Windows
Need to append ".exe" to the spawned binary name on Windows

https://bugzilla.gnome.org/show_bug.cgi?id=679683
2013-05-13 12:10:52 -04:00
Matthias Clasen
53a436221f Revert "tests/spawn-*.c: fix on Windows"
This reverts commit 602714a8dae08e395c8834aa059375de7dd877c0.
2012-12-19 15:20:05 -05:00
Dan Winship
602714a8da tests/spawn-*.c: fix on Windows
Need to append ".exe" to the spawned binary name on Windows

https://bugzilla.gnome.org/show_bug.cgi?id=679683
2012-12-19 14:35:13 -05:00
Dan Winship
1a2c5e155d glib/tests: fix leaks
https://bugzilla.gnome.org/show_bug.cgi?id=682560
2012-08-27 07:38:27 -04:00
Matthias Clasen
c1a83a4ac8 Fix distcheck
I forgot to dist a test script, and forgot to look for it
in srcdir instead of builddir.
2012-04-13 19:53:07 -04:00
Matthias Clasen
fb0951e67a spawn: Improve test coverage
Add a test that excercises the script execution code.
Unfortunately, much of this code only runs in the forked
child, and therefore its execution does not get caught
by gcov.
2012-04-08 10:24:52 -04:00
Matthias Clasen
ef159af00f Use G_SOURCE_CONTINUE/REMOVE internally
Now that we have these macros, we should use them.
This commit covers everything in glib/.
2012-01-25 16:15:18 -05:00
Ryan Lortie
a9a1c97904 gthread: move test cases to glib/ 2011-10-16 19:08:59 -04:00