Move copy out of qemu_peek_buffer

qemu_peek_buffer currently copies the data it reads into a buffer,
however a future patch wants access to the buffer without the copy,
hence rework to remove the copy to the layer above.

Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Reviewed-by: Amit Shah <amit.shah@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
Dr. David Alan Gilbert 2015-05-21 13:24:15 +01:00 committed by Juan Quintela
parent bca7856ae8
commit 7c1e52ba6f
3 changed files with 11 additions and 8 deletions

View File

@ -157,7 +157,7 @@ static inline void qemu_put_ubyte(QEMUFile *f, unsigned int v)
void qemu_put_be16(QEMUFile *f, unsigned int v); void qemu_put_be16(QEMUFile *f, unsigned int v);
void qemu_put_be32(QEMUFile *f, unsigned int v); void qemu_put_be32(QEMUFile *f, unsigned int v);
void qemu_put_be64(QEMUFile *f, uint64_t v); void qemu_put_be64(QEMUFile *f, uint64_t v);
int qemu_peek_buffer(QEMUFile *f, uint8_t *buf, int size, size_t offset); int qemu_peek_buffer(QEMUFile *f, uint8_t **buf, int size, size_t offset);
int qemu_get_buffer(QEMUFile *f, uint8_t *buf, int size); int qemu_get_buffer(QEMUFile *f, uint8_t *buf, int size);
ssize_t qemu_put_compression_data(QEMUFile *f, const uint8_t *p, size_t size, ssize_t qemu_put_compression_data(QEMUFile *f, const uint8_t *p, size_t size,
int level); int level);

View File

@ -349,14 +349,14 @@ void qemu_file_skip(QEMUFile *f, int size)
} }
/* /*
* Read 'size' bytes from file (at 'offset') into buf without moving the * Read 'size' bytes from file (at 'offset') without moving the
* pointer. * pointer and set 'buf' to point to that data.
* *
* It will return size bytes unless there was an error, in which case it will * It will return size bytes unless there was an error, in which case it will
* return as many as it managed to read (assuming blocking fd's which * return as many as it managed to read (assuming blocking fd's which
* all current QEMUFile are) * all current QEMUFile are)
*/ */
int qemu_peek_buffer(QEMUFile *f, uint8_t *buf, int size, size_t offset) int qemu_peek_buffer(QEMUFile *f, uint8_t **buf, int size, size_t offset)
{ {
int pending; int pending;
int index; int index;
@ -392,7 +392,7 @@ int qemu_peek_buffer(QEMUFile *f, uint8_t *buf, int size, size_t offset)
size = pending; size = pending;
} }
memcpy(buf, f->buf + index, size); *buf = f->buf + index;
return size; return size;
} }
@ -411,11 +411,13 @@ int qemu_get_buffer(QEMUFile *f, uint8_t *buf, int size)
while (pending > 0) { while (pending > 0) {
int res; int res;
uint8_t *src;
res = qemu_peek_buffer(f, buf, MIN(pending, IO_BUF_SIZE), 0); res = qemu_peek_buffer(f, &src, MIN(pending, IO_BUF_SIZE), 0);
if (res == 0) { if (res == 0) {
return done; return done;
} }
memcpy(buf, src, res);
qemu_file_skip(f, res); qemu_file_skip(f, res);
buf += res; buf += res;
pending -= res; pending -= res;

View File

@ -358,7 +358,7 @@ static int vmstate_subsection_load(QEMUFile *f, const VMStateDescription *vmsd,
trace_vmstate_subsection_load(vmsd->name); trace_vmstate_subsection_load(vmsd->name);
while (qemu_peek_byte(f, 0) == QEMU_VM_SUBSECTION) { while (qemu_peek_byte(f, 0) == QEMU_VM_SUBSECTION) {
char idstr[256]; char idstr[256], *idstr_ret;
int ret; int ret;
uint8_t version_id, len, size; uint8_t version_id, len, size;
const VMStateDescription *sub_vmsd; const VMStateDescription *sub_vmsd;
@ -369,11 +369,12 @@ static int vmstate_subsection_load(QEMUFile *f, const VMStateDescription *vmsd,
trace_vmstate_subsection_load_bad(vmsd->name, "(short)"); trace_vmstate_subsection_load_bad(vmsd->name, "(short)");
return 0; return 0;
} }
size = qemu_peek_buffer(f, (uint8_t *)idstr, len, 2); size = qemu_peek_buffer(f, (uint8_t **)&idstr_ret, len, 2);
if (size != len) { if (size != len) {
trace_vmstate_subsection_load_bad(vmsd->name, "(peek fail)"); trace_vmstate_subsection_load_bad(vmsd->name, "(peek fail)");
return 0; return 0;
} }
memcpy(idstr, idstr_ret, size);
idstr[size] = 0; idstr[size] = 0;
if (strncmp(vmsd->name, idstr, strlen(vmsd->name)) != 0) { if (strncmp(vmsd->name, idstr, strlen(vmsd->name)) != 0) {