[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH for-1.4 v2 10/13] qemu-char: General chardev "memory
From: |
Markus Armbruster |
Subject: |
[Qemu-devel] [PATCH for-1.4 v2 10/13] qemu-char: General chardev "memory" code cleanup |
Date: |
Wed, 6 Feb 2013 21:27:23 +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 cdbbafe..831d564 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -2645,7 +2645,7 @@ size_t qemu_chr_mem_osize(const CharDriverState *chr)
}
/*********************************************************/
-/*CircularMemory chardev*/
+/* CircularMemory chardev */
typedef struct {
size_t size;
@@ -2654,18 +2654,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)
@@ -2678,8 +2671,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;
}
}
@@ -2692,8 +2685,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;
@@ -2743,9 +2736,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,
@@ -2763,7 +2756,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;
}
@@ -2802,7 +2795,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;
}
@@ -2812,7 +2805,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
- [Qemu-devel] [PATCH for-1.4 v2 00/13] Rework ring buffer chardev before API calcifies, Markus Armbruster, 2013/02/06
- [Qemu-devel] [PATCH for-1.4 v2 04/13] qmp: Clean up type usage in qmp_memchar_write(), qmp_memchar_read(), Markus Armbruster, 2013/02/06
- [Qemu-devel] [PATCH for-1.4 v2 03/13] qmp: Use generic errors in memchar-read, memchar-write, Markus Armbruster, 2013/02/06
- [Qemu-devel] [PATCH for-1.4 v2 08/13] qemu-char: Fix chardev "memory" not to drop IAC characters, Markus Armbruster, 2013/02/06
- [Qemu-devel] [PATCH for-1.4 v2 13/13] hmp: make memchar-read escape ASCII control chars except \n and \t, Markus Armbruster, 2013/02/06
- [Qemu-devel] [PATCH for-1.4 v2 07/13] qmp: Drop wasteful zero-initialization in qmp_memchar_read(), Markus Armbruster, 2013/02/06
- [Qemu-devel] [PATCH for-1.4 v2 12/13] qemu-char: Support suffixed ringbuf size arguments like "size=64K", Markus Armbruster, 2013/02/06
- [Qemu-devel] [PATCH for-1.4 v2 06/13] qmp: Drop superfluous special case "empty" in qmp_memchar_read(), Markus Armbruster, 2013/02/06
- [Qemu-devel] [PATCH for-1.4 v2 05/13] qmp: Plug memory leaks in memchar-write, memchar-read, Markus Armbruster, 2013/02/06
- [Qemu-devel] [PATCH for-1.4 v2 10/13] qemu-char: General chardev "memory" code cleanup,
Markus Armbruster <=
- [Qemu-devel] [PATCH for-1.4 v2 02/13] qmp: Clean up design of memchar-read, Markus Armbruster, 2013/02/06
- [Qemu-devel] [PATCH for-1.4 v2 01/13] qmp: Fix design bug and read beyond buffer in memchar-write, Markus Armbruster, 2013/02/06
- [Qemu-devel] [PATCH for-1.4 v2 11/13] qemu-char: Saner naming of memchar stuff & doc fixes, Markus Armbruster, 2013/02/06
- [Qemu-devel] [PATCH for-1.4 v2 09/13] qemu-char: Drop undocumented chardev "memory" compatibility syntax, Markus Armbruster, 2013/02/06
- Re: [Qemu-devel] [PATCH for-1.4 v2 00/13] Rework ring buffer chardev before API calcifies, Eric Blake, 2013/02/06
- Re: [Qemu-devel] [PATCH for-1.4 v2 00/13] Rework ring buffer chardev before API calcifies, Anthony Liguori, 2013/02/06