support: Make support_process_state_wait return the found state

So caller can check which state was found if multiple ones are
asked.

Checked on x86_64-linux-gnu.

Reviewed-by: Florian Weimer <fweimer@redhat.com>
This commit is contained in:
Adhemerval Zanella 2024-09-13 11:10:05 -03:00
parent 25efda03df
commit 38316352e0
3 changed files with 24 additions and 8 deletions

View File

@ -31,13 +31,16 @@ enum support_process_state
support_process_state_dead = 0x20, /* X (dead). */ support_process_state_dead = 0x20, /* X (dead). */
support_process_state_zombie = 0x40, /* Z (zombie). */ support_process_state_zombie = 0x40, /* Z (zombie). */
support_process_state_parked = 0x80, /* P (parked). */ support_process_state_parked = 0x80, /* P (parked). */
support_process_state_invalid = 0x100 /* Invalid state. */
}; };
/* Wait for process PID to reach state STATE. It can be a combination of /* Wait for process PID to reach state STATE. It can be a combination of
multiple possible states ('process_state_running | process_state_sleeping') multiple possible states ('process_state_running | process_state_sleeping')
where the function return when any of these state are observed. where the function return when any of these state are observed.
For an invalid state not represented by SUPPORT_PROCESS_STATE, it fallbacks For an invalid state not represented by SUPPORT_PROCESS_STATE, it fallbacks
to a 2 second sleep. */ to a 2 second sleep.
void support_process_state_wait (pid_t pid, enum support_process_state state); Return the found process state. */
enum support_process_state
support_process_state_wait (pid_t pid, enum support_process_state state);
#endif #endif

View File

@ -27,7 +27,7 @@
#include <support/xstdio.h> #include <support/xstdio.h>
#include <support/check.h> #include <support/check.h>
void enum support_process_state
support_process_state_wait (pid_t pid, enum support_process_state state) support_process_state_wait (pid_t pid, enum support_process_state state)
{ {
#ifdef __linux__ #ifdef __linux__
@ -75,7 +75,7 @@ support_process_state_wait (pid_t pid, enum support_process_state state)
{ {
free (line); free (line);
xfclose (fstatus); xfclose (fstatus);
return; return process_states[i].s;
} }
rewind (fstatus); rewind (fstatus);
@ -90,4 +90,6 @@ support_process_state_wait (pid_t pid, enum support_process_state state)
/* Fallback to nanosleep if an invalid state is found. */ /* Fallback to nanosleep if an invalid state is found. */
#endif #endif
nanosleep (&(struct timespec) { 1, 0 }, NULL); nanosleep (&(struct timespec) { 1, 0 }, NULL);
return support_process_state_invalid;
} }

View File

@ -68,28 +68,39 @@ do_test (void)
if (test_verbose) if (test_verbose)
printf ("info: waiting pid %d, state_stopped/state_tracing_stop\n", printf ("info: waiting pid %d, state_stopped/state_tracing_stop\n",
(int) pid); (int) pid);
support_process_state_wait (pid, stop_state); {
enum support_process_state state =
support_process_state_wait (pid, stop_state);
TEST_VERIFY (state == support_process_state_stopped
|| state == support_process_state_tracing_stop);
}
if (kill (pid, SIGCONT) != 0) if (kill (pid, SIGCONT) != 0)
FAIL_RET ("kill (%d, SIGCONT): %m\n", pid); FAIL_RET ("kill (%d, SIGCONT): %m\n", pid);
if (test_verbose) if (test_verbose)
printf ("info: waiting pid %d, state_sleeping\n", (int) pid); printf ("info: waiting pid %d, state_sleeping\n", (int) pid);
support_process_state_wait (pid, support_process_state_sleeping); TEST_COMPARE (support_process_state_wait (pid,
support_process_state_sleeping),
support_process_state_sleeping);
if (kill (pid, SIGUSR1) != 0) if (kill (pid, SIGUSR1) != 0)
FAIL_RET ("kill (%d, SIGUSR1): %m\n", pid); FAIL_RET ("kill (%d, SIGUSR1): %m\n", pid);
if (test_verbose) if (test_verbose)
printf ("info: waiting pid %d, state_running\n", (int) pid); printf ("info: waiting pid %d, state_running\n", (int) pid);
support_process_state_wait (pid, support_process_state_running); TEST_COMPARE (support_process_state_wait (pid,
support_process_state_running),
support_process_state_running);
if (kill (pid, SIGKILL) != 0) if (kill (pid, SIGKILL) != 0)
FAIL_RET ("kill (%d, SIGKILL): %m\n", pid); FAIL_RET ("kill (%d, SIGKILL): %m\n", pid);
if (test_verbose) if (test_verbose)
printf ("info: waiting pid %d, state_zombie\n", (int) pid); printf ("info: waiting pid %d, state_zombie\n", (int) pid);
support_process_state_wait (pid, support_process_state_zombie); TEST_COMPARE (support_process_state_wait (pid,
support_process_state_zombie),
support_process_state_zombie);;
siginfo_t info; siginfo_t info;
int r = waitid (P_PID, pid, &info, WEXITED); int r = waitid (P_PID, pid, &info, WEXITED);