VirtualBox

Ignore:
Timestamp:
Jan 31, 2009 7:16:03 AM (16 years ago)
Author:
vboxsync
Message:

NAT:MT

  1. slirp queue inroduced
  2. main points of thread interactions are saved with critical sections
  3. slirp polling routine and timers communicates with NAT guest IO thread via queue

TODO: not works well, not compilable on Unixes.

File:
1 edited

Legend:

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

    r16293 r16443  
    6060    struct socket *so;
    6161
    62     so = (struct socket *)RTMemAlloc(sizeof(struct socket));
     62    so = (struct socket *)RTMemAllocZ(sizeof(struct socket));
    6363    if(so)
    6464    {
     
    8989    if(so->so_next && so->so_prev)
    9090        remque(pData, so);  /* crashes if so is not in a queue */
    91 
     91    so->so_state = SS_NOFDREF; /* for debugging purposes */
    9292    SOCKET_UNLOCK(so);
    9393    SOCKET_LOCK_DESTROY(so);
    9494
    9595    RTMemFree(so);
    96 }
     96    so = NULL;
     97}
     98
     99#ifdef VBOX_WITH_SLIRP_MT
     100void
     101soread_queue(PNATState pData, struct socket *so, int fCloseIfNothingRead, int *ret)
     102{
     103    *ret = soread(pData, so, fCloseIfNothingRead);
     104}
     105#endif
    97106
    98107/*
     
    109118    struct iovec iov[2];
    110119    int mss = so->so_tcpcb->t_maxseg;
     120    Log2(("%s:%d soread before lock\n", __FUNCTION__, __LINE__));
     121    QSOCKET_LOCK(tcb);
     122    SOCKET_LOCK(so);
     123    QSOCKET_UNLOCK(tcb);
     124    Log2(("%s:%d soread before lock\n",__FUNCTION__, __LINE__));
    111125
    112126    DEBUG_CALL("soread");
     
    190204         */
    191205        if (nn == 0 && !fCloseIfNothingRead)
     206        {
     207            SOCKET_UNLOCK(so);
    192208            return 0;
     209        }
    193210#endif
    194211        if (nn < 0 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK))
     212        {
     213            SOCKET_UNLOCK(so);
    195214            return 0;
     215        }
    196216        else
    197217        {
     
    201221            sofcantrcvmore(so);
    202222            tcp_sockclosed(pData, sototcpcb(so));
     223            SOCKET_UNLOCK(so);
    203224            return -1;
    204225        }
     
    231252    if (sb->sb_wptr >= (sb->sb_data + sb->sb_datalen))
    232253        sb->sb_wptr -= sb->sb_datalen;
     254    SOCKET_UNLOCK(so);
    233255    return nn;
    234256}
     
    344366    DEBUG_CALL("sowrite");
    345367    DEBUG_ARG("so = %lx", (long)so);
    346 
     368    QSOCKET_LOCK(tcb);
     369    SOCKET_LOCK(so);
     370    QSOCKET_UNLOCK(tcb);
    347371    if (so->so_urgc)
    348372    {
    349373        sosendoob(so);
    350374        if (sb->sb_cc == 0)
     375        {
     376            SOCKET_UNLOCK(so);   
    351377            return 0;
     378        }
    352379    }
    353380
     
    396423    /* This should never happen, but people tell me it does *shrug* */
    397424    if (nn < 0 && (errno == EAGAIN || errno == EINTR || errno == EWOULDBLOCK))
     425    {
     426        SOCKET_UNLOCK(so);   
    398427        return 0;
     428    }
    399429
    400430    if (nn < 0 || (nn == 0 && iov[0].iov_len > 0))
     
    404434        sofcantsendmore(so);
    405435        tcp_sockclosed(pData, sototcpcb(so));
     436        SOCKET_UNLOCK(so);   
    406437        return -1;
    407438    }
     
    431462        sofcantsendmore(so);
    432463
     464    SOCKET_UNLOCK(so);   
    433465    return nn;
    434466}
     
    463495        u_long n;
    464496
    465         if (!(m = m_get(pData)))
     497        QSOCKET_LOCK(udb);
     498        SOCKET_LOCK(so);
     499        QSOCKET_UNLOCK(udb);
     500
     501        if (!(m = m_get(pData)))
     502        {
     503            SOCKET_UNLOCK(so);
    466504            return;
     505        }
    467506        m->m_data += if_maxlinkhdr;
    468507#ifdef VBOX_WITH_SIMPLIFIED_SLIRP_SYNC
     
    490529        m->m_len = recvfrom(so->s, m->m_data, len, 0,
    491530                            (struct sockaddr *)&addr, &addrlen);
    492         DEBUG_MISC((dfd, " did recvfrom %d, errno = %d-%s\n",
     531        Log2((" did recvfrom %d, errno = %d-%s\n",
    493532                    m->m_len, errno,strerror(errno)));
    494533        if(m->m_len < 0)
     
    501540                code = ICMP_UNREACH_NET;
    502541
    503             DEBUG_MISC((dfd," rx error, tx icmp ICMP_UNREACH:%i\n", code));
     542            Log2((dfd," rx error, tx icmp ICMP_UNREACH:%i\n", code));
    504543            icmp_error(pData, so->so_m, ICMP_UNREACH,code, 0,strerror(errno));
    505544            m_free(pData, m);
     
    534573             */
    535574            udp_output(pData, so, m, &addr);
     575            SOCKET_UNLOCK(so);
    536576        } /* rx error */
    537577    } /* if ping packet */
     
    678718        int tmperrno = WSAGetLastError(); /* Don't clobber the real reason we failed */
    679719        closesocket(s);
     720        QSOCKET_LOCK(tcb);
    680721        sofree(pData, so);
     722        QSOCKET_UNLOCK(tcb);
    681723        /* Restore the real errno */
    682724        WSASetLastError(tmperrno);
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