Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Xfce
xfce4-session
Commits
dee0200f
Commit
dee0200f
authored
Apr 26, 2013
by
Nick Schermer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Use the async spawn function of glib.
parent
37b8785f
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
15 additions
and
30 deletions
+15
-30
xfce4-session/xfsm-startup.c
xfce4-session/xfsm-startup.c
+15
-30
No files found.
xfce4-session/xfsm-startup.c
View file @
dee0200f
...
...
@@ -864,6 +864,7 @@ xfsm_startup_start_properties (XfsmProperties *properties,
gint
n
;
const
gchar
*
current_directory
;
GPid
pid
;
GError
*
error
=
NULL
;
/* release any possible old resources related to a previous startup */
xfsm_properties_set_default_child_watch
(
properties
);
...
...
@@ -878,44 +879,28 @@ xfsm_startup_start_properties (XfsmProperties *properties,
current_directory
=
xfsm_properties_get_string
(
properties
,
SmCurrentDirectory
);
/* fork a new process for the application */
#ifdef HAVE_VFORK
/* vfork() doesn't allow you to do anything but call exec*() or _exit(),
* so if we need to set the working directory, we can't use vfork() */
if
(
current_directory
==
NULL
)
pid
=
vfork
();
else
#endif
pid
=
fork
();
/* handle the child process */
if
(
pid
==
0
)
if
(
!
g_spawn_async
(
current_directory
,
argv
,
NULL
,
G_SPAWN_DO_NOT_REAP_CHILD
|
G_SPAWN_SEARCH_PATH
,
NULL
,
NULL
,
&
pid
,
&
error
))
{
/* execute the application here */
if
(
current_directory
)
{
if
(
chdir
(
current_directory
))
g_warning
(
"Unable to chdir to
\"
%s
\"
: %s"
,
current_directory
,
strerror
(
errno
));
}
execvp
(
argv
[
0
],
argv
);
_exit
(
127
);
}
/* cleanup */
g_strfreev
(
argv
);
g_warning
(
"Unable to launch
\"
%s
\"
: %s"
,
*
argv
,
error
->
message
);
g_error_free
(
error
);
g_strfreev
(
argv
);
/* check if we failed to fork */
if
(
G_UNLIKELY
(
pid
<
0
))
{
/* tell the user that we failed to fork */
perror
(
"Failed to fork new process"
);
return
FALSE
;
}
xfsm_verbose
(
"Launched command
\"
%s
\"
with PID %dn"
,
*
argv
,
(
gint
)
pid
);
g_strfreev
(
argv
);
properties
->
pid
=
pid
;
/* set a watch to make sure the child doesn't quit before registering */
child_watch_data
=
g_new
(
XfsmStartupData
,
1
);
child_watch_data
=
g_new
0
(
XfsmStartupData
,
1
);
child_watch_data
->
manager
=
g_object_ref
(
manager
);
child_watch_data
->
properties
=
properties
;
g_child_watch_add_full
(
G_PRIORITY_LOW
,
properties
->
pid
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment