mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 12:30:06 +00:00
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:
parent
25efda03df
commit
38316352e0
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user