/*
Copyright (C) 2009 Red Hat, Inc.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef _H_VDI_PORT
#define _H_VDI_PORT
#include
#include
#define MIN(a, b) ((a) > (b) ? (b) : (a))
#define BUF_SIZE (1024 * 1024)
#define VDI_PORT_BLOCKED 0
#define VDI_PORT_RESET -1
#define VDI_PORT_ERROR -2
// Ring notes:
// _end is one after the end of data
// _start==_end means empty ring
// _start-1==_end (modulo) means full ring
// _start-1 is never used
// ring_write & read on right side of the ring (update _end)
// ring_read & write from left (update _start)
typedef struct VDIPortBuffer {
OVERLAPPED overlap;
uint8_t* start;
uint8_t* end;
bool pending;
int bytes;
uint8_t ring[BUF_SIZE];
} VDIPortBuffer;
class VDIPort {
public:
VDIPort();
virtual ~VDIPort() {}
size_t ring_write(const void* buf, size_t size);
size_t write_ring_free_space();
size_t ring_read(void* buf, size_t size);
size_t read_ring_size();
size_t read_ring_continuous_remaining_size();
virtual const char *name() = 0;
virtual bool init() = 0;
virtual unsigned get_num_events() = 0;
virtual void fill_events(HANDLE* handles) = 0;
virtual void handle_event(int event) = 0;
virtual int write() = 0;
virtual int read() = 0;
protected:
int handle_error();
VDIPortBuffer _write;
VDIPortBuffer _read;
};
#endif