From patchwork Tue Sep 6 13:14:23 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Capitulino X-Patchwork-Id: 113558 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 37966B6F68 for ; Tue, 6 Sep 2011 23:16:13 +1000 (EST) Received: from localhost ([::1]:37675 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R0vVX-0006e3-3Y for incoming@patchwork.ozlabs.org; Tue, 06 Sep 2011 09:16:07 -0400 Received: from eggs.gnu.org ([140.186.70.92]:38478) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R0vUE-0002mq-FQ for qemu-devel@nongnu.org; Tue, 06 Sep 2011 09:14:51 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1R0vU9-0001T6-Q5 for qemu-devel@nongnu.org; Tue, 06 Sep 2011 09:14:46 -0400 Received: from mx1.redhat.com ([209.132.183.28]:35974) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R0vU9-0001Sg-Iz for qemu-devel@nongnu.org; Tue, 06 Sep 2011 09:14:41 -0400 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p86DEeCo005602 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 6 Sep 2011 09:14:41 -0400 Received: from localhost (ovpn-113-32.phx2.redhat.com [10.3.113.32]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id p86DEdFo012418; Tue, 6 Sep 2011 09:14:40 -0400 From: Luiz Capitulino To: qemu-devel@nongnu.org Date: Tue, 6 Sep 2011 10:14:23 -0300 Message-Id: <1315314868-24770-5-git-send-email-lcapitulino@redhat.com> In-Reply-To: <1315314868-24770-1-git-send-email-lcapitulino@redhat.com> References: <1315314868-24770-1-git-send-email-lcapitulino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.132.183.28 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 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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 --- 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; }