Merge branch 'th/gchildwatch-fail-message' into 'main'

[th/gchildwatch-fail-message] gmain: improve g_warning() for failure in g_child_watch_dispatch()

See merge request GNOME/glib!3542
This commit is contained in:
Philip Withnall 2023-08-17 23:05:22 +00:00
commit 0c63639723

View File

@ -5922,17 +5922,20 @@ g_child_watch_dispatch (GSource *source,
} }
else else
{ {
g_debug (G_STRLOC ": pidfd signaled but pid %d didn't exit", g_debug (G_STRLOC ": pidfd signaled but pid %" G_PID_FORMAT " didn't exit",
child_watch_source->pid); child_watch_source->pid);
return TRUE; return TRUE;
} }
} }
else else
{ {
/* Unknown error. We got signaled that the process might be exited, int errsv = errno;
* but now we failed to reap it? Assume the process is gone and proceed. */
g_warning (G_STRLOC ": pidfd signaled ready but failed for pid %d", g_warning (G_STRLOC ": waitid(pid:%" G_PID_FORMAT ", pidfd=%d) failed: %s (%d). %s",
child_watch_source->pid); child_watch_source->pid, child_watch_source->poll.fd, g_strerror (errsv), errsv,
"See documentation of g_child_watch_source_new() for possible causes.");
/* Assume the process is gone and proceed. */
child_exited = TRUE; child_exited = TRUE;
} }
} }
@ -5951,6 +5954,9 @@ g_child_watch_dispatch (GSource *source,
pid = waitpid (child_watch_source->pid, &wstatus, WNOHANG); pid = waitpid (child_watch_source->pid, &wstatus, WNOHANG);
if (G_UNLIKELY (pid < 0 && errno == EINTR))
goto waitpid_again;
if (pid == 0) if (pid == 0)
{ {
/* Not exited yet. Wait longer. */ /* Not exited yet. Wait longer. */
@ -5959,13 +5965,15 @@ g_child_watch_dispatch (GSource *source,
if (pid > 0) if (pid > 0)
wait_status = wstatus; wait_status = wstatus;
else if (errno == ECHILD)
g_warning ("GChildWatchSource: Exit status of a child process was requested but ECHILD was received by waitpid(). See the documentation of g_child_watch_source_new() for possible causes.");
else if (errno == EINTR)
goto waitpid_again;
else else
{ {
/* Unexpected error. Whatever happened, we are done waiting for this child. */ int errsv = errno;
g_warning (G_STRLOC ": waitpid(pid:%" G_PID_FORMAT ") failed: %s (%d). %s",
child_watch_source->pid, g_strerror (errsv), errsv,
"See documentation of g_child_watch_source_new() for possible causes.");
/* Assume the process is gone and proceed. */
} }
} }
} }