#if 0
#define USLEEP (1000000 / 2)
#endif
-#define TIMEOUT_SECS 10
+#define TIMEOUT_SECS 20
+/* LOOPS_MIN is a safety as QEMU clock time sucks.
+ 100000 is 4s natively and 53s in QEMU. */
+#define LOOPS_MIN 500000
#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
STATE_STOPPED,
STATE_PTRACED,
STATE_ZOMBIE,
+ STATE_DEAD,
STATE_LAST
};
case STATE_STOPPED: return "STATE_STOPPED";
case STATE_PTRACED: return "STATE_PTRACED";
case STATE_ZOMBIE: return "STATE_ZOMBIE";
+ case STATE_DEAD: return "STATE_DEAD";
default: crash ();
}
/* NOTREACHED */
found = STATE_PTRACED;
else if (strcmp (line + length, "Z (zombie)\n") == 0)
found = STATE_ZOMBIE;
+ /* FIXME: What does it mean? */
+ else if (strcmp (line + length, "X (dead)\n") == 0)
+ found = STATE_DEAD;
else
{
fprintf (stderr, "Found an unknown state: %s", line + length);
{
enum state found;
time_t timeout = time (NULL) + TIMEOUT_SECS;
+ unsigned loops = 0;
/* Sanity check `1 << enum state' was not misplaced with `enum state'. */
assert (1 << (STATE_FIRST + 1) >= STATE_LAST);
if (((1 << found) & expect_mask) != 0)
return found;
}
- while (time (NULL) < timeout);
+ while (loops++ < LOOPS_MIN || time (NULL) < timeout);
fprintf (stderr, "Found for PID %d state %s but expecting (%s)\n",
(int) pid, state_to_name (found), expect_mask_string);