VirtualBox

Ignore:
Timestamp:
Oct 28, 2008 4:47:11 AM (16 years ago)
Author:
vboxsync
Message:

Synchronized slirp was inroduced

File:
1 edited

Legend:

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

    r8009 r13604  
    1212#ifdef __sun__
    1313#include <sys/filio.h>
     14#endif
     15
     16#ifdef VBOX_WITH_SYNC_SLIRP
     17#include <iprt/semaphore.h>
    1418#endif
    1519
     
    6064    so->so_state = SS_NOFDREF;
    6165    so->s = -1;
     66#ifdef VBOX_WITH_SYNC_SLIRP
     67    RTSemMutexCreate(&so->so_mutex);
     68#endif
    6269  }
    6370  return(so);
     
    7077sofree(PNATState pData, struct socket *so)
    7178{
     79#ifndef VBOX_WITH_SYNC_SLIRP
    7280  if (so->so_emu==EMU_RSH && so->extra) {
    7381        sofree(pData, so->extra);
     
    8391  if(so->so_next && so->so_prev)
    8492    remque(pData, so);  /* crashes if so is not in a queue */
     93#else
     94    /*Take global mutexes of udb and tcb, because we dont know which is mutex */
     95    /*XXX: don't forget to set correct so_type in corresponded attach operation */
     96    RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT);
     97    if (so->so_emu==EMU_RSH && so->extra) {
     98          sofree(pData, so->extra);
     99          so->extra=NULL;
     100    }
     101
     102    if (so->so_type == IPPROTO_UDP) {
     103        RTSemMutexRequest(pData->udb_mutex, RT_INDEFINITE_WAIT);
     104    }
     105    else if (so->so_type == IPPROTO_TCP) {
     106        RTSemMutexRequest(pData->tcb_mutex, RT_INDEFINITE_WAIT);
     107    }
     108    else {
     109        Assert(!"unknown type");
     110    }
     111
     112    if (so == tcp_last_so)
     113      tcp_last_so = &tcb;
     114    else if (so == udp_last_so)
     115      udp_last_so = &udb;
     116
     117    if(so->so_next && so->so_prev)
     118      remque(pData, so);  /* crashes if so is not in a queue */
     119
     120    if (so->so_type == IPPROTO_UDP) {
     121        RTSemMutexRelease(pData->udb_mutex);
     122    }
     123    else if (so->so_type == IPPROTO_TCP) {
     124        RTSemMutexRelease(pData->tcb_mutex);
     125    }
     126    else {
     127        Assert(!"unknown type");
     128    }
     129    /* socket's mutex could be released because socket none accessible via queue anymore*/
     130    RTSemMutexRelease(so->so_mutex);
     131
     132    m_free(pData, so->so_m);
     133
     134
     135    RTSemMutexDestroy(so->so_mutex);
     136#endif
    85137
    86138  free(so);
     139  so = NULL;
    87140}
    88141
     
    101154        int mss = so->so_tcpcb->t_maxseg;
    102155
     156#ifdef VBOX_WITH_SYNC_SLIRP
     157        RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT);
     158#endif
    103159        DEBUG_CALL("soread");
    104160        DEBUG_ARG("so = %lx", (long )so);
     
    159215#endif
    160216        if (nn <= 0) {
    161                 if (nn < 0 && (errno == EINTR || errno == EAGAIN))
     217                if (nn < 0 && (errno == EINTR || errno == EAGAIN)) {
     218#ifdef VBOX_WITH_SYNC_SLIRP
     219                        RTSemMutexRelease(so->so_mutex);
     220#endif
    162221                        return 0;
     222                }
    163223                else {
    164224                        DEBUG_MISC((dfd, " --- soread() disconnected, nn = %d, errno = %d-%s\n", nn, errno,strerror(errno)));
    165225                        sofcantrcvmore(so);
    166226                        tcp_sockclosed(pData, sototcpcb(so));
     227#ifdef VBOX_WITH_SYNC_SLIRP
     228                        RTSemMutexRelease(so->so_mutex);
     229#endif
    167230                        return -1;
    168231                }
     
    194257        if (sb->sb_wptr >= (sb->sb_data + sb->sb_datalen))
    195258                sb->sb_wptr -= sb->sb_datalen;
     259#ifdef VBOX_WITH_SYNC_SLIRP
     260        RTSemMutexRelease(so->so_mutex);
     261#endif
    196262        return nn;
    197263}
     
    207273sorecvoob(PNATState pData, struct socket *so)
    208274{
     275#ifdef VBOX_WITH_SYNC_SLIRP
     276        RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT);
     277#endif
    209278        struct tcpcb *tp = sototcpcb(so);
    210279
     
    225294        tcp_output(pData, tp);
    226295        tp->t_force = 0;
     296#ifdef VBOX_WITH_SYNC_SLIRP
     297        RTSemMutexRelease(so->so_mutex);
     298#endif
    227299}
    228300
     
    239311
    240312        int n, len;
     313#ifdef VBOX_WITH_SYNC_SLIRP
     314        RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT);
     315#endif
    241316
    242317        DEBUG_CALL("sosendoob");
     
    283358                sb->sb_rptr -= sb->sb_datalen;
    284359
     360#ifdef VBOX_WITH_SYNC_SLIRP
     361        RTSemMutexRelease(so->so_mutex);
     362#endif
    285363        return n;
    286364}
     
    297375        int len = sb->sb_cc;
    298376        struct iovec iov[2];
     377#ifdef VBOX_WITH_SYNC_SLIRP
     378        RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT);
     379#endif
    299380
    300381        DEBUG_CALL("sowrite");
     
    344425#endif
    345426        /* This should never happen, but people tell me it does *shrug* */
    346         if (nn < 0 && (errno == EAGAIN || errno == EINTR))
     427        if (nn < 0 && (errno == EAGAIN || errno == EINTR)) {
     428#ifdef VBOX_WITH_SYNC_SLIRP
     429                RTSemMutexRelease(so->so_mutex);
     430#endif
    347431                return 0;
     432        }
    348433
    349434        if (nn <= 0) {
     
    352437                sofcantsendmore(so);
    353438                tcp_sockclosed(pData, sototcpcb(so));
     439#ifdef VBOX_WITH_SYNC_SLIRP
     440                RTSemMutexRelease(so->so_mutex);
     441#endif
    354442                return -1;
    355443        }
     
    378466                sofcantsendmore(so);
    379467
     468#ifdef VBOX_WITH_SYNC_SLIRP
     469        RTSemMutexRelease(so->so_mutex);
     470#endif
    380471        return nn;
    381472}
     
    392483        DEBUG_CALL("sorecvfrom");
    393484        DEBUG_ARG("so = %lx", (long)so);
     485
     486#ifdef VBOX_WITH_SYNC_SLIRP
     487        RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT);
     488#endif
    394489
    395490        if (so->so_type == IPPROTO_ICMP) {   /* This is a "ping" reply */
     
    478573          } /* rx error */
    479574        } /* if ping packet */
     575#ifdef VBOX_WITH_SYNC_SLIRP
     576        RTSemMutexRelease(so->so_mutex);
     577#endif
    480578}
    481579
     
    490588#if 0
    491589        struct sockaddr_in host_addr;
     590#endif
     591#ifdef VBOX_WITH_SYNC_SLIRP
     592        RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT);
    492593#endif
    493594
     
    542643        ret = sendto(so->s, m->m_data, m->m_len, 0,
    543644                     (struct sockaddr *)&addr, sizeof (struct sockaddr));
    544         if (ret < 0)
     645        if (ret < 0) {
     646#ifdef VBOX_WITH_SYNC_SLIRP
     647                RTSemMutexRelease(so->so_mutex);
     648#endif
    545649                return -1;
     650        }
    546651
    547652        /*
     
    552657                so->so_expire = curtime + SO_EXPIRE;
    553658        so->so_state = SS_ISFCONNECTED; /* So that it gets select()ed */
     659#ifdef VBOX_WITH_SYNC_SLIRP
     660                RTSemMutexRelease(so->so_mutex);
     661#endif
    554662        return 0;
    555663}
     
    582690                return NULL;
    583691        }
     692#ifndef VBOX_WITH_SYNC_SLIRP
    584693        insque(pData, so,&tcb);
     694#else
     695        RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT);
     696        /*after adding to global queue probably we should keep lock*/
     697        RTSemMutexRequest(pData->tcb_mutex, RT_INDEFINITE_WAIT);
     698        insque(pData, so,&tcb);
     699        RTSemMutexRelease(pData->tcb_mutex);
     700#endif
    585701
    586702        /*
     
    627743
    628744        so->s = s;
     745#ifdef VBOX_WITH_SYNC_SLIRP
     746        RTSemMutexRelease(so->so_mutex);
     747#endif
    629748        return so;
    630749}
     
    665784        register struct socket *so;
    666785{
     786#ifdef VBOX_WITH_SYNC_SLIRP
     787    RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT);
     788#endif
    667789        so->so_state &= ~(SS_NOFDREF|SS_ISFCONNECTED|SS_FCANTRCVMORE|
    668790                          SS_FCANTSENDMORE|SS_FWDRAIN);
    669791        so->so_state |= SS_ISFCONNECTING; /* Clobber other states */
     792#ifdef VBOX_WITH_SYNC_SLIRP
     793    RTSemMutexRelease(so->so_mutex);
     794#endif
    670795}
    671796
     
    674799        register struct socket *so;
    675800{
     801#ifdef VBOX_WITH_SYNC_SLIRP
     802    RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT);
     803#endif
    676804        so->so_state &= ~(SS_ISFCONNECTING|SS_FWDRAIN|SS_NOFDREF);
    677805        so->so_state |= SS_ISFCONNECTED; /* Clobber other states */
     806#ifdef VBOX_WITH_SYNC_SLIRP
     807    RTSemMutexRelease(so->so_mutex);
     808#endif
    678809}
    679810
     
    682813        struct  socket *so;
    683814{
     815#ifdef VBOX_WITH_SYNC_SLIRP
     816    RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT);
     817#endif
    684818        if ((so->so_state & SS_NOFDREF) == 0) {
    685819                shutdown(so->s,0);
     
    690824        else
    691825           so->so_state |= SS_FCANTRCVMORE;
     826#ifdef VBOX_WITH_SYNC_SLIRP
     827    RTSemMutexRelease(so->so_mutex);
     828#endif
    692829}
    693830
     
    696833        struct socket *so;
    697834{
     835#ifdef VBOX_WITH_SYNC_SLIRP
     836    RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT);
     837#endif
    698838        if ((so->so_state & SS_NOFDREF) == 0) {
    699839            shutdown(so->s,1);           /* send FIN to fhost */
     
    704844        else
    705845           so->so_state |= SS_FCANTSENDMORE;
     846#ifdef VBOX_WITH_SYNC_SLIRP
     847    RTSemMutexRelease(so->so_mutex);
     848#endif
    706849}
    707850
     
    726869        struct socket *so;
    727870{
     871#ifdef VBOX_WITH_SYNC_SLIRP
     872    RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT);
     873#endif
    728874        if (so->so_rcv.sb_cc)
    729875                so->so_state |= SS_FWDRAIN;
    730876        else
    731877                sofcantsendmore(so);
    732 }
    733 
     878#ifdef VBOX_WITH_SYNC_SLIRP
     879    RTSemMutexRelease(so->so_mutex);
     880#endif
     881}
     882
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