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