VirtualBox

Changeset 16449 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Feb 2, 2009 6:03:10 AM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
42317
Message:

NAT:MT connection closing is working now

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

Legend:

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

    r16448 r16449  
    800800        /* { */
    801801
     802#ifdef VBOX_WITH_SLIRP_MT
     803            if (   so->so_state & SS_NOFDREF
     804                && so->so_deleted == 1)
     805            {   
     806                struct socket *son, *sop = NULL;
     807                QSOCKET_LOCK(tcb);
     808                if (so->so_next != NULL)
     809                {
     810                    if (so->so_next != &tcb)
     811                        SOCKET_LOCK(so->so_next);
     812                    son = so->so_next;
     813                }
     814                if (    so->so_prev != &tcb
     815                    && so->so_prev != NULL)
     816                {
     817                    SOCKET_LOCK(so->so_prev);
     818                    sop = so->so_prev;
     819                }
     820                QSOCKET_UNLOCK(tcb);
     821                remque(pData, so);
     822                SOCKET_UNLOCK(so);
     823                SOCKET_LOCK_DESTROY(so);
     824                RTMemFree(so);
     825                so_next = son;
     826                if (sop != NULL)
     827                    SOCKET_UNLOCK(sop);
     828                CONTINUE_NO_UNLOCK(tcp);
     829            }
     830#endif
    802831            /*
    803832             * FD_ISSET is meaningless on these sockets
     
    9771006         QSOCKET_FOREACH(so, so_next, udp)
    9781007         /* { */
     1008#ifdef VBOX_WITH_SLIRP_MT
     1009            if (   so->so_state & SS_NOFDREF
     1010                && so->so_deleted == 1)
     1011            {   
     1012                struct socket *son, *sop = NULL;
     1013                QSOCKET_LOCK(udb);
     1014                if (so->so_next != NULL)
     1015                {
     1016                    if (so->so_next != &udb)
     1017                        SOCKET_LOCK(so->so_next);
     1018                    son = so->so_next;
     1019                }
     1020                if (    so->so_prev != &udb
     1021                    && so->so_prev != NULL)
     1022                {
     1023                    SOCKET_LOCK(so->so_prev);
     1024                    sop = so->so_prev;
     1025                }
     1026                QSOCKET_UNLOCK(udb);
     1027                remque(pData, so);
     1028                SOCKET_UNLOCK(so);
     1029                SOCKET_LOCK_DESTROY(so);
     1030                RTMemFree(so);
     1031                so_next = son;
     1032                if (sop != NULL)
     1033                    SOCKET_UNLOCK(sop);
     1034                CONTINUE_NO_UNLOCK(udp);
     1035            }
     1036#endif
    9791037            POLL_UDP_EVENTS(rc, error, so, &NetworkEvents);
    9801038
  • trunk/src/VBox/Devices/Network/slirp/socket.c

    r16448 r16449  
    8787    if (so->so_m != NULL)
    8888        m_free(pData, so->so_m);
     89#ifndef VBOX_WITH_SLIRP_MT
    8990    if(so->so_next && so->so_prev)
    9091        remque(pData, so);  /* crashes if so is not in a queue */
    9192    so->so_state = SS_NOFDREF; /* for debugging purposes */
    92     SOCKET_UNLOCK(so);
    93     SOCKET_LOCK_DESTROY(so);
    9493
    9594    RTMemFree(so);
     95#else
     96    so->so_deleted = 1;
     97#endif
    9698}
    9799
  • trunk/src/VBox/Devices/Network/slirp/socket.h

    r16445 r16449  
    6969#ifdef VBOX_WITH_SLIRP_MT
    7070    RTCRITSECT      so_mutex;
     71    int             so_deleted;
    7172#endif
    7273};
  • trunk/src/VBox/Devices/Network/slirp/tcp_input.c

    r16448 r16449  
    423423                && so->so_laddr.s_addr == ti->ti_src.s_addr
    424424                && so->so_faddr.s_addr == ti->ti_dst.s_addr
    425                 && so->so_fport        == ti->ti_dport)
     425                && so->so_fport        == ti->ti_dport
     426                && so->so_deleted != 1)
    426427            {
    427428                Log2(("lock: %s:%d We found socket %R[natsock]\n", __FUNCTION__, __LINE__, so));
     
    16541655    m_free(pData, m);
    16551656
    1656 #ifdef VBOX_WITH_SLIRP_MT
    1657     /*socket should be killed atm*/
    1658     AssertRelease(!RTCritSectIsInitialized(&so->so_mutex));
    1659 #endif   
    16601657    return;
    16611658}
  • trunk/src/VBox/Devices/Network/slirp/tcp_subr.c

    r16448 r16449  
    287287    sbfree(&so->so_rcv);
    288288    sbfree(&so->so_snd);
    289     QSOCKET_LOCK(tcb);
    290     if (   so->so_next != &tcb
    291         && so->so_next != NULL)
    292     {
    293         SOCKET_LOCK(so->so_next);
    294         so_next = so->so_next;
    295     }
    296     if (   so->so_prev != &tcb
    297         && so->so_prev != NULL)
    298     {
    299         SOCKET_LOCK(so->so_prev);
    300         so_prev = so->so_prev;
    301     }
    302     QSOCKET_UNLOCK(tcb);
    303289    sofree(pData, so);
    304     if (so_next != NULL) SOCKET_UNLOCK(so_next);
    305     if (so_prev != NULL) SOCKET_UNLOCK(so_prev);
     290    SOCKET_UNLOCK(so);
    306291    tcpstat.tcps_closed++;
    307292    return ((struct tcpcb *)0);
  • trunk/src/VBox/Devices/Network/slirp/udp.c

    r16448 r16449  
    400400udp_detach(PNATState pData, struct socket *so)
    401401{
    402     struct socket *so_next, *so_prev;
    403     so_next = so_prev = NULL;
    404402    if (so != &pData->icmp_socket)
    405403    {
    406404        QSOCKET_LOCK(udb);
    407405        SOCKET_LOCK(so);
    408         if (    so->so_next != &udb
    409             && so->so_next != NULL)
    410         {
    411             SOCKET_LOCK(so->so_next);
    412             so_next = so->so_next;
    413         }
    414         if (    so->so_prev != &udb
    415             && so->so_prev != NULL)
    416         {
    417             SOCKET_LOCK(so->so_prev);
    418             so_prev = so->so_prev;
    419         }
    420406        QSOCKET_UNLOCK(udb);
    421407        closesocket(so->s);
    422408        sofree(pData, so);
    423         if(so_prev != NULL)
    424             SOCKET_UNLOCK(so_prev);
    425         if(so_next != NULL)
    426             SOCKET_UNLOCK(so_next);
     409        SOCKET_UNLOCK(so);
    427410    }
    428411}
Note: See TracChangeset for help on using the changeset viewer.

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