qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH for-1.4 10/12] qemu-char: General chardev "memory" c


From: Markus Armbruster
Subject: [Qemu-devel] [PATCH for-1.4 10/12] qemu-char: General chardev "memory" code cleanup
Date: Tue, 5 Feb 2013 17:22:13 +0100

Inline trivial cirmem_chr_is_empty() into its only caller.

Rename qemu_chr_cirmem_count() to cirmem_count().

Fast ring buffer index wraparound.  Without this, there's no point in
restricting size to a power two.

qemu_is_chr(chr, "memory") returns *zero* when chr is a memory
character device, which isn't what I'd expect.  Replace it by the
saner and more obviously correct chr_is_cirmem().  Also avoids
encouraging testing for specific character devices elsewhere.

Signed-off-by: Markus Armbruster <address@hidden>
---
 qemu-char.c | 31 ++++++++++++-------------------
 1 file changed, 12 insertions(+), 19 deletions(-)

diff --git a/qemu-char.c b/qemu-char.c
index 8972bfd..d92578a 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -2644,7 +2644,7 @@ size_t qemu_chr_mem_osize(const CharDriverState *chr)
 }
 
 /*********************************************************/
-/*CircularMemory chardev*/
+/* CircularMemory chardev */
 
 typedef struct {
     size_t size;
@@ -2653,18 +2653,11 @@ typedef struct {
     uint8_t *cbuf;
 } CirMemCharDriver;
 
-static bool cirmem_chr_is_empty(const CharDriverState *chr)
+static size_t cirmem_count(const CharDriverState *chr)
 {
     const CirMemCharDriver *d = chr->opaque;
 
-    return d->cons == d->prod;
-}
-
-static size_t qemu_chr_cirmem_count(const CharDriverState *chr)
-{
-    const CirMemCharDriver *d = chr->opaque;
-
-    return (d->prod - d->cons);
+    return d->prod - d->cons;
 }
 
 static int cirmem_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
@@ -2677,8 +2670,8 @@ static int cirmem_chr_write(CharDriverState *chr, const 
uint8_t *buf, int len)
     }
 
     for (i = 0; i < len; i++ ) {
-        d->cbuf[d->prod++ % d->size] = buf[i];
-        if ((d->prod - d->cons) > d->size) {
+        d->cbuf[d->prod++ & (d->size - 1)] = buf[i];
+        if (d->prod - d->cons > d->size) {
             d->cons = d->prod - d->size;
         }
     }
@@ -2691,8 +2684,8 @@ static int cirmem_chr_read(CharDriverState *chr, uint8_t 
*buf, int len)
     CirMemCharDriver *d = chr->opaque;
     int i;
 
-    for (i = 0; i < len && !cirmem_chr_is_empty(chr); i++) {
-        buf[i] = d->cbuf[d->cons++ % d->size];
+    for (i = 0; i < len && d->cons != d->prod; i++) {
+        buf[i] = d->cbuf[d->cons++ & (d->size - 1)];
     }
 
     return i;
@@ -2742,9 +2735,9 @@ fail:
     return NULL;
 }
 
-static bool qemu_is_chr(const CharDriverState *chr, const char *filename)
+static bool chr_is_cirmem(const CharDriverState *chr)
 {
-    return strcmp(chr->filename, filename);
+    return chr->chr_write == cirmem_chr_write;
 }
 
 void qmp_memchar_write(const char *device, const char *data,
@@ -2762,7 +2755,7 @@ void qmp_memchar_write(const char *device, const char 
*data,
         return;
     }
 
-    if (qemu_is_chr(chr, "memory")) {
+    if (!chr_is_cirmem(chr)) {
         error_setg(errp,"%s is not memory char device", device);
         return;
     }
@@ -2801,7 +2794,7 @@ char *qmp_memchar_read(const char *device, int64_t size,
         return NULL;
     }
 
-    if (qemu_is_chr(chr, "memory")) {
+    if (!chr_is_cirmem(chr)) {
         error_setg(errp,"%s is not memory char device", device);
         return NULL;
     }
@@ -2811,7 +2804,7 @@ char *qmp_memchar_read(const char *device, int64_t size,
         return NULL;
     }
 
-    count = qemu_chr_cirmem_count(chr);
+    count = cirmem_count(chr);
     size = size > count ? count : size;
     read_data = g_malloc(size + 1);
 
-- 
1.7.11.7




reply via email to

[Prev in Thread] Current Thread [Next in Thread]