qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Eduardo Habkost <ehabkost@redhat.com>
To: qemu-devel@nongnu.org, Juan Quintela <quintela@redhat.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
	Markus Armbruster <armbru@redhat.com>
Subject: [Qemu-devel] [PATCH 3/5] vmstate: Simplify field-skipping load/save logic
Date: Mon, 14 Oct 2013 13:45:46 -0300	[thread overview]
Message-ID: <1381769148-22400-4-git-send-email-ehabkost@redhat.com> (raw)
In-Reply-To: <1381769148-22400-1-git-send-email-ehabkost@redhat.com>

This makes the code more readable, making each condition that makes a
field be skipped much more visible, and reduces one level of indentation
in the code.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 savevm.c | 156 ++++++++++++++++++++++++++++++++-------------------------------
 1 file changed, 80 insertions(+), 76 deletions(-)

diff --git a/savevm.c b/savevm.c
index 9562669..16276e7 100644
--- a/savevm.c
+++ b/savevm.c
@@ -1694,50 +1694,52 @@ int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
             return ret;
     }
     for (field = vmsd->fields; field->name; field++) {
-        if ((field->field_exists &&
-             field->field_exists(opaque, version_id)) ||
-            (!field->field_exists &&
-             field->version_id <= version_id)) {
-            void *base_addr = opaque + field->offset;
-            int i, n_elems = 1;
-            int size = field->size;
-
-            if (field->flags & VMS_VBUFFER) {
-                size = *(int32_t *)(opaque+field->size_offset);
-                if (field->flags & VMS_MULTIPLY) {
-                    size *= field->size;
-                }
-            }
-            if (field->flags & VMS_ARRAY) {
-                n_elems = field->num;
-            } else if (field->flags & VMS_VARRAY_INT32) {
-                n_elems = *(int32_t *)(opaque+field->num_offset);
-            } else if (field->flags & VMS_VARRAY_UINT32) {
-                n_elems = *(uint32_t *)(opaque+field->num_offset);
-            } else if (field->flags & VMS_VARRAY_UINT16) {
-                n_elems = *(uint16_t *)(opaque+field->num_offset);
-            } else if (field->flags & VMS_VARRAY_UINT8) {
-                n_elems = *(uint8_t *)(opaque+field->num_offset);
+        if (field->field_exists && !field->field_exists(opaque, version_id)) {
+            continue;
+        }
+        if (field->version_id > version_id) {
+            continue;
+        }
+
+        void *base_addr = opaque + field->offset;
+        int i, n_elems = 1;
+        int size = field->size;
+
+        if (field->flags & VMS_VBUFFER) {
+            size = *(int32_t *)(opaque+field->size_offset);
+            if (field->flags & VMS_MULTIPLY) {
+                size *= field->size;
             }
-            if (field->flags & VMS_POINTER) {
-                base_addr = *(void **)base_addr + field->start;
+        }
+        if (field->flags & VMS_ARRAY) {
+            n_elems = field->num;
+        } else if (field->flags & VMS_VARRAY_INT32) {
+            n_elems = *(int32_t *)(opaque+field->num_offset);
+        } else if (field->flags & VMS_VARRAY_UINT32) {
+            n_elems = *(uint32_t *)(opaque+field->num_offset);
+        } else if (field->flags & VMS_VARRAY_UINT16) {
+            n_elems = *(uint16_t *)(opaque+field->num_offset);
+        } else if (field->flags & VMS_VARRAY_UINT8) {
+            n_elems = *(uint8_t *)(opaque+field->num_offset);
+        }
+        if (field->flags & VMS_POINTER) {
+            base_addr = *(void **)base_addr + field->start;
+        }
+        for (i = 0; i < n_elems; i++) {
+            void *addr = base_addr + size * i;
+
+            if (field->flags & VMS_ARRAY_OF_POINTER) {
+                addr = *(void **)addr;
             }
-            for (i = 0; i < n_elems; i++) {
-                void *addr = base_addr + size * i;
-
-                if (field->flags & VMS_ARRAY_OF_POINTER) {
-                    addr = *(void **)addr;
-                }
-                if (field->flags & VMS_STRUCT) {
-                    ret = vmstate_load_state(f, field->vmsd, addr,
-                                             field->vmsd->version_id);
-                } else {
-                    ret = field->info->get(f, addr, size);
+            if (field->flags & VMS_STRUCT) {
+                ret = vmstate_load_state(f, field->vmsd, addr,
+                                         field->vmsd->version_id);
+            } else {
+                ret = field->info->get(f, addr, size);
 
-                }
-                if (ret < 0) {
-                    return ret;
-                }
+            }
+            if (ret < 0) {
+                return ret;
             }
         }
     }
@@ -1760,43 +1762,45 @@ void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd,
         vmsd->pre_save(opaque);
     }
     for (field = vmsd->fields; field->name; field++) {
-        if (!field->field_exists ||
-            field->field_exists(opaque, vmsd->version_id)) {
-            void *base_addr = opaque + field->offset;
-            int i, n_elems = 1;
-            int size = field->size;
-
-            if (field->flags & VMS_VBUFFER) {
-                size = *(int32_t *)(opaque+field->size_offset);
-                if (field->flags & VMS_MULTIPLY) {
-                    size *= field->size;
-                }
-            }
-            if (field->flags & VMS_ARRAY) {
-                n_elems = field->num;
-            } else if (field->flags & VMS_VARRAY_INT32) {
-                n_elems = *(int32_t *)(opaque+field->num_offset);
-            } else if (field->flags & VMS_VARRAY_UINT32) {
-                n_elems = *(uint32_t *)(opaque+field->num_offset);
-            } else if (field->flags & VMS_VARRAY_UINT16) {
-                n_elems = *(uint16_t *)(opaque+field->num_offset);
-            } else if (field->flags & VMS_VARRAY_UINT8) {
-                n_elems = *(uint8_t *)(opaque+field->num_offset);
+        if (field->field_exists &&
+            !field->field_exists(opaque, vmsd->version_id)) {
+            continue;
+        }
+
+        void *base_addr = opaque + field->offset;
+        int i, n_elems = 1;
+        int size = field->size;
+
+        if (field->flags & VMS_VBUFFER) {
+            size = *(int32_t *)(opaque+field->size_offset);
+            if (field->flags & VMS_MULTIPLY) {
+                size *= field->size;
             }
-            if (field->flags & VMS_POINTER) {
-                base_addr = *(void **)base_addr + field->start;
+        }
+        if (field->flags & VMS_ARRAY) {
+            n_elems = field->num;
+        } else if (field->flags & VMS_VARRAY_INT32) {
+            n_elems = *(int32_t *)(opaque+field->num_offset);
+        } else if (field->flags & VMS_VARRAY_UINT32) {
+            n_elems = *(uint32_t *)(opaque+field->num_offset);
+        } else if (field->flags & VMS_VARRAY_UINT16) {
+            n_elems = *(uint16_t *)(opaque+field->num_offset);
+        } else if (field->flags & VMS_VARRAY_UINT8) {
+            n_elems = *(uint8_t *)(opaque+field->num_offset);
+        }
+        if (field->flags & VMS_POINTER) {
+            base_addr = *(void **)base_addr + field->start;
+        }
+        for (i = 0; i < n_elems; i++) {
+            void *addr = base_addr + size * i;
+
+            if (field->flags & VMS_ARRAY_OF_POINTER) {
+                addr = *(void **)addr;
             }
-            for (i = 0; i < n_elems; i++) {
-                void *addr = base_addr + size * i;
-
-                if (field->flags & VMS_ARRAY_OF_POINTER) {
-                    addr = *(void **)addr;
-                }
-                if (field->flags & VMS_STRUCT) {
-                    vmstate_save_state(f, field->vmsd, addr);
-                } else {
-                    field->info->put(f, addr, size);
-                }
+            if (field->flags & VMS_STRUCT) {
+                vmstate_save_state(f, field->vmsd, addr);
+            } else {
+                field->info->put(f, addr, size);
             }
         }
     }
-- 
1.8.3.1

  parent reply	other threads:[~2013-10-14 16:46 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-10-14 16:45 [Qemu-devel] [PATCH 0/5] vmstate: Add max_version_id field Eduardo Habkost
2013-10-14 16:45 ` [Qemu-devel] [PATCH 1/5] savevm: Coding style line length fix Eduardo Habkost
2013-10-14 16:45 ` [Qemu-devel] [PATCH 2/5] vmstate: Replace while (...) with for (...) Eduardo Habkost
2013-10-14 16:45 ` Eduardo Habkost [this message]
2013-10-15  8:01   ` [Qemu-devel] [PATCH 3/5] vmstate: Simplify field-skipping load/save logic Markus Armbruster
2013-10-15 12:12     ` Eduardo Habkost
2013-10-15 11:32   ` Paolo Bonzini
2013-10-14 16:45 ` [Qemu-devel] [PATCH 4/5] vmstate: Use version_id when saving Eduardo Habkost
2013-10-14 16:45 ` [Qemu-devel] [PATCH 5/5] vmstate: Add max_version_id field to VMStateDescription Eduardo Habkost

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=1381769148-22400-4-git-send-email-ehabkost@redhat.com \
    --to=ehabkost@redhat.com \
    --cc=armbru@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    /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).