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:
parent
bca7856ae8
commit
7c1e52ba6f
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user