mirror of https://github.com/proxmox/mirror_qemu
win32 tap poll suppression (kazu)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2127 c046a42c-6fe2-441c-8c8c-71466251a162master
parent
b56bdb328a
commit
e6cda8e299
27
tap-win32.c
27
tap-win32.c
|
@ -97,6 +97,7 @@ typedef struct tap_win32_overlapped {
|
||||||
HANDLE write_event;
|
HANDLE write_event;
|
||||||
HANDLE output_queue_semaphore;
|
HANDLE output_queue_semaphore;
|
||||||
HANDLE free_list_semaphore;
|
HANDLE free_list_semaphore;
|
||||||
|
HANDLE tap_semaphore;
|
||||||
CRITICAL_SECTION output_queue_cs;
|
CRITICAL_SECTION output_queue_cs;
|
||||||
CRITICAL_SECTION free_list_cs;
|
CRITICAL_SECTION free_list_cs;
|
||||||
OVERLAPPED read_overlapped;
|
OVERLAPPED read_overlapped;
|
||||||
|
@ -445,6 +446,10 @@ static void tap_win32_overlapped_init(tap_win32_overlapped_t* const overlapped,
|
||||||
overlapped->free_list = element;
|
overlapped->free_list = element;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/* To count buffers, initially no-signal. */
|
||||||
|
overlapped->tap_semaphore = CreateSemaphore(NULL, 0, TUN_MAX_BUFFER_COUNT, NULL);
|
||||||
|
if(!overlapped->tap_semaphore)
|
||||||
|
fprintf(stderr, "error creating tap_semaphore.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tap_win32_write(tap_win32_overlapped_t *overlapped,
|
static int tap_win32_write(tap_win32_overlapped_t *overlapped,
|
||||||
|
@ -526,6 +531,7 @@ static DWORD WINAPI tap_win32_thread_entry(LPVOID param)
|
||||||
if(read_size > 0) {
|
if(read_size > 0) {
|
||||||
buffer->read_size = read_size;
|
buffer->read_size = read_size;
|
||||||
put_buffer_on_output_queue(overlapped, buffer);
|
put_buffer_on_output_queue(overlapped, buffer);
|
||||||
|
ReleaseSemaphore(overlapped->tap_semaphore, 1, NULL);
|
||||||
buffer = get_buffer_from_free_list(overlapped);
|
buffer = get_buffer_from_free_list(overlapped);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -620,8 +626,6 @@ static int tap_win32_open(tap_win32_overlapped_t **phandle,
|
||||||
|
|
||||||
hThread = CreateThread(NULL, 0, tap_win32_thread_entry,
|
hThread = CreateThread(NULL, 0, tap_win32_thread_entry,
|
||||||
(LPVOID)&tap_overlapped, 0, &idThread);
|
(LPVOID)&tap_overlapped, 0, &idThread);
|
||||||
SetThreadPriority(hThread,THREAD_PRIORITY_TIME_CRITICAL);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -630,11 +634,8 @@ static int tap_win32_open(tap_win32_overlapped_t **phandle,
|
||||||
typedef struct TAPState {
|
typedef struct TAPState {
|
||||||
VLANClientState *vc;
|
VLANClientState *vc;
|
||||||
tap_win32_overlapped_t *handle;
|
tap_win32_overlapped_t *handle;
|
||||||
HANDLE tap_event;
|
|
||||||
} TAPState;
|
} TAPState;
|
||||||
|
|
||||||
static TAPState *tap_win32_state = NULL;
|
|
||||||
|
|
||||||
static void tap_receive(void *opaque, const uint8_t *buf, int size)
|
static void tap_receive(void *opaque, const uint8_t *buf, int size)
|
||||||
{
|
{
|
||||||
TAPState *s = opaque;
|
TAPState *s = opaque;
|
||||||
|
@ -642,22 +643,17 @@ static void tap_receive(void *opaque, const uint8_t *buf, int size)
|
||||||
tap_win32_write(s->handle, buf, size);
|
tap_win32_write(s->handle, buf, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* XXX: horrible, suppress this by using proper thread signaling */
|
static void tap_win32_send(void *opaque)
|
||||||
void tap_win32_poll(void)
|
|
||||||
{
|
{
|
||||||
TAPState *s = tap_win32_state;
|
TAPState *s = opaque;
|
||||||
uint8_t *buf;
|
uint8_t *buf;
|
||||||
int max_size = 4096;
|
int max_size = 4096;
|
||||||
int size;
|
int size;
|
||||||
|
|
||||||
if (!s)
|
|
||||||
return;
|
|
||||||
|
|
||||||
size = tap_win32_read(s->handle, &buf, max_size);
|
size = tap_win32_read(s->handle, &buf, max_size);
|
||||||
if (size > 0) {
|
if (size > 0) {
|
||||||
qemu_send_packet(s->vc, buf, size);
|
qemu_send_packet(s->vc, buf, size);
|
||||||
tap_win32_free_buffer(s->handle, buf);
|
tap_win32_free_buffer(s->handle, buf);
|
||||||
SetEvent(s->tap_event);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -677,12 +673,7 @@ int tap_win32_init(VLANState *vlan, const char *ifname)
|
||||||
|
|
||||||
snprintf(s->vc->info_str, sizeof(s->vc->info_str),
|
snprintf(s->vc->info_str, sizeof(s->vc->info_str),
|
||||||
"tap: ifname=%s", ifname);
|
"tap: ifname=%s", ifname);
|
||||||
tap_win32_state = s;
|
|
||||||
|
|
||||||
s->tap_event = CreateEvent(NULL, FALSE, FALSE, NULL);
|
qemu_add_wait_object(s->handle->tap_semaphore, tap_win32_send, s);
|
||||||
if (!s->tap_event) {
|
|
||||||
fprintf(stderr, "tap-win32: Failed CreateEvent\n");
|
|
||||||
}
|
|
||||||
qemu_add_wait_object(s->tap_event, NULL, NULL);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
3
vl.c
3
vl.c
|
@ -5714,9 +5714,6 @@ void main_loop_wait(int timeout)
|
||||||
}
|
}
|
||||||
slirp_select_poll(&rfds, &wfds, &xfds);
|
slirp_select_poll(&rfds, &wfds, &xfds);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
#ifdef _WIN32
|
|
||||||
tap_win32_poll();
|
|
||||||
#endif
|
#endif
|
||||||
qemu_aio_poll();
|
qemu_aio_poll();
|
||||||
qemu_bh_poll();
|
qemu_bh_poll();
|
||||||
|
|
Loading…
Reference in New Issue