Add qemu_put_buffer_async
This allows us to add a buffer to the iovec to send without copying it into the static buffer, the buffer will be sent later when qemu_fflush is called. Signed-off-by: Orit Wasserman <owasserm@redhat.com> Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
		
							parent
							
								
									cb88aa88d7
								
							
						
					
					
						commit
						6181ec2455
					
				| 
						 | 
				
			
			@ -75,6 +75,11 @@ int qemu_fclose(QEMUFile *f);
 | 
			
		|||
int64_t qemu_ftell(QEMUFile *f);
 | 
			
		||||
void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size);
 | 
			
		||||
void qemu_put_byte(QEMUFile *f, int v);
 | 
			
		||||
/*
 | 
			
		||||
 * put_buffer without copying the buffer.
 | 
			
		||||
 * The buffer should be available till it is sent asynchronously.
 | 
			
		||||
 */
 | 
			
		||||
void qemu_put_buffer_async(QEMUFile *f, const uint8_t *buf, int size);
 | 
			
		||||
 | 
			
		||||
static inline void qemu_put_ubyte(QEMUFile *f, unsigned int v)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										32
									
								
								savevm.c
								
								
								
								
							
							
						
						
									
										32
									
								
								savevm.c
								
								
								
								
							| 
						 | 
				
			
			@ -633,6 +633,28 @@ static void add_to_iovec(QEMUFile *f, const uint8_t *buf, int size)
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void qemu_put_buffer_async(QEMUFile *f, const uint8_t *buf, int size)
 | 
			
		||||
{
 | 
			
		||||
    if (f->last_error) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (f->is_write == 0 && f->buf_index > 0) {
 | 
			
		||||
        fprintf(stderr,
 | 
			
		||||
                "Attempted to write to buffer while read buffer is not empty\n");
 | 
			
		||||
        abort();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    add_to_iovec(f, buf, size);
 | 
			
		||||
 | 
			
		||||
    f->is_write = 1;
 | 
			
		||||
    f->bytes_xfer += size;
 | 
			
		||||
 | 
			
		||||
    if (f->buf_index >= IO_BUF_SIZE || f->iovcnt >= MAX_IOV_SIZE) {
 | 
			
		||||
        qemu_fflush(f);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size)
 | 
			
		||||
{
 | 
			
		||||
    int l;
 | 
			
		||||
| 
						 | 
				
			
			@ -652,18 +674,14 @@ void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size)
 | 
			
		|||
        if (l > size)
 | 
			
		||||
            l = size;
 | 
			
		||||
        memcpy(f->buf + f->buf_index, buf, l);
 | 
			
		||||
        add_to_iovec(f, f->buf + f->buf_index, l);
 | 
			
		||||
        f->is_write = 1;
 | 
			
		||||
        f->buf_index += l;
 | 
			
		||||
        f->bytes_xfer += l;
 | 
			
		||||
        buf += l;
 | 
			
		||||
        size -= l;
 | 
			
		||||
        if (f->buf_index >= IO_BUF_SIZE || f->iovcnt >= MAX_IOV_SIZE) {
 | 
			
		||||
            qemu_fflush(f);
 | 
			
		||||
        qemu_put_buffer_async(f, f->buf + (f->buf_index - l), l);
 | 
			
		||||
        if (qemu_file_get_error(f)) {
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        }
 | 
			
		||||
        buf += l;
 | 
			
		||||
        size -= l;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue