VirtualBox

Changeset 14159 in vbox


Ignore:
Timestamp:
Nov 13, 2008 6:30:22 AM (16 years ago)
Author:
vboxsync
Message:

registration several sockets per event, to avoid artificial barrier with
WSA_MAXIMUM_WAIT_EVENTS (64). Currently registered 64 sockets per event.
should work fine ;)

Location:
trunk/src/VBox/Devices/Network/slirp
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Network/slirp/slirp.c

    r14129 r14159  
    200200{
    201201    int fNATfailed = 0;
     202#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
     203    int i;
     204#endif
    202205    PNATState pData = malloc(sizeof(NATState));
    203206    *ppData = pData;
     
    224227#ifdef VBOX_WITH_SIMPLEFIED_SLIRP_SYNC
    225228    /*XXX:probably should be configurable*/
    226     pData->cMaxEvent = 256;
     229    pData->cMaxEvent = WSA_MAXIMUM_WAIT_EVENTS;
    227230    pData->phEvents = malloc(sizeof(HANDLE) * pData->cMaxEvent);
     231    for (i = 1; i < WSA_MAXIMUM_WAIT_EVENTS; ++i) {
     232            pData->phEvents[i] = CreateEvent(NULL, FALSE, FALSE, NULL);
     233    }
    228234#endif
    229235#endif
     
    402408#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
    403409                        AssertRelease(cEvents < pData->cMaxEvent);
    404                         WSAResetEvent(so->hNetworkEvent);
    405410#endif
    406411                        /*
     
    504509                                UPD_NFDS(so->s);
    505510#else
    506                                 WSAResetEvent(so->hNetworkEvent);
    507511                                AssertRelease(cEvents < pData->cMaxEvent);
    508512                                rc = WSAEventSelect(so->s, so->hNetworkEvent, FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT);
     
    631635                                if (so->so_state & SS_FACCEPTCONN) {
    632636                                        tcp_connect(pData, so);
    633 #if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
    634                                         WSAResetEvent(so->hNetworkEvent);
    635 #endif
    636637                                        continue;
    637638                                } /* else */
     
    670671                              if (errno == EAGAIN || errno == EWOULDBLOCK ||
    671672                                  errno == EINPROGRESS || errno == ENOTCONN) {
    672 #if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
    673                                         WSAResetEvent(so->hNetworkEvent);
    674 #endif
    675673                                continue;
    676674                              }
     
    709707                            if (errno == EAGAIN || errno == EWOULDBLOCK ||
    710708                                errno == EINPROGRESS || errno == ENOTCONN) {
    711 #if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
    712                               WSAResetEvent(so->hNetworkEvent);
    713 #endif
    714709                              continue; /* Still connecting, continue */
    715710                            }
     
    725720                              if (errno == EAGAIN || errno == EWOULDBLOCK ||
    726721                                  errno == EINPROGRESS || errno == ENOTCONN) {
    727 #if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
    728                                 WSAResetEvent(so->hNetworkEvent);
    729 #endif
    730722                                continue;
    731723                                }
     
    759751#endif
    760752                            sorecvfrom(pData, so);
    761 #if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
    762                                 WSAResetEvent(so->hNetworkEvent);
    763 #endif
    764753                        }
    765754                }
  • trunk/src/VBox/Devices/Network/slirp/socket.c

    r14085 r14159  
    6060    so->so_state = SS_NOFDREF;
    6161    so->s = -1;
    62 #if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
    63     so->hNetworkEvent = WSACreateEvent(); /*XXX: NOT correct place*/
    64     AssertRelease(so->hNetworkEvent != WSA_INVALID_EVENT);
    65 #endif
    6662  }
    6763  return(so);
     
    740736}
    741737
     738#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
     739void soregister_event(struct NATState *pData, struct socket *so)
     740{
     741        static int soidx;
     742        static int eidx = 1;
     743       
     744        if (soidx >= WSA_MAXIMUM_WAIT_EVENTS * eidx) {
     745                eidx++;
     746        }
     747        so->hNetworkEvent = pData->phEvents[eidx];
     748        soidx++;
     749}
     750#endif
  • trunk/src/VBox/Devices/Network/slirp/socket.h

    r14028 r14159  
    104104void soisfdisconnected _P((struct socket *));
    105105void sofwdrain _P((struct socket *));
     106#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
     107void soregister_event _P((PNATState, struct socket *));
     108#endif
    106109
    107110#endif /* _SOCKET_H_ */
  • trunk/src/VBox/Devices/Network/slirp/tcp_input.c

    r13984 r14159  
    391391            goto dropwithreset;
    392392          }
     393#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
     394          soregister_event(pData, so);
     395#endif
    393396
    394397          sbreserve(&so->so_snd, tcp_sndspace);
  • trunk/src/VBox/Devices/Network/slirp/tcp_subr.c

    r13984 r14159  
    466466                        return;
    467467                }
     468#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
     469                soregister_event(pData, so);
     470#endif
    468471                so->so_laddr = inso->so_laddr;
    469472                so->so_lport = inso->so_lport;
  • trunk/src/VBox/Devices/Network/slirp/udp.c

    r13984 r14159  
    636636                return NULL;
    637637        }
     638#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
     639        soregister_event(pData, so);
     640#endif
    638641        so->s = socket(AF_INET,SOCK_DGRAM,0);
    639642        so->so_expire = curtime + SO_EXPIRE;
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette