mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2025-12-30 15:30:11 +01:00
dispatcher: run "wait" scripts only after "no-wait" scripts complete
Previously, dispatcher would start all "no-wait" script right away, but it would also start the first "wait" script while the "no-wait" script are still running (unless, there are other "wait" scripts that delay the execution). Now, do not start processing the "wait" scripts, as long as there are any "no-wait" scripts from the same request running.
This commit is contained in:
parent
1999723241
commit
e97a334e37
1 changed files with 23 additions and 2 deletions
|
|
@ -130,6 +130,7 @@ struct Request {
|
|||
GPtrArray *scripts; /* list of ScriptInfo */
|
||||
guint idx;
|
||||
gint num_scripts_done;
|
||||
gint num_scripts_nowait;
|
||||
};
|
||||
|
||||
static void
|
||||
|
|
@ -146,6 +147,7 @@ static void
|
|||
request_free (Request *request)
|
||||
{
|
||||
g_assert_cmpuint (request->num_scripts_done, ==, request->scripts->len);
|
||||
g_assert_cmpuint (request->num_scripts_nowait, ==, 0);
|
||||
|
||||
g_free (request->action);
|
||||
g_free (request->iface);
|
||||
|
|
@ -295,8 +297,18 @@ complete_script (ScriptInfo *script)
|
|||
/* this was a "no-wait" script. We either completed the request,
|
||||
* or there is nothing to do. Especially, there is no need to
|
||||
* queue the next_request() -- because no-wait scripts don't block
|
||||
* requests. */
|
||||
return;
|
||||
* requests. However, if this was the last "no-wait" script and
|
||||
* there are "wait" scripts ready to run, launch them.
|
||||
*/
|
||||
if ( script->request->num_scripts_nowait == 0
|
||||
&& handler->current_request == script->request) {
|
||||
|
||||
if (dispatch_one_script (script->request))
|
||||
return;
|
||||
|
||||
complete_request (script->request);
|
||||
} else
|
||||
return;
|
||||
}
|
||||
|
||||
while (next_request (handler, NULL)) {
|
||||
|
|
@ -328,6 +340,8 @@ script_watch_cb (GPid pid, gint status, gpointer user_data)
|
|||
script->watch_id = 0;
|
||||
nm_clear_g_source (&script->timeout_id);
|
||||
script->request->num_scripts_done++;
|
||||
if (!script->wait)
|
||||
script->request->num_scripts_nowait--;
|
||||
|
||||
if (WIFEXITED (status)) {
|
||||
err = WEXITSTATUS (status);
|
||||
|
|
@ -369,6 +383,8 @@ script_timeout_cb (gpointer user_data)
|
|||
script->timeout_id = 0;
|
||||
nm_clear_g_source (&script->watch_id);
|
||||
script->request->num_scripts_done++;
|
||||
if (!script->wait)
|
||||
script->request->num_scripts_nowait--;
|
||||
|
||||
g_warning ("Script '%s' took too long; killing it.", script->script);
|
||||
|
||||
|
|
@ -471,6 +487,8 @@ script_dispatch (ScriptInfo *script)
|
|||
if (g_spawn_async ("/", argv, request->envp, G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, &script->pid, &error)) {
|
||||
script->watch_id = g_child_watch_add (script->pid, (GChildWatchFunc) script_watch_cb, script);
|
||||
script->timeout_id = g_timeout_add_seconds (SCRIPT_TIMEOUT, script_timeout_cb, script);
|
||||
if (!script->wait)
|
||||
request->num_scripts_nowait++;
|
||||
return TRUE;
|
||||
} else {
|
||||
g_warning ("Failed to execute script '%s': (%d) %s",
|
||||
|
|
@ -486,6 +504,9 @@ script_dispatch (ScriptInfo *script)
|
|||
static gboolean
|
||||
dispatch_one_script (Request *request)
|
||||
{
|
||||
if (request->num_scripts_nowait > 0)
|
||||
return TRUE;
|
||||
|
||||
while (request->idx < request->scripts->len) {
|
||||
ScriptInfo *script;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue