Changeset 13704 in vbox
- Timestamp:
- Oct 31, 2008 6:48:25 AM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 38670
- Location:
- trunk/src/VBox/Devices/Network/slirp
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/slirp/ip_input.c
r13670 r13704 201 201 ip = ip_reass(pData, (struct ipasfrag *)ip, fp); 202 202 if (ip == 0) 203 #ifndef VBOX_WITH_SYNC_SLIRP 203 204 return; 205 #else 206 { 207 rc = RTSemMutexRelease(m->m_mutex); 208 AssertReleaseRC(rc); 209 return; 210 } 211 #endif 204 212 ipstat.ips_reassembled++; 213 #ifndef VBOX_WITH_SYNC_SLIRP 205 214 m = dtom(pData, ip); 215 #else 216 rc = RTSemMutexRelease(m->m_mutex); 217 AssertReleaseRC(rc); 218 m = dtom(pData, ip); 219 rc = RTSemMutexRequest(m->m_mutex, RT_INDEFINITE_WAIT); 220 AssertReleaseRC(rc); 221 #endif 206 222 } else 207 223 if (fp) -
trunk/src/VBox/Devices/Network/slirp/slirp.c
r13670 r13704 233 233 rc = RTSemMutexCreate(&pData->tcb_mutex); 234 234 AssertReleaseRC(rc); 235 rc = RTSemMutexCreate(&pData->tcp_last_so_mutex); 236 AssertReleaseRC(rc); 235 237 rc = RTSemMutexCreate(&pData->udb_mutex); 236 238 AssertReleaseRC(rc); … … 786 788 if_start(pData); 787 789 #else 788 #if 1790 #if 0 789 791 if (link_up) { 790 792 RTSemMutexRequest(pData->if_queued_mutex, RT_INDEFINITE_WAIT); -
trunk/src/VBox/Devices/Network/slirp/slirp_state.h
r13670 r13704 149 149 #ifdef VBOX_WITH_SYNC_SLIRP 150 150 /* 151 * tcp_last_so_mutex used for control access to tcp_last_so pointer 152 */ 153 RTSEMMUTEX tcp_last_so_mutex; 154 /* 151 155 * tcb_mutex used for control access to tcb queue of sockets 152 * servising TCP connections and tcp_last_so field156 * servising TCP connections 153 157 */ 154 158 RTSEMMUTEX tcb_mutex; -
trunk/src/VBox/Devices/Network/slirp/socket.c
r13670 r13704 104 104 } 105 105 else if (so->so_type == IPPROTO_TCP) { 106 RTSemMutexRequest(pData->tc b_mutex, RT_INDEFINITE_WAIT);106 RTSemMutexRequest(pData->tcp_last_so_mutex, RT_INDEFINITE_WAIT); 107 107 } 108 108 else { … … 122 122 } 123 123 else if (so->so_type == IPPROTO_TCP) { 124 RTSemMutexRelease(pData->tc b_mutex);124 RTSemMutexRelease(pData->tcp_last_so_mutex); 125 125 } 126 126 else { -
trunk/src/VBox/Devices/Network/slirp/tcp_input.c
r8009 r13704 246 246 DEBUG_ARGS((dfd," m = %8lx iphlen = %2d inso = %lx\n", 247 247 (long )m, iphlen, (long )inso )); 248 #ifdef VBOX_WITH_SYNC_SLIRP 249 #if 0 250 #define return \ 251 do { \ 252 fprintf(stderr, "%s:%d\n", __FILE__, __LINE__); \ 253 return; \ 254 }while(0) 255 #endif 256 257 int rc; 258 if (inso != NULL) { 259 rc = RTSemMutexRequest(inso->so_mutex, RT_INDEFINITE_WAIT); 260 AssertReleaseRC(rc); 261 } 262 #endif 248 263 249 264 /* … … 256 271 tp = sototcpcb(so); 257 272 m = so->so_m; 273 #ifdef VBOX_WITH_SYNC_SLIRP 274 rc = RTSemMutexRequest(m->m_mutex, RT_INDEFINITE_WAIT); 275 AssertReleaseRC(rc); 276 #endif 258 277 so->so_m = 0; 259 278 ti = so->so_ti; … … 263 282 goto cont_conn; 264 283 } 284 #ifdef VBOX_WITH_SYNC_SLIRP 285 rc = RTSemMutexRequest(m->m_mutex, RT_INDEFINITE_WAIT); 286 AssertReleaseRC(rc); 287 #endif 265 288 266 289 … … 356 379 */ 357 380 findso: 381 #ifdef VBOX_WITH_SYNC_SLIRP 382 rc = RTSemMutexRequest(pData->tcp_last_so_mutex, RT_INDEFINITE_WAIT); 383 AssertReleaseRC(rc); 384 #endif 358 385 so = tcp_last_so; 386 #ifdef VBOX_WITH_SYNC_SLIRP 387 /* this checking for making sure that we're not trying to hold mutex on head list*/ 388 if (tcp_last_so != &tcb) { 389 rc = RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT); 390 AssertReleaseRC(rc); 391 } 392 rc = RTSemMutexRelease(pData->tcp_last_so_mutex); 393 AssertReleaseRC(rc); 394 #endif 359 395 if (so->so_fport != ti->ti_dport || 360 396 so->so_lport != ti->ti_sport || 361 397 so->so_laddr.s_addr != ti->ti_src.s_addr || 362 398 so->so_faddr.s_addr != ti->ti_dst.s_addr) { 399 #ifndef VBOX_WITH_SYNC_SLIRP 363 400 so = solookup(&tcb, ti->ti_src, ti->ti_sport, 364 401 ti->ti_dst, ti->ti_dport); 365 402 if (so) 366 403 tcp_last_so = so; 404 #else 405 /*To make sure that we don't try to release mutex on head of the socket queue*/ 406 if (so != &tcb) { 407 rc = RTSemMutexRelease(so->so_mutex); 408 AssertReleaseRC(rc); 409 } 410 so = solookup(&tcb, ti->ti_src, ti->ti_sport, 411 ti->ti_dst, ti->ti_dport); 412 if (so) { 413 rc = RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT); 414 AssertReleaseRC(rc); 415 rc = RTSemMutexRequest(pData->tcp_last_so_mutex, RT_INDEFINITE_WAIT); 416 AssertReleaseRC(rc); 417 tcp_last_so = so; 418 rc = RTSemMutexRelease(pData->tcp_last_so_mutex); 419 AssertReleaseRC(rc); 420 } 421 #endif 367 422 ++tcpstat.tcps_socachemiss; 368 423 } … … 387 442 if ((so = socreate()) == NULL) 388 443 goto dropwithreset; 444 #ifdef VBOX_WITH_SYNC_SLIRP 445 rc = RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT); 446 AssertReleaseRC(rc); 447 #endif 389 448 if (tcp_attach(pData, so) < 0) { 449 #ifdef VBOX_WITH_SYNC_SLIRP 450 rc = RTSemMutexRelease(so->so_mutex); 451 AssertReleaseRC(rc); 452 rc = RTSemMutexDestroy(so->so_mutex); 453 AssertReleaseRC(rc); 454 #endif 390 455 free(so); /* Not sofree (if it failed, it's not insqued) */ 456 #ifdef VBOX_WITH_SYNC_SLIRP 457 so = NULL; 458 #endif 391 459 goto dropwithreset; 392 460 } … … 506 574 tp->snd_una = ti->ti_ack; 507 575 m_freem(pData, m); 576 #ifdef VBOX_WITH_SYNC_SLIRP 577 if (m != NULL) { 578 rc = RTSemMutexRelease(m->m_mutex); 579 AssertReleaseRC(rc); 580 } 581 #endif 508 582 509 583 /* … … 535 609 if (so->so_snd.sb_cc) 536 610 (void) tcp_output(pData, tp); 537 611 #ifdef VBOX_WITH_SYNC_SLIRP 612 rc = RTSemMutexRelease(so->so_mutex); 613 AssertReleaseRC(rc); 614 #endif 538 615 return; 539 616 } … … 575 652 tp->t_flags |= TF_ACKNOW; 576 653 tcp_output(pData, tp); 654 #ifdef VBOX_WITH_SYNC_SLIRP 655 rc = RTSemMutexRelease(so->so_mutex); 656 AssertReleaseRC(rc); 657 if (m != NULL) { 658 rc = RTSemMutexRelease(m->m_mutex); 659 AssertReleaseRC(rc); 660 } 661 #endif 577 662 return; 578 663 } … … 675 760 tp = tcp_close(pData, tp); 676 761 m_free(pData, m); 762 #ifdef VBOX_WITH_SYNC_SLIRP 763 if (m != NULL) { 764 rc = RTSemMutexRelease(m->m_mutex); 765 AssertReleaseRC(rc); 766 } 767 #endif 677 768 } else { 678 769 /* … … 687 778 tp->t_state = TCPS_SYN_RECEIVED; 688 779 } 780 #ifdef VBOX_WITH_SYNC_SLIRP 781 rc = RTSemMutexRelease(so->so_mutex); 782 AssertReleaseRC(rc); 783 if (m != NULL) { 784 rc = RTSemMutexRelease(m->m_mutex); 785 AssertReleaseRC(rc); 786 } 787 #endif 689 788 return; 690 789 … … 1444 1543 (void) tcp_output(pData, tp); 1445 1544 } 1545 #ifdef VBOX_WITH_SYNC_SLIRP 1546 rc = RTSemMutexRelease(so->so_mutex); 1547 AssertReleaseRC(rc); 1548 1549 if (m != NULL) { 1550 rc = RTSemMutexRelease(m->m_mutex); 1551 AssertReleaseRC(rc); 1552 } 1553 #endif 1446 1554 return; 1447 1555 … … 1456 1564 tp->t_flags |= TF_ACKNOW; 1457 1565 (void) tcp_output(pData, tp); 1566 #ifdef VBOX_WITH_SYNC_SLIRP 1567 rc = RTSemMutexRelease(so->so_mutex); 1568 AssertReleaseRC(rc); 1569 if (m != NULL) { 1570 rc = RTSemMutexRelease(m->m_mutex); 1571 AssertReleaseRC(rc); 1572 } 1573 #endif 1458 1574 return; 1459 1575 … … 1468 1584 } 1469 1585 1586 #ifdef VBOX_WITH_SYNC_SLIRP 1587 rc = RTSemMutexRelease(so->so_mutex); 1588 AssertReleaseRC(rc); 1589 if (m != NULL) { 1590 rc = RTSemMutexRelease(m->m_mutex); 1591 AssertReleaseRC(rc); 1592 } 1593 #endif 1470 1594 return; 1471 1595 … … 1475 1599 */ 1476 1600 m_free(pData, m); 1601 #ifdef VBOX_WITH_SYNC_SLIRP 1602 rc = RTSemMutexRelease(so->so_mutex); 1603 AssertReleaseRC(rc); 1604 if (m != NULL) { 1605 rc = RTSemMutexRelease(m->m_mutex); 1606 AssertReleaseRC(rc); 1607 } 1608 #endif 1477 1609 1478 1610 return; 1611 #ifdef VBOX_WITH_SYNC_SLIRP 1612 #undef return 1613 #endif 1479 1614 } 1480 1615 -
trunk/src/VBox/Devices/Network/slirp/tcp_subr.c
r13670 r13704 277 277 /* free(tp, M_PCB); */ 278 278 #ifdef VBOX_WITH_SYNC_SLIRP 279 RTSemMutexRequest(pData->tc b_mutex, RT_INDEFINITE_WAIT);279 RTSemMutexRequest(pData->tcp_last_so_mutex, RT_INDEFINITE_WAIT); 280 280 /*sofree destrys so_mutex*/ 281 281 RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT); … … 294 294 tcpstat.tcps_closed++; 295 295 #ifdef VBOX_WITH_SYNC_SLIRP 296 RTSemMutexRelease(pData->tc b_mutex);296 RTSemMutexRelease(pData->tcp_last_so_mutex); 297 297 #endif 298 298 return ((struct tcpcb *)0); … … 456 456 DEBUG_CALL("tcp_connect"); 457 457 DEBUG_ARG("inso = %lx", (long)inso); 458 #ifdef VBOX_WITH_SYNC_SLIRP 459 int rc; 460 rc = RTSemMutexRequest(pData->tcb_mutex, RT_INDEFINITE_WAIT); 461 AssertReleaseRC(rc); 462 rc = RTSemMutexRequest(inso->so_mutex, RT_INDEFINITE_WAIT); 463 AssertReleaseRC(rc); 464 #endif 458 465 459 466 /* … … 468 475 /* If it failed, get rid of the pending connection */ 469 476 closesocket(accept(inso->s,(struct sockaddr *)&addr,&addrlen)); 477 #ifdef VBOX_WITH_SYNC_SLIRP 478 rc = RTSemMutexRelease(inso->so_mutex); 479 AssertReleaseRC(rc); 480 rc = RTSemMutexRelease(pData->tcb_mutex); 481 AssertReleaseRC(rc); 482 #endif 470 483 return; 471 484 } 485 #ifdef VBOX_WITH_SYNC_SLIRP 486 rc = RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT); 487 AssertReleaseRC(rc); 488 #endif 472 489 if (tcp_attach(pData, so) < 0) { 490 #ifndef VBOX_WITH_SYNC_SLIRP 473 491 free(so); /* NOT sofree */ 492 #else 493 rc = RTSemMutexRelease(inso->so_mutex); 494 AssertReleaseRC(rc); 495 rc = RTSemMutexRelease(so->so_mutex); 496 AssertReleaseRC(rc); 497 RTSemMutexDestroy(so->so_mutex); 498 rc = RTSemMutexRelease(pData->tcb_mutex); 499 AssertReleaseRC(rc); 500 free(so); 501 so = NULL; 502 #endif 474 503 return; 475 504 } 505 #ifdef VBOX_WITH_SYNC_SLIRP 506 rc = RTSemMutexRelease(pData->tcb_mutex); 507 AssertReleaseRC(rc); 508 #endif 476 509 so->so_laddr = inso->so_laddr; 477 510 so->so_lport = inso->so_lport; … … 482 515 if ((s = accept(inso->s,(struct sockaddr *)&addr,&addrlen)) < 0) { 483 516 tcp_close(pData, sototcpcb(so)); /* This will sofree() as well */ 517 #ifdef VBOX_WITH_SYNC_SLIRP 518 if (so != inso) { 519 rc = RTSemMutexRelease(inso->so_mutex); 520 AssertReleaseRC(rc); 521 } 522 rc = RTSemMutexRelease(so->so_mutex); 523 AssertReleaseRC(rc); 524 #endif 484 525 return; 485 526 } … … 504 545 /* if it's not FACCEPTONCE, it's already NOFDREF */ 505 546 } 547 #ifdef VBOX_WITH_SYNC_SLIRP 548 if (so != inso) { 549 rc = RTSemMutexRelease(inso->so_mutex); 550 AssertReleaseRC(rc); 551 } 552 #endif 506 553 so->s = s; 507 554 … … 526 573 tcp_sendseqinit(tp); 527 574 tcp_output(pData, tp); 575 #ifdef VBOX_WITH_SYNC_SLIRP 576 rc = RTSemMutexRelease(so->so_mutex); 577 AssertReleaseRC(rc); 578 #endif 528 579 } 529 580 … … 537 588 return -1; 538 589 #ifdef VBOX_WITH_SYNC_SLIRP 590 int rc = RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT); 591 AssertReleaseRC(rc); 539 592 so->so_type = IPPROTO_TCP; 540 593 541 RTSemMutexRequest(pData->tcb_mutex, RT_INDEFINITE_WAIT); 594 rc = RTSemMutexRequest(pData->tcb_mutex, RT_INDEFINITE_WAIT); 595 AssertReleaseRC(rc); 542 596 insque(pData, so, &tcb); 543 RTSemMutexRelease(pData->tcb_mutex); 597 rc = RTSemMutexRelease(pData->tcb_mutex); 598 AssertReleaseRC(rc); 599 600 rc = RTSemMutexRelease(so->so_mutex); 601 AssertReleaseRC(rc); 544 602 #else 545 603 insque(pData, so, &tcb); -
trunk/src/VBox/Devices/Network/slirp/udp.c
r13670 r13704 498 498 499 499 sofree(pData, so); 500 #ifdef VBOX_WITH_SYNC_SLIRP 501 if (so != NULL) { 502 rc = RTSemMutexRelease(so->so_mutex); 503 AssertReleaseRC(rc); 504 } 505 #endif 500 506 } 501 507 … … 824 830 if (bind(so->s,(struct sockaddr *)&addr, addrlen) < 0) { 825 831 udp_detach(pData, so); 832 #ifdef VBOX_WITH_SYNC_SLIRP 833 rc = RTSemMutexRelease(so->so_mutex); 834 AssertReleaseRC(rc); 835 #endif 826 836 return NULL; 827 837 }
Note:
See TracChangeset
for help on using the changeset viewer.