From: Luiz Capitulino <lcapitulino@redhat.com>
To: qemu-devel@nongnu.org
Cc: kwolf@redhat.com, amit.shah@redhat.com, aliguori@us.ibm.com,
armbru@redhat.com, jan.kiszka@siemens.com
Subject: [Qemu-devel] [PATCH 4/9] runstate_set(): Check for valid transitions
Date: Tue, 6 Sep 2011 10:14:23 -0300 [thread overview]
Message-ID: <1315314868-24770-5-git-send-email-lcapitulino@redhat.com> (raw)
In-Reply-To: <1315314868-24770-1-git-send-email-lcapitulino@redhat.com>
This commit could have been folded with the previous one, however
doing it separately will allow for easy bisect and revert if needed.
Checking and testing all valid transitions wasn't trivial, chances
are this will need broader testing to become more stable.
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
---
vl.c | 149 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 148 insertions(+), 1 deletions(-)
diff --git a/vl.c b/vl.c
index 9926d2a..fe3628a 100644
--- a/vl.c
+++ b/vl.c
@@ -332,9 +332,156 @@ bool runstate_check(RunState state)
return current_run_state == state;
}
+/* This function will abort() on invalid state transitions */
void runstate_set(RunState new_state)
{
- assert(new_state < RSTATE_MAX);
+ switch (current_run_state) {
+ case RSTATE_NO_STATE:
+ switch (new_state) {
+ case RSTATE_RUNNING:
+ case RSTATE_IN_MIGRATE:
+ case RSTATE_PRE_LAUNCH:
+ goto transition_ok;
+ default:
+ /* invalid transition */
+ abort();
+ }
+ abort();
+ case RSTATE_DEBUG:
+ switch (new_state) {
+ case RSTATE_RUNNING:
+ goto transition_ok;
+ default:
+ /* invalid transition */
+ abort();
+ }
+ abort();
+ case RSTATE_IN_MIGRATE:
+ switch (new_state) {
+ case RSTATE_RUNNING:
+ case RSTATE_PRE_LAUNCH:
+ goto transition_ok;
+ default:
+ /* invalid transition */
+ abort();
+ }
+ abort();
+ case RSTATE_PANICKED:
+ switch (new_state) {
+ case RSTATE_PAUSED:
+ goto transition_ok;
+ default:
+ /* invalid transition */
+ abort();
+ }
+ abort();
+ case RSTATE_IO_ERROR:
+ switch (new_state) {
+ case RSTATE_RUNNING:
+ goto transition_ok;
+ default:
+ /* invalid transition */
+ abort();
+ }
+ abort();
+ case RSTATE_PAUSED:
+ switch (new_state) {
+ case RSTATE_RUNNING:
+ goto transition_ok;
+ default:
+ /* invalid transition */
+ abort();
+ }
+ abort();
+ case RSTATE_POST_MIGRATE:
+ switch (new_state) {
+ case RSTATE_RUNNING:
+ goto transition_ok;
+ default:
+ /* invalid transition */
+ abort();
+ }
+ abort();
+ case RSTATE_PRE_LAUNCH:
+ switch (new_state) {
+ case RSTATE_RUNNING:
+ case RSTATE_POST_MIGRATE:
+ goto transition_ok;
+ default:
+ /* invalid transition */
+ abort();
+ }
+ abort();
+ case RSTATE_PRE_MIGRATE:
+ switch (new_state) {
+ case RSTATE_RUNNING:
+ case RSTATE_POST_MIGRATE:
+ goto transition_ok;
+ default:
+ /* invalid transition */
+ abort();
+ }
+ abort();
+ case RSTATE_RESTORE:
+ switch (new_state) {
+ case RSTATE_RUNNING:
+ goto transition_ok;
+ default:
+ /* invalid transition */
+ abort();
+ }
+ abort();
+ case RSTATE_RUNNING:
+ switch (new_state) {
+ case RSTATE_DEBUG:
+ case RSTATE_PANICKED:
+ case RSTATE_IO_ERROR:
+ case RSTATE_PAUSED:
+ case RSTATE_PRE_MIGRATE:
+ case RSTATE_RESTORE:
+ case RSTATE_SAVEVM:
+ case RSTATE_SHUTDOWN:
+ case RSTATE_WATCHDOG:
+ goto transition_ok;
+ default:
+ /* invalid transition */
+ abort();
+ }
+ abort();
+ case RSTATE_SAVEVM:
+ switch (new_state) {
+ case RSTATE_RUNNING:
+ goto transition_ok;
+ default:
+ /* invalid transition */
+ abort();
+ }
+ abort();
+ case RSTATE_SHUTDOWN:
+ switch (new_state) {
+ case RSTATE_PAUSED:
+ goto transition_ok;
+ default:
+ /* invalid transition */
+ abort();
+ }
+ abort();
+ case RSTATE_WATCHDOG:
+ switch (new_state) {
+ case RSTATE_RUNNING:
+ goto transition_ok;
+ default:
+ /* invalid transition */
+ abort();
+ }
+ abort();
+ default:
+ fprintf(stderr, "current run state is invalid: %s\n",
+ runstate_as_string());
+ abort();
+ }
+
+transition_ok:
current_run_state = new_state;
}
--
1.7.7.rc0.72.g4b5ea
next prev parent reply other threads:[~2011-09-06 13:14 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-09-06 13:14 [Qemu-devel] [PATCH v4 0/9]: Introduce the RunState type Luiz Capitulino
2011-09-06 13:14 ` [Qemu-devel] [PATCH 1/9] Move vm_state_notify() prototype from cpus.h to sysemu.h Luiz Capitulino
2011-09-06 13:14 ` [Qemu-devel] [PATCH 2/9] Replace the VMSTOP macros with a proper state type Luiz Capitulino
2011-09-06 13:14 ` [Qemu-devel] [PATCH 3/9] RunState: Add additional states Luiz Capitulino
2011-09-06 13:14 ` Luiz Capitulino [this message]
2011-09-06 15:55 ` [Qemu-devel] [PATCH 4/9] runstate_set(): Check for valid transitions Jan Kiszka
2011-09-06 16:47 ` Luiz Capitulino
2011-09-06 17:42 ` Lluís Vilanova
2011-09-09 12:58 ` Luiz Capitulino
2011-09-06 13:14 ` [Qemu-devel] [PATCH 5/9] Drop the incoming_expected global variable Luiz Capitulino
2011-09-06 13:14 ` [Qemu-devel] [PATCH 6/9] Drop the vm_running " Luiz Capitulino
2011-09-06 13:14 ` [Qemu-devel] [PATCH 7/9] Monitor/QMP: Don't allow cont on bad VM state Luiz Capitulino
2011-09-06 13:14 ` [Qemu-devel] [PATCH 8/9] QMP: query-status: Introduce 'status' key Luiz Capitulino
2011-09-06 13:14 ` [Qemu-devel] [PATCH 9/9] HMP: info status: Print the VM state Luiz Capitulino
-- strict thread matches above, loose matches on Subject: below --
2011-09-09 20:25 [Qemu-devel] [PATCH v5 0/9]: Introduce the RunState type Luiz Capitulino
2011-09-09 20:25 ` [Qemu-devel] [PATCH 4/9] runstate_set(): Check for valid transitions Luiz Capitulino
2011-09-14 3:06 ` Luiz Capitulino
2011-09-14 19:55 ` Blue Swirl
2011-09-14 20:23 ` Luiz Capitulino
2011-09-14 20:49 [Qemu-devel] [PULL 0/9]: QMP queue Luiz Capitulino
2011-09-14 20:49 ` [Qemu-devel] [PATCH 4/9] runstate_set(): Check for valid transitions Luiz Capitulino
2011-09-15 20:05 [Qemu-devel] [PULL 0/9]: QMP queue Luiz Capitulino
2011-09-15 20:05 ` [Qemu-devel] [PATCH 4/9] runstate_set(): Check for valid transitions Luiz Capitulino
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1315314868-24770-5-git-send-email-lcapitulino@redhat.com \
--to=lcapitulino@redhat.com \
--cc=aliguori@us.ibm.com \
--cc=amit.shah@redhat.com \
--cc=armbru@redhat.com \
--cc=jan.kiszka@siemens.com \
--cc=kwolf@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).