VirtualBox

Ignore:
Timestamp:
Oct 30, 2008 4:17:02 AM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
38623
Message:

Resolved locks in UDP
Some mutex operations checked with AssertReleaseRC
Still TCP part need to be re-checked
udb_mutex now used only for controlling pData->udb
and udp_last_so controlled by udp_last_so_mutex

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

Legend:

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

    r13621 r13670  
    216216                }
    217217#ifdef VBOX_WITH_SYNC_SLIRP
     218            RTSemMutexRelease(ifq->m_mutex);
    218219            RTSemMutexRequest(pData->if_batchq_mutex, RT_INDEFINITE_WAIT);
    219             RTSemMutexRelease(ifq->m_mutex);
    220220            ifq = ifqprev;
    221221#endif
     
    288288                        remque(pData, ifm->ifs_next);
    289289#ifdef VBOX_WITH_SYNC_SLIRP
     290                        RTSemMutexRelease(pData->if_fastq_mutex);
    290291                        RTSemMutexRequest(pData->if_batchq_mutex, RT_INDEFINITE_WAIT);
    291292#endif
     
    294295                        insque(pData, ifm->ifs_next, &if_batchq);
    295296#ifdef VBOX_WITH_SYNC_SLIRP
    296                     RTSemMutexRelease(pData->if_fastq_mutex);
    297                     RTSemMutexRelease(pData->if_batchq_mutex);
     297                        RTSemMutexRelease(pData->if_batchq_mutex);
    298298#endif
    299299                }
     
    375375#ifdef VBOX_WITH_SYNC_SLIRP
    376376                RTSemMutexRelease(pData->if_fastq_mutex);
     377
     378                RTSemMutexRequest(pData->if_batchq_mutex, RT_INDEFINITE_WAIT);
    377379                RTSemMutexRequest(pData->next_m_mutex, RT_INDEFINITE_WAIT);
    378                 RTSemMutexRequest(pData->if_batchq_mutex, RT_INDEFINITE_WAIT);
    379380#endif
    380381                /* Nothing on fastq, see if next_m is valid */
     
    393394        RTSemMutexRequest(ifm->m_mutex, RT_INDEFINITE_WAIT);
    394395        RTSemMutexRequest(pData->if_queued_mutex, RT_INDEFINITE_WAIT);
     396        if (if_queued == 0) {
     397            if (on_fast) {
     398                RTSemMutexRelease(pData->if_fastq_mutex);
     399            }else {
     400                RTSemMutexRelease(pData->if_batchq_mutex);
     401            }
     402            goto done;
     403        }
    395404#endif
    396405        /* Remove it from the queue */
     
    430439        /* Encapsulate the packet for sending */
    431440        if_encap(pData, (const uint8_t *)ifm->m_data, ifm->m_len);
    432 #ifdef VBOX_WITH_SYNC_SLIRP
    433         RTSemMutexRelease(ifm->m_mutex);
    434 #endif
    435441
    436442        m_free(pData, ifm);
    437443
    438444#ifdef VBOX_WITH_SYNC_SLIRP
     445        if (ifm != NULL) RTSemMutexRelease(ifm->m_mutex);
    439446        RTSemMutexRequest(pData->if_queued_mutex, RT_INDEFINITE_WAIT);
    440447        /*We release if_queued_mutex after again label and before return*/
     
    443450           goto again;
    444451#ifdef VBOX_WITH_SYNC_SLIRP
     452        done:
    445453        RTSemMutexRelease(pData->if_queued_mutex);
    446454#endif
  • trunk/src/VBox/Devices/Network/slirp/ip_input.c

    r1076 r13670  
    7474        DEBUG_ARG("m_len = %d", m->m_len);
    7575
     76#ifdef VBOX_WITH_SYNC_SLIRP
     77        int rc;
     78        rc = RTSemMutexRequest(m->m_mutex, RT_INDEFINITE_WAIT);
     79        AssertReleaseRC(rc);
     80#endif
     81
    7682        ipstat.ips_total++;
    7783
    7884        if (m->m_len < sizeof (struct ip)) {
    7985                ipstat.ips_toosmall++;
     86#ifdef VBOX_WITH_SYNC_SLIRP
     87                rc = RTSemMutexRelease(m->m_mutex);
     88                AssertReleaseRC(rc);
     89#endif
    8090                return;
    8191        }
     
    208218         case IPPROTO_TCP:
    209219                tcp_input(pData, m, hlen, (struct socket *)NULL);
     220#ifdef VBOX_WITH_SYNC_SLIRP
     221                rc = RTSemMutexRelease(m->m_mutex);
     222                AssertReleaseRC(rc);
     223#endif
    210224                break;
    211225         case IPPROTO_UDP:
    212226                udp_input(pData, m, hlen);
     227#ifdef VBOX_WITH_SYNC_SLIRP
     228                rc = RTSemMutexRelease(m->m_mutex);
     229                AssertReleaseRC(rc);
     230#endif
    213231                break;
    214232         case IPPROTO_ICMP:
    215233                icmp_input(pData, m, hlen);
     234#ifdef VBOX_WITH_SYNC_SLIRP
     235                rc = RTSemMutexRelease(m->m_mutex);
     236                AssertReleaseRC(rc);
     237#endif
    216238                break;
    217239         default:
    218240                ipstat.ips_noproto++;
    219241                m_free(pData, m);
     242#ifdef VBOX_WITH_SYNC_SLIRP
     243                if (m != NULL) {
     244                        rc = RTSemMutexRelease(m->m_mutex);
     245                        AssertReleaseRC(rc);
     246                }
     247#endif
    220248        }
    221249        return;
    222250bad:
    223251        m_freem(pData, m);
     252#ifdef VBOX_WITH_SYNC_SLIRP
     253        if (m != NULL) {
     254                rc = RTSemMutexRelease(m->m_mutex);
     255                AssertReleaseRC(rc);
     256        }
     257#endif
    224258        return;
    225259}
  • trunk/src/VBox/Devices/Network/slirp/mbuf.c

    r13639 r13670  
    9191        }
    9292#ifdef VBOX_WITH_SYNC_SLIRP
     93        RTSemMutexRequest(m->m_mutex, RT_INDEFINITE_WAIT);
     94        RTSemMutexRelease(pData->m_freelist_mutex);
    9395        RTSemMutexRequest(pData->m_usedlist_mutex, RT_INDEFINITE_WAIT);
    9496#endif
     
    9698        /* Insert it in the used list */
    9799        insque(pData, m,&m_usedlist);
     100#ifdef VBOX_WITH_SYNC_SLIRP
     101        RTSemMutexRelease(pData->m_usedlist_mutex);
     102#endif
    98103        m->m_flags = (flags | M_USEDLIST);
    99 #ifdef VBOX_WITH_SYNC_SLIRP
    100         RTSemMutexRequest(m->m_mutex, RT_INDEFINITE_WAIT);
    101         RTSemMutexRelease(pData->m_usedlist_mutex);
    102         RTSemMutexRelease(pData->m_freelist_mutex);
    103 #endif
    104104
    105105        /* Initialise it */
     
    154154                free(m);
    155155#ifdef VBOX_WITH_SYNC_SLIRP
     156                m = NULL;
    156157                RTSemMutexRequest(pData->mbuf_alloced_mutex, RT_INDEFINITE_WAIT);
    157158                mbuf_alloced--;
     
    168169#ifdef VBOX_WITH_SYNC_SLIRP
    169170                RTSemMutexRelease(pData->m_freelist_mutex);
    170                 RTSemMutexRelease(m->m_mutex);
    171171#endif
    172172        }
     173#ifdef VBOX_WITH_SYNC_SLIRP
     174        if (m != NULL) RTSemMutexRelease(m->m_mutex);
     175#endif
    173176  } /* if(m) */
    174177}
     
    195198        m->m_len += n->m_len;
    196199
    197 #ifdef VBOX_WITH_SYNC_SLIRP
    198         RTSemMutexRelease(m->m_mutex);
    199         RTSemMutexRelease(n->m_mutex);
    200 #endif
    201200        m_free(pData, n);
     201#ifdef VBOX_WITH_SYNC_SLIRP
     202        RTSemMutexRelease(m->m_mutex);
     203        if (n != NULL) RTSemMutexRelease(n->m_mutex);
     204#endif
    202205}
    203206
     
    323326        for (m = m_usedlist.m_next; m != &m_usedlist; m = m->m_next) {
    324327#else
     328        struct mbuf *mnext;
    325329        RTSemMutexRequest(pData->m_usedlist_mutex, RT_INDEFINITE_WAIT);
    326330        m = m_usedlist.m_next;
    327331        while(1) {
    328332            RTSemMutexRequest(m->m_mutex, RT_INDEFINITE_WAIT);
     333            mnext = m->m_next;
    329334            RTSemMutexRelease(pData->m_usedlist_mutex);
    330335#endif
     
    347352          RTSemMutexRelease(m->m_mutex);
    348353          RTSemMutexRequest(pData->m_usedlist_mutex, RT_INDEFINITE_WAIT);
    349           m = m->m_next;
     354          m = mnext;
    350355#endif
    351356        }
  • trunk/src/VBox/Devices/Network/slirp/slirp.c

    r13604 r13670  
    235235    rc = RTSemMutexCreate(&pData->udb_mutex);
    236236    AssertReleaseRC(rc);
     237    rc = RTSemMutexCreate(&pData->udp_last_so_mutex);
     238    AssertReleaseRC(rc);
    237239    rc = RTSemMutexCreate(&pData->if_queued_mutex);
    238240    AssertReleaseRC(rc);
     
    460462                before_loop_ends:
    461463                        /*Release of global tcb mutex happens in the head of loop*/
     464                        RTSemMutexRelease(so->so_mutex);
    462465                        RTSemMutexRequest(pData->tcb_mutex, RT_INDEFINITE_WAIT);
    463                         RTSemMutexRelease(so->so_mutex);
    464466                        so = so_next;
    465467#endif
     
    516518#ifdef VBOX_WITH_SYNC_SLIRP
    517519                        before_udp_loop_end:
     520                        RTSemMutexRelease(so->so_mutex);
    518521                        RTSemMutexRequest(pData->udb_mutex, RT_INDEFINITE_WAIT);
    519                         RTSemMutexRelease(so->so_mutex);
    520522                        so = so_next;
    521523#endif
     
    739741#ifdef VBOX_WITH_SYNC_SLIRP
    740742                    before_loop_ends:
     743                    RTSemMutexRelease(so->so_mutex);
    741744                    RTSemMutexRequest(pData->tcb_mutex, RT_INDEFINITE_WAIT);
    742                     RTSemMutexRelease(so->so_mutex);
    743745                    so = so_next;
    744746#endif
     
    770772                        }
    771773#ifdef VBOX_WITH_SYNC_SLIRP
     774                    RTSemMutexRelease(so->so_mutex);
    772775                    RTSemMutexRequest(pData->udb_mutex, RT_INDEFINITE_WAIT);
    773                     RTSemMutexRelease(so->so_mutex);
    774776                    so = so_next;
    775777#endif
     
    784786           if_start(pData);
    785787#else
    786 #if 0
     788#if 1
    787789        if (link_up) {
    788790            RTSemMutexRequest(pData->if_queued_mutex, RT_INDEFINITE_WAIT);
     
    887889    struct mbuf *m;
    888890    int proto;
     891#ifdef VBOX_WITH_SYNC_SLIRP
     892    int rc;
     893#endif
    889894
    890895    if (pkt_len < ETH_HLEN)
     
    902907
    903908        m = m_get(pData);
     909#ifdef VBOX_WITH_SYNC_SLIRP
     910        if (m != NULL) {
     911            rc = RTSemMutexRequest(m->m_mutex, RT_INDEFINITE_WAIT);
     912            AssertReleaseRC(rc);
     913        }
     914#endif
    904915        if (!m)
    905916            return;
     
    915926
    916927        ip_input(pData, m);
     928#ifdef VBOX_WITH_SYNC_SLIRP
     929        rc = RTSemMutexRelease(m->m_mutex);
     930        AssertReleaseRC(rc);
     931#endif
    917932        break;
    918933    default:
  • trunk/src/VBox/Devices/Network/slirp/slirp_state.h

    r13640 r13670  
    177177     */
    178178    RTSEMMUTEX udb_mutex;
     179    /*
     180     * used for access udp_last_so global pointer avoiding overusing of udb_mutex.
     181     */
     182    RTSEMMUTEX udp_last_so_mutex;
    179183#endif
    180184} NATState;
  • trunk/src/VBox/Devices/Network/slirp/socket.c

    r13622 r13670  
    101101
    102102    if (so->so_type == IPPROTO_UDP) {
    103         RTSemMutexRequest(pData->udb_mutex, RT_INDEFINITE_WAIT);
     103        RTSemMutexRequest(pData->udp_last_so_mutex, RT_INDEFINITE_WAIT);
    104104    }
    105105    else if (so->so_type == IPPROTO_TCP) {
     
    119119
    120120    if (so->so_type == IPPROTO_UDP) {
    121         RTSemMutexRelease(pData->udb_mutex);
     121        RTSemMutexRelease(pData->udp_last_so_mutex);
    122122    }
    123123    else if (so->so_type == IPPROTO_TCP) {
     
    387387                sosendoob(so);
    388388                if (sb->sb_cc == 0)
     389#ifdef VBOX_WITH_SYNC_SLIRP
     390       RTSemMutexRelease(so->so_mutex);
     391#endif
    389392                        return 0;
    390393        }
  • trunk/src/VBox/Devices/Network/slirp/tcp_subr.c

    r13617 r13670  
    262262        DEBUG_CALL("tcp_close");
    263263        DEBUG_ARG("tp = %lx", (long )tp);
    264 #ifdef VBOX_WITH_SYNC_SLIRP
    265         /*sofree destrys so_mutex*/
    266         RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT);
    267 #endif
    268264
    269265        /* free the reassembly queue, if any */
     
    280276 */
    281277/*      free(tp, M_PCB);  */
     278#ifdef VBOX_WITH_SYNC_SLIRP
     279        RTSemMutexRequest(pData->tcb_mutex, RT_INDEFINITE_WAIT);
     280        /*sofree destrys so_mutex*/
     281        RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT);
     282#endif
    282283        u32ptr_done(pData, ptr_to_u32(pData, tp), tp);
    283284        free(tp);
     
    292293        sofree(pData, so);
    293294        tcpstat.tcps_closed++;
     295#ifdef VBOX_WITH_SYNC_SLIRP
     296        RTSemMutexRelease(pData->tcb_mutex);
     297#endif
    294298        return ((struct tcpcb *)0);
    295299}
  • trunk/src/VBox/Devices/Network/slirp/udp.c

    r13604 r13670  
    7777        DEBUG_ARG("m = %lx", (long)m);
    7878        DEBUG_ARG("iphlen = %d", iphlen);
     79#ifdef VBOX_WITH_SYNC_SLIRP
     80        int rc;
     81        rc = RTSemMutexRequest(m->m_mutex, RT_INDEFINITE_WAIT);
     82        AssertReleaseRC(rc);
     83#endif
    7984
    8085        udpstat.udps_ipackets++;
     
    156161         * Locate pcb for datagram.
    157162         */
     163#ifndef VBOX_WITH_SYNC_SLIRP
    158164        so = udp_last_so;
    159165        if (so->so_lport != uh->uh_sport ||
    160166            so->so_laddr.s_addr != ip->ip_src.s_addr) {
    161167                struct socket *tmp;
    162 
    163168                for (tmp = udb.so_next; tmp != &udb; tmp = tmp->so_next) {
     169#else
     170        rc = RTSemMutexRequest(pData->udp_last_so_mutex, RT_INDEFINITE_WAIT);
     171        AssertReleaseRC(rc);
     172
     173        so = udp_last_so;
     174        if (so != &udb) {
     175            rc = RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT);
     176            AssertReleaseRC(rc);
     177        }
     178
     179        rc = RTSemMutexRelease(pData->udp_last_so_mutex);
     180        AssertReleaseRC(rc);
     181
     182        if (so->so_lport != uh->uh_sport ||
     183            so->so_laddr.s_addr != ip->ip_src.s_addr) {
     184                struct socket *tmp;
     185                struct socket *tmp_next;
     186            if (so != &udb) {
     187                /*we don't interesting in this socket any more*/
     188                rc = RTSemMutexRelease(so->so_mutex);
     189                AssertReleaseRC(rc);
     190            }
     191            rc = RTSemMutexRequest(pData->udb_mutex, RT_INDEFINITE_WAIT);
     192            AssertReleaseRC(rc);
     193            tmp = udb.so_next;
     194
     195            while (1) {
     196                if (tmp == &udb) {
     197                    rc = RTSemMutexRelease(pData->udb_mutex);
     198                    AssertReleaseRC(rc);
     199                    break;
     200                }
     201                tmp_next = tmp->so_next;
     202                rc = RTSemMutexRequest(tmp->so_mutex, RT_INDEFINITE_WAIT);
     203                AssertReleaseRC(rc);
     204                rc = RTSemMutexRelease(pData->udb_mutex);
     205                AssertReleaseRC(rc);
     206#endif
    164207                        if (tmp->so_lport == uh->uh_sport &&
    165208                            tmp->so_laddr.s_addr == ip->ip_src.s_addr) {
     
    167210                                break;
    168211                        }
     212#ifdef VBOX_WITH_SYNC_SLIRP
     213                        rc = RTSemMutexRelease(tmp->so_mutex);
     214                        AssertReleaseRC(rc);
     215                        rc = RTSemMutexRequest(pData->udb_mutex, RT_INDEFINITE_WAIT);
     216                        AssertReleaseRC(rc);
     217                        tmp = tmp_next;
     218#endif
    169219                }
    170220                if (tmp == &udb) {
    171221                  so = NULL;
    172222                } else {
     223#ifdef VBOX_WITH_SYNC_SLIRP
     224                  rc = RTSemMutexRequest(pData->udp_last_so_mutex, RT_INDEFINITE_WAIT);
     225                  AssertReleaseRC(rc);
     226#endif
    173227                  udpstat.udpps_pcbcachemiss++;
    174228                  udp_last_so = so;
     229#ifdef VBOX_WITH_SYNC_SLIRP
     230                  rc = RTSemMutexRelease(pData->udp_last_so_mutex);
     231                  AssertReleaseRC(rc);
     232#endif
    175233                }
    176234        }
    177235
     236#ifndef VBOX_WITH_SYNC_SLIRP
    178237        if (so == NULL) {
     238#else
     239        if (so == NULL || so == &udb) {
     240#endif
    179241          /*
    180242           * If there's no socket for this packet,
     
    182244           */
    183245          if ((so = socreate()) == NULL) goto bad;
     246#ifdef VBOX_WITH_SYNC_SLIRP
     247          rc = RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT);
     248          AssertReleaseRC(rc);
     249#endif
    184250          if(udp_attach(pData, so) == -1) {
    185251            DEBUG_MISC((dfd," udp_attach errno = %d-%s\n",
     
    234300        so->so_m=m;         /* ICMP backup */
    235301
     302#ifdef VBOX_WITH_SYNC_SLIRP
     303        rc = RTSemMutexRelease(so->so_mutex);
     304        AssertReleaseRC(rc);
     305        rc = RTSemMutexRelease(m->m_mutex);
     306        AssertReleaseRC(rc);
     307#endif
    236308        return;
    237309bad:
    238310        m_freem(pData, m);
    239311        /* if (opts) m_freem(opts); */
     312#ifdef VBOX_WITH_SYNC_SLIRP
     313        if (m != NULL) {
     314            rc = RTSemMutexRelease(m->m_mutex);
     315            AssertReleaseRC(rc);
     316        }
     317#endif
    240318        return;
    241319}
     
    247325        register struct udpiphdr *ui;
    248326        int error = 0;
     327#ifdef VBOX_WITH_SYNC_SLIRP
     328        int rc;
     329        if(so != NULL) {
     330            rc = RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT);
     331            AssertReleaseRC(rc);
     332        }
     333        rc = RTSemMutexRequest(m->m_mutex, RT_INDEFINITE_WAIT);
     334        AssertReleaseRC(rc);
     335#endif
    249336
    250337        DEBUG_CALL("udp_output");
     
    292379
    293380        error = ip_output(pData, so, m);
    294 
     381#ifdef VBOX_WITH_SYNC_SLIRP
     382        if (so != NULL) rc = RTSemMutexRelease(so->so_mutex);
     383        rc = RTSemMutexRelease(m->m_mutex);
     384#endif
    295385        return (error);
    296386}
     
    300390{
    301391    struct sockaddr_in saddr, daddr;
     392#ifdef VBOX_WITH_SYNC_SLIRP
     393    int status;
     394    int rc;
     395    rc = RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT);
     396    AssertReleaseRC(rc);
     397#endif
    302398
    303399    saddr = *addr;
     
    316412    daddr.sin_port = so->so_lport;
    317413
     414#ifdef VBOX_WITH_SYNC_SLIRP
     415    status = udp_output2(pData, so, m, &saddr, &daddr, so->so_iptos);
     416    rc = RTSemMutexRelease(so->so_mutex);
     417    AssertReleaseRC(rc);
     418    return status;
     419#else
    318420    return udp_output2(pData, so, m, &saddr, &daddr, so->so_iptos);
     421#endif
    319422}
    320423
     
    323426{
    324427  struct sockaddr_in addr;
     428#ifdef VBOX_WITH_SYNC_SLIRP
     429    int rc;
     430    rc = RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT);
     431    AssertReleaseRC(rc);
     432#endif
    325433
    326434  if((so->s = socket(AF_INET,SOCK_DGRAM,0)) != -1) {
     
    337445      closesocket(so->s);
    338446      so->s=-1;
     447#ifdef VBOX_WITH_SYNC_SLIRP
     448     AssertRelease(so->s != -1);
     449#endif
    339450#ifdef _WIN32
    340451      WSASetLastError(lasterrno);
     
    348459      /* enable broadcast for later use */
    349460      setsockopt(so->s, SOL_SOCKET, SO_BROADCAST, (const char *)&opt, sizeof(opt));
     461#ifdef VBOX_WITH_SYNC_SLIRP
     462     rc = RTSemMutexRequest(pData->udb_mutex, RT_INDEFINITE_WAIT);
     463     AssertReleaseRC(rc);
     464#endif
    350465      insque(pData, so,&udb);
     466#ifdef VBOX_WITH_SYNC_SLIRP
     467     rc = RTSemMutexRelease(pData->udb_mutex);
     468     AssertReleaseRC(rc);
     469#endif
    351470    }
    352471  }
    353472#ifdef VBOX_WITH_SYNC_SLIRP
    354473  so->so_type = IPPROTO_UDP;
     474  rc = RTSemMutexRelease(so->so_mutex);
     475  AssertReleaseRC(rc);
    355476#endif
    356477  return(so->s);
     
    361482{
    362483        /* Correctly update list if detaching last socket in list. */
     484#ifdef VBOX_WITH_SYNC_SLIRP
     485        int rc;
     486        rc = RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT);
     487        AssertReleaseRC(rc);
     488        rc = RTSemMutexRequest(pData->udp_last_so_mutex, RT_INDEFINITE_WAIT);
     489        AssertReleaseRC(rc);
     490#endif
    363491        if (so == udp_last_so) udp_last_so = &udb;
     492#ifdef VBOX_WITH_SYNC_SLIRP
     493        rc = RTSemMutexRelease(pData->udp_last_so_mutex);
     494        AssertReleaseRC(rc);
     495#endif
    364496        closesocket(so->s);
    365497        /* if (so->so_m) m_free(so->so_m);    done by sofree */
     
    381513{
    382514        int i = 0;
     515#ifdef VBOX_WITH_SYNC_SLIRP
     516        int rc;
     517#endif
    383518
    384519        while(udptos[i].tos) {
    385520                if ((udptos[i].fport && ntohs(so->so_fport) == udptos[i].fport) ||
    386521                    (udptos[i].lport && ntohs(so->so_lport) == udptos[i].lport)) {
     522#ifdef VBOX_WITH_SYNC_SLIRP
     523                        rc = RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT);
     524                        AssertReleaseRC(rc);
     525#endif
    387526                        so->so_emu = udptos[i].emu;
     527#ifdef VBOX_WITH_SYNC_SLIRP
     528                        rc = RTSemMutexRelease(so->so_mutex);
     529                        AssertReleaseRC(rc);
     530#endif
    388531                        return udptos[i].tos;
    389532                }
     
    406549        struct sockaddr_in addr;
    407550        socklen_t addrlen = sizeof(addr);
     551#ifdef VBOX_WITH_SYNC_SLIRP
     552        int rc;
     553#endif
    408554#ifdef EMULATE_TALK
    409555        CTL_MSG_OLD *omsg;
     
    434580        uint16_t        pkt_len;                /* packet length */
    435581} *cu_head;
     582
     583#ifdef VBOX_WITH_SYNC_SLIRP
     584        rc = RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT);
     585        AssertReleaseRC(rc);
     586#define return \
     587                do {                                        \
     588                    int rc;                                 \
     589                    rc = RTSemMutexRelease(so->so_mutex);   \
     590                    AssertReleaseRC(rc);                    \
     591                    return;                                 \
     592                }while(0)
     593#endif
    436594
    437595        switch(so->so_emu) {
     
    625783                return;
    626784        }
     785#ifdef VBOX_WITH_SYNC_SLIRP
     786    return;
     787#undef return
     788#endif
    627789}
    628790
     
    634796        socklen_t addrlen = sizeof(struct sockaddr_in);
    635797        int opt = 1;
     798#ifdef VBOX_WITH_SYNC_SLIRP
     799        int rc;
     800#endif
    636801
    637802        if ((so = socreate()) == NULL) {
     
    641806        so->s = socket(AF_INET,SOCK_DGRAM,0);
    642807        so->so_expire = curtime + SO_EXPIRE;
     808#ifdef VBOX_WITH_SYNC_SLIRP
     809        rc = RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT);
     810        AssertReleaseRC(rc);
     811        rc = RTSemMutexRequest(pData->udb_mutex, RT_INDEFINITE_WAIT);
     812        AssertReleaseRC(rc);
     813#endif
    643814        insque(pData, so,&udb);
     815#ifdef VBOX_WITH_SYNC_SLIRP
     816        rc = RTSemMutexRelease(pData->udb_mutex);
     817        AssertReleaseRC(rc);
     818#endif
    644819
    645820        addr.sin_family = AF_INET;
     
    670845
    671846        so->so_state = SS_ISFCONNECTED;
     847#ifdef VBOX_WITH_SYNC_SLIRP
     848        rc = RTSemMutexRelease(so->so_mutex);
     849        AssertReleaseRC(rc);
     850#endif
    672851
    673852        return so;
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