shutdown: Preserve shutdown cause through replay

With the recent addition of ShutdownCause, we want to be able to pass
a cause through any shutdown request, and then faithfully replay that
cause when later replaying the same sequence.  The easiest way is to
expand the reply event mechanism to track a series of values for
EVENT_SHUTDOWN, one corresponding to each value of ShutdownCause.

We are free to change the replay stream as needed, since there are
already no guarantees about being able to use a replay stream by
any other version of qemu than the one that generated it.

The cause is not actually fed back until the next patch changes the
signature for requesting a shutdown; a TODO marks that upcoming change.

Yes, this uses the gcc/clang extension of a ranged case label,
but this is not the first time we've used non-C99 constructs.

Signed-off-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Pavel Dovgalyuk <pavel.dovgaluk@ispras.ru>
Message-Id: <20170515214114.15442-4-eblake@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
Eric Blake
2017-05-15 16:41:12 -05:00
committed by Markus Armbruster
parent aedbe19297
commit 802f045a5f
4 changed files with 9 additions and 6 deletions

View File

@ -49,8 +49,9 @@ bool replay_next_event_is(int event)
res = true;
}
switch (replay_state.data_kind) {
case EVENT_SHUTDOWN:
case EVENT_SHUTDOWN ... EVENT_SHUTDOWN_LAST:
replay_finish_event();
/* TODO - pass replay_state.data_kind - EVENT_SHUTDOWN as cause */
qemu_system_shutdown_request();
break;
default:
@ -170,11 +171,11 @@ bool replay_has_interrupt(void)
return res;
}
void replay_shutdown_request(void)
void replay_shutdown_request(ShutdownCause cause)
{
if (replay_mode == REPLAY_MODE_RECORD) {
replay_mutex_lock();
replay_put_event(EVENT_SHUTDOWN);
replay_put_event(EVENT_SHUTDOWN + cause);
replay_mutex_unlock();
}
}