X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gio%2Fgsubprocess.c;h=999d777e4f8d07c7b2b63cf405e1a364d1b349f7;hb=2a53b4d0e2c98a14aedf31e38f0ad1fb2e8fe26f;hp=b02cf3ebf3a45a4c0587b2c5faab30ca23446c3d;hpb=03bf43e14aa3d5c22f9365a6c6137e3bb1f67b02;p=platform%2Fupstream%2Fglib.git diff --git a/gio/gsubprocess.c b/gio/gsubprocess.c index b02cf3e..999d777 100644 --- a/gio/gsubprocess.c +++ b/gio/gsubprocess.c @@ -18,6 +18,7 @@ * SECTION:gsubprocess * @title: GSubprocess * @short_description: Child processes + * @include: gio/gio.h * @see_also: #GSubprocessLauncher * * #GSubprocess allows the creation of and interaction with child @@ -35,16 +36,15 @@ * comprehensive API for asynchronous I/O, such * g_output_stream_splice_async(). This makes GSubprocess * significantly more powerful and flexible than equivalent APIs in - * some other languages such as the subprocess.py + * some other languages such as the `subprocess.py` * included with Python. For example, using #GSubprocess one could * create two child processes, reading standard output from the first, * processing it, and writing to the input stream of the second, all * without blocking the main loop. * * A powerful g_subprocess_communicate() API is provided similar to the - * communicate() method of - * subprocess.py. This enables very easy interaction - * with a subprocess that has been opened with pipes. + * `communicate()` method of `subprocess.py`. This enables very easy + * interaction with a subprocess that has been opened with pipes. * * #GSubprocess defaults to tight control over the file descriptors open * in the child process, avoiding dangling-fd issues that are caused by @@ -71,8 +71,8 @@ * change of working directory, child setup functions, etc). * * A typical use of #GSubprocess will involve calling - * g_subprocess_new(), followed by g_subprocess_wait() or - * g_subprocess_wait_sync(). After the process exits, the status can be + * g_subprocess_new(), followed by g_subprocess_wait_async() or + * g_subprocess_wait(). After the process exits, the status can be * checked using functions such as g_subprocess_get_if_exited() (which * are similar to the familiar WIFEXITED-style POSIX macros). * @@ -610,12 +610,15 @@ g_subprocess_finalize (GObject *object) g_clear_object (&self->stderr_pipe); g_strfreev (self->argv); + g_mutex_clear (&self->pending_waits_lock); + G_OBJECT_CLASS (g_subprocess_parent_class)->finalize (object); } static void g_subprocess_init (GSubprocess *self) { + g_mutex_init (&self->pending_waits_lock); } static void @@ -646,8 +649,8 @@ g_subprocess_class_init (GSubprocessClass *class) * g_subprocess_new: (skip) * @flags: flags that define the behaviour of the subprocess * @error: (allow-none): return location for an error, or %NULL - * @argv0: first commandline argument to pass to the subprocess, - * followed by more arguments, followed by %NULL + * @argv0: first commandline argument to pass to the subprocess + * @...: more commandline arguments, followed by %NULL * * Create a new process with the given flags and varargs argument * list. By default, matching the g_spawn_async() defaults, the @@ -683,6 +686,7 @@ g_subprocess_new (GSubprocessFlags flags, while ((arg = va_arg (ap, const gchar *))) g_ptr_array_add (args, (gchar *) arg); g_ptr_array_add (args, NULL); + va_end (ap); result = g_subprocess_newv ((const gchar * const *) args->pdata, flags, error); @@ -693,7 +697,7 @@ g_subprocess_new (GSubprocessFlags flags, /** * g_subprocess_newv: - * @argv: commandline arguments for the subprocess + * @argv: (array zero-terminated=1) (element-type utf8): commandline arguments for the subprocess * @flags: flags that define the behaviour of the subprocess * @error: (allow-none): return location for an error, or %NULL * @@ -724,8 +728,8 @@ g_subprocess_newv (const gchar * const *argv, * g_subprocess_get_identifier: * @subprocess: a #GSubprocess * - * On UNIX, returns the process ID as a decimal string. On Windows, - * returns the result of GetProcessId() also as a string. + * On UNIX, returns the process ID as a decimal string. + * On Windows, returns the result of GetProcessId() also as a string. */ const gchar * g_subprocess_get_identifier (GSubprocess *subprocess) @@ -748,7 +752,7 @@ g_subprocess_get_identifier (GSubprocess *subprocess) * The process must have been created with * %G_SUBPROCESS_FLAGS_STDIN_PIPE. * - * Returns: the stdout pipe + * Returns: (transfer none): the stdout pipe * * Since: 2.40 **/ @@ -771,7 +775,7 @@ g_subprocess_get_stdin_pipe (GSubprocess *subprocess) * The process must have been created with * %G_SUBPROCESS_FLAGS_STDOUT_PIPE. * - * Returns: the stdout pipe + * Returns: (transfer none): the stdout pipe * * Since: 2.40 **/ @@ -794,7 +798,7 @@ g_subprocess_get_stdout_pipe (GSubprocess *subprocess) * The process must have been created with * %G_SUBPROCESS_FLAGS_STDERR_PIPE. * - * Returns: the stderr pipe + * Returns: (transfer none): the stderr pipe * * Since: 2.40 **/ @@ -937,6 +941,9 @@ g_subprocess_sync_complete (GAsyncResult **result) * This function does not fail in the case of the subprocess having * abnormal termination. See g_subprocess_wait_check() for that. * + * Cancelling @cancellable doesn't kill the subprocess. Call + * g_subprocess_force_exit() if it is desirable. + * * Returns: %TRUE on success, %FALSE if @cancellable was cancelled * * Since: 2.40 @@ -1417,7 +1424,7 @@ g_subprocess_communicate_made_progress (GObject *source_object, source == state->stdout_buf || source == state->stderr_buf) { - if (!g_output_stream_splice_finish ((GOutputStream*)source, result, &error)) + if (g_output_stream_splice_finish ((GOutputStream*) source, result, &error) == -1) goto out; if (source == state->stdout_buf || @@ -1765,7 +1772,7 @@ g_subprocess_communicate_utf8 (GSubprocess *subprocess, * @callback: Callback * @user_data: User data * - * Asynchronous version of g_subprocess_communicate_utf(). Complete + * Asynchronous version of g_subprocess_communicate_utf8(). Complete * invocation with g_subprocess_communicate_utf8_finish(). */ void