VirtualBox

Changeset 16445 in vbox for trunk


Ignore:
Timestamp:
Feb 1, 2009 8:42:38 AM (16 years ago)
Author:
vboxsync
Message:

NAT:MT

  1. foreach/label sequences enhanced
  2. debug printing for sockets corretctly resolves NULL and SS_NOFDREF sockets.
Location:
trunk/src/VBox/Devices/Network/slirp
Files:
6 edited

Legend:

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

    r16443 r16445  
    250250
    251251    AssertReturn(strcmp(pszType, "natsock") == 0, 0);
     252    if (so == NULL)
     253        return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "socket is null");
    252254    if (so->so_state == SS_NOFDREF || so->s == -1)
    253255        return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "socket SS_NODREF");
  • trunk/src/VBox/Devices/Network/slirp/slirp.c

    r16443 r16445  
    692692                if (so->so_expire <= curtime)
    693693                {
     694                    QSOCKET_LOCK(udb);
     695#ifdef VBOX_WITH_SLIRP_MT
     696                    /*we can determinate the next item after udb_detach*/
     697                    if (so->so_next != &tcb)
     698                    {
     699                        SOCKET_LOCK(so->so_next);
     700                        so_next = so->so_next;
     701                    }
     702#endif
     703                    QSOCKET_UNLOCK(udb);
    694704                    udp_detach(pData, so);
    695705                    CONTINUE_NO_UNLOCK(udp);
  • trunk/src/VBox/Devices/Network/slirp/slirp_state.h

    r16443 r16445  
    287287do {                                                                            \
    288288    int rc;                                                                     \
    289     rc = RTCritSectEnter(&_X(queue) ## _mutex);            \
     289    /* Assert(strcmp(RTThreadSelfName(), "EMT") != 0); */                       \
     290    rc = RTCritSectEnter(&_X(queue) ## _mutex);                                 \
    290291    AssertReleaseRC(rc);                                                        \
    291292} while (0)
     
    311312        QSOCKET_LOCK(__X(queue_## label ## _label));                \
    312313        (so) = (_X(queue_ ## label ## _label)).so_next;             \
     314        QSOCKET_UNLOCK(__X(queue_## label ##_label));               \
    313315        if ((so) != &(_X(queue_## label ## _label))) SOCKET_LOCK((so));  \
    314316        for(;;)                                                     \
     
    316318            if ((so) == &(_X(queue_## label ## _label)))            \
    317319            {                                                       \
    318                 QSOCKET_UNLOCK(__X(queue_## label ##_label));       \
    319320                break;                                              \
    320321            }                                                       \
    321             Log2(("%s:%d Processing so:%R[natsock]\n", __FUNCTION__, __LINE__, (so)));  \
    322             if ((so)->so_next != &(_X(queue_## label ## _label)))   \
    323             {                                                       \
    324                 SOCKET_LOCK((so)->so_next);                         \
    325             }                                                       \
    326             (sonext) = (so)->so_next;                               \
    327             QSOCKET_UNLOCK(__X(queue_## label ##_label));
     322            Log2(("%s:%d Processing so:%R[natsock]\n", __FUNCTION__, __LINE__, (so)));
    328323
    329324# define CONTINUE_NO_UNLOCK(label) goto loop_end_ ## label ## _mt_nounlock
    330325# define CONTINUE(label) goto loop_end_ ## label ## _mt
    331326/* @todo replace queue parameter with macrodinition */
     327/* _mt_nounlock - user should lock so_next before calling CONTINUE_NO_UNLOCK */
    332328# define LOOP_LABEL(label, so, sonext) loop_end_ ## label ## _mt:       \
     329    (sonext) = (so)->so_next;                                           \
    333330    SOCKET_UNLOCK(so);                                                  \
     331    QSOCKET_LOCK(_X(queue_ ## label ## _label));                        \
     332    if ((sonext) != &(_X(queue_## label ## _label)))                    \
     333    {                                                                   \
     334        SOCKET_LOCK((sonext));                                          \
     335        QSOCKET_UNLOCK(_X(queue_ ## label ## _label));                  \
     336    }                                                                   \
     337    else                                                                \
     338    {                                                                   \
     339        so = &_X(queue_ ## label ## _label);                            \
     340        QSOCKET_UNLOCK(_X(queue_ ## label ## _label));                  \
     341        break;                                                          \
     342    }                                                                   \
     343    (so) = (sonext);                                                    \
     344    continue;                                                           \
    334345    loop_end_ ## label ## _mt_nounlock:                                 \
    335     QSOCKET_LOCK(_X(queue_ ## label ## _label));                        \
    336346    (so) = (sonext)
    337 
     347   
    338348#define DO_TCP_OUTPUT(data, sotcb)                                      \
    339349do {                                                                    \
  • trunk/src/VBox/Devices/Network/slirp/socket.c

    r16443 r16445  
    7878sofree(PNATState pData, struct socket *so)
    7979{
     80    struct socket *so_prev = NULL;
    8081    if (so == tcp_last_so)
    8182        tcp_last_so = &tcb;
     
    8687    if (so->so_m != NULL)
    8788        m_free(pData, so->so_m);
    88 
    8989    if(so->so_next && so->so_prev)
     90    {
     91        if (   so->so_prev != NULL
     92            && so->so_prev != &udb
     93            && so->so_prev != &tcb)
     94            {
     95                SOCKET_LOCK(so->so_prev);
     96                so_prev = so->so_prev;
     97            }
    9098        remque(pData, so);  /* crashes if so is not in a queue */
     99        if (so_prev != NULL)
     100            SOCKET_UNLOCK(so_prev);
     101    }
    91102    so->so_state = SS_NOFDREF; /* for debugging purposes */
    92103    SOCKET_UNLOCK(so);
     
    744755
    745756    so->s = s;
     757    SOCKET_UNLOCK(so);
    746758    return so;
    747759}
  • trunk/src/VBox/Devices/Network/slirp/socket.h

    r16443 r16445  
    7676    do {                                                                \
    7777        int rc;                                                         \
     78        /* Assert(strcmp(RTThreadSelfName(), "EMT") != 0); */           \
    7879        Log2(("lock:%s:%d L on %R[natsock]\n", __FUNCTION__, __LINE__, (so)));       \
     80        Assert(!RTCritSectIsOwner(&(so)->so_mutex));                     \
    7981        rc = RTCritSectEnter(&(so)->so_mutex);                           \
    8082        AssertReleaseRC(rc);                                            \
  • trunk/src/VBox/Devices/Network/slirp/tcp_input.c

    r16443 r16445  
    425425                && so->so_fport        == ti->ti_dport)
    426426            {
    427                 if (sonxt != &tcb)
    428                     SOCKET_UNLOCK(sonxt);
    429427                Log2(("lock: %s:%d We found socket %R[natsock]\n", __FUNCTION__, __LINE__, so));
    430428                break; /* so is locked here */
     
    462460     * as if it was LISTENING, and continue...
    463461     */
    464     Log2(("so = %p\n", so));
     462    Log2(("so = %R[natsock]\n", so));
    465463    if (so == 0)
    466464    {
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