Commit e6cda8e299318e0e54fabea4c74c0bd839547ea7
1 parent
b56bdb32
win32 tap poll suppression (kazu)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2127 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
9 additions
and
22 deletions
tap-win32.c
... | ... | @@ -97,6 +97,7 @@ typedef struct tap_win32_overlapped { |
97 | 97 | HANDLE write_event; |
98 | 98 | HANDLE output_queue_semaphore; |
99 | 99 | HANDLE free_list_semaphore; |
100 | + HANDLE tap_semaphore; | |
100 | 101 | CRITICAL_SECTION output_queue_cs; |
101 | 102 | CRITICAL_SECTION free_list_cs; |
102 | 103 | OVERLAPPED read_overlapped; |
... | ... | @@ -445,6 +446,10 @@ static void tap_win32_overlapped_init(tap_win32_overlapped_t* const overlapped, |
445 | 446 | overlapped->free_list = element; |
446 | 447 | } |
447 | 448 | } |
449 | + /* To count buffers, initially no-signal. */ | |
450 | + overlapped->tap_semaphore = CreateSemaphore(NULL, 0, TUN_MAX_BUFFER_COUNT, NULL); | |
451 | + if(!overlapped->tap_semaphore) | |
452 | + fprintf(stderr, "error creating tap_semaphore.\n"); | |
448 | 453 | } |
449 | 454 | |
450 | 455 | static int tap_win32_write(tap_win32_overlapped_t *overlapped, |
... | ... | @@ -526,6 +531,7 @@ static DWORD WINAPI tap_win32_thread_entry(LPVOID param) |
526 | 531 | if(read_size > 0) { |
527 | 532 | buffer->read_size = read_size; |
528 | 533 | put_buffer_on_output_queue(overlapped, buffer); |
534 | + ReleaseSemaphore(overlapped->tap_semaphore, 1, NULL); | |
529 | 535 | buffer = get_buffer_from_free_list(overlapped); |
530 | 536 | } |
531 | 537 | } |
... | ... | @@ -620,8 +626,6 @@ static int tap_win32_open(tap_win32_overlapped_t **phandle, |
620 | 626 | |
621 | 627 | hThread = CreateThread(NULL, 0, tap_win32_thread_entry, |
622 | 628 | (LPVOID)&tap_overlapped, 0, &idThread); |
623 | - SetThreadPriority(hThread,THREAD_PRIORITY_TIME_CRITICAL); | |
624 | - | |
625 | 629 | return 0; |
626 | 630 | } |
627 | 631 | |
... | ... | @@ -630,11 +634,8 @@ static int tap_win32_open(tap_win32_overlapped_t **phandle, |
630 | 634 | typedef struct TAPState { |
631 | 635 | VLANClientState *vc; |
632 | 636 | tap_win32_overlapped_t *handle; |
633 | - HANDLE tap_event; | |
634 | 637 | } TAPState; |
635 | 638 | |
636 | -static TAPState *tap_win32_state = NULL; | |
637 | - | |
638 | 639 | static void tap_receive(void *opaque, const uint8_t *buf, int size) |
639 | 640 | { |
640 | 641 | TAPState *s = opaque; |
... | ... | @@ -642,22 +643,17 @@ static void tap_receive(void *opaque, const uint8_t *buf, int size) |
642 | 643 | tap_win32_write(s->handle, buf, size); |
643 | 644 | } |
644 | 645 | |
645 | -/* XXX: horrible, suppress this by using proper thread signaling */ | |
646 | -void tap_win32_poll(void) | |
646 | +static void tap_win32_send(void *opaque) | |
647 | 647 | { |
648 | - TAPState *s = tap_win32_state; | |
648 | + TAPState *s = opaque; | |
649 | 649 | uint8_t *buf; |
650 | 650 | int max_size = 4096; |
651 | 651 | int size; |
652 | 652 | |
653 | - if (!s) | |
654 | - return; | |
655 | - | |
656 | 653 | size = tap_win32_read(s->handle, &buf, max_size); |
657 | 654 | if (size > 0) { |
658 | 655 | qemu_send_packet(s->vc, buf, size); |
659 | 656 | tap_win32_free_buffer(s->handle, buf); |
660 | - SetEvent(s->tap_event); | |
661 | 657 | } |
662 | 658 | } |
663 | 659 | |
... | ... | @@ -677,12 +673,7 @@ int tap_win32_init(VLANState *vlan, const char *ifname) |
677 | 673 | |
678 | 674 | snprintf(s->vc->info_str, sizeof(s->vc->info_str), |
679 | 675 | "tap: ifname=%s", ifname); |
680 | - tap_win32_state = s; | |
681 | 676 | |
682 | - s->tap_event = CreateEvent(NULL, FALSE, FALSE, NULL); | |
683 | - if (!s->tap_event) { | |
684 | - fprintf(stderr, "tap-win32: Failed CreateEvent\n"); | |
685 | - } | |
686 | - qemu_add_wait_object(s->tap_event, NULL, NULL); | |
677 | + qemu_add_wait_object(s->handle->tap_semaphore, tap_win32_send, s); | |
687 | 678 | return 0; |
688 | 679 | } | ... | ... |
vl.c