Changeset 13733 in vbox
- Timestamp:
- Nov 2, 2008 7:09:23 AM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 38704
- Location:
- trunk/src/VBox/Devices/Network/slirp
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/slirp/if.c
r13670 r13733 48 48 if_comp = IF_AUTOCOMP; 49 49 if_fastq.ifq_next = if_fastq.ifq_prev = &if_fastq; 50 #ifdef VBOX_WITH_SYNC_SLIRP 51 RTSemMutexCreate(&pData->if_fastq_mutex); 52 RTSemMutexCreate(&if_fastq.m_mutex); 53 #endif 50 51 VBOX_SLIRP_LOCK_CREATE(&pData->if_fastq_mutex); 52 VBOX_SLIRP_LOCK_CREATE(&if_fastq.m_mutex); 54 53 55 54 if_batchq.ifq_next = if_batchq.ifq_prev = &if_batchq; 56 #ifdef VBOX_WITH_SYNC_SLIRP 57 RTSemMutexCreate(&pData->if_batchq_mutex);58 RTSemMutexCreate(&if_batchq.m_mutex);59 #endif 55 56 VBOX_SLIRP_LOCK_CREATE(&pData->if_batchq_mutex); 57 VBOX_SLIRP_LOCK_CREATE(&if_batchq.m_mutex); 58 60 59 /* sl_compress_init(&comp_s); */ 61 60 next_m = &if_batchq; … … 166 165 DEBUG_ARG("so = %lx", (long)so); 167 166 DEBUG_ARG("ifm = %lx", (long)ifm); 168 #ifdef VBOX_WITH_SYNC_SLIRP 169 if (so != NULL) 170 RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT); 171 #endif 167 168 if (so != NULL) VBOX_SLIRP_LOCK(so->so_mutex); 172 169 173 170 /* … … 176 173 * XXX Shouldn't need this, gotta change dtom() etc. 177 174 */ 178 #ifdef VBOX_WITH_SYNC_SLIRP 179 RTSemMutexRequest(pData->m_usedlist_mutex, RT_INDEFINITE_WAIT); 180 RTSemMutexRequest(ifm->m_mutex, RT_INDEFINITE_WAIT); 181 #endif 175 VBOX_SLIRP_LOCK(pData->m_usedlist_mutex); 176 VBOX_SLIRP_LOCK(ifm->m_mutex); 177 182 178 if (ifm->m_flags & M_USEDLIST) { 183 179 remque(pData, ifm); 184 180 ifm->m_flags &= ~M_USEDLIST; 185 181 } 186 #ifdef VBOX_WITH_SYNC_SLIRP 187 RTSemMutexRelease(pData->m_usedlist_mutex); 188 #endif 182 VBOX_SLIRP_UNLOCK(pData->m_usedlist_mutex); 189 183 190 184 /* … … 195 189 * XXX add cache here? 196 190 */ 191 VBOX_SLIRP_LOCK(pData->if_batchq_mutex); 197 192 #ifndef VBOX_WITH_SYNC_SLIRP 198 193 for (ifq = if_batchq.ifq_prev; ifq != &if_batchq; ifq = ifq->ifq_prev) { 199 194 #else 200 RTSemMutexRequest(pData->if_batchq_mutex, RT_INDEFINITE_WAIT);201 195 ifq = if_batchq.ifq_prev; 202 196 while(1){ 203 197 if (ifq == &if_batchq) { 204 RTSemMutexRelease(pData->if_batchq_mutex);198 VBOX_SLIRP_UNLOCK(pData->if_batchq_mutex); 205 199 break; 206 200 } 207 201 ifqprev = ifq->ifq_prev; 208 RTSemMutexRequest(ifq->m_mutex, RT_INDEFINITE_WAIT); 209 RTSemMutexRelease(pData->if_batchq_mutex);210 #endif 211 202 #endif 203 VBOX_SLIRP_LOCK(ifq->m_mutex); 204 VBOX_SLIRP_UNLOCK(pData->if_batchq_mutex); 205 if (so == ifq->ifq_so) { 212 206 /* A match! */ 213 207 ifm->ifq_so = so; 214 208 ifs_insque(ifm, ifq->ifs_prev); 215 209 goto diddit; 216 217 #ifdef VBOX_WITH_SYNC_SLIRP 218 RTSemMutexRelease(ifq->m_mutex);219 RTSemMutexRequest(pData->if_batchq_mutex, RT_INDEFINITE_WAIT); 210 } 211 VBOX_SLIRP_UNLOCK(ifq->m_mutex); 212 VBOX_SLIRP_LOCK(pData->if_batchq_mutex); 213 #ifdef VBOX_WITH_SYNC_SLIRP 220 214 ifq = ifqprev; 221 215 #endif … … 224 218 /* No match, check which queue to put it on */ 225 219 if (so && (so->so_iptos & IPTOS_LOWDELAY)) { 226 #ifdef VBOX_WITH_SYNC_SLIRP 227 RTSemMutexRequest(pData->if_fastq_mutex, RT_INDEFINITE_WAIT); 228 #endif 220 VBOX_SLIRP_LOCK(pData->if_fastq_mutex); 229 221 ifq = if_fastq.ifq_prev; 230 #ifdef VBOX_WITH_SYNC_SLIRP 231 RTSemMutexRequest(ifq->m_mutex, RT_INDEFINITE_WAIT); 232 RTSemMutexRelease(pData->if_fastq_mutex); 233 #endif 222 VBOX_SLIRP_LOCK(ifq->m_mutex); 223 VBOX_SLIRP_UNLOCK(pData->if_fastq_mutex); 234 224 on_fastq = 1; 235 225 /* … … 244 234 } 245 235 else { 246 #ifdef VBOX_WITH_SYNC_SLIRP 247 RTSemMutexRequest(pData->if_batchq_mutex, RT_INDEFINITE_WAIT); 248 #endif 236 VBOX_SLIRP_LOCK(pData->if_batchq_mutex); 249 237 ifq = if_batchq.ifq_prev; 250 #ifdef VBOX_WITH_SYNC_SLIRP 251 RTSemMutexRequest(ifq->m_mutex, RT_INDEFINITE_WAIT); 252 RTSemMutexRelease(pData->if_batchq_mutex); 253 #endif 238 VBOX_SLIRP_LOCK(ifq->m_mutex); 239 VBOX_SLIRP_UNLOCK(pData->if_batchq_mutex); 254 240 } 255 241 … … 260 246 261 247 diddit: 262 #ifdef VBOX_WITH_SYNC_SLIRP 263 RTSemMutexRequest(pData->if_queued_mutex, RT_INDEFINITE_WAIT); 264 #endif 248 VBOX_SLIRP_LOCK(pData->if_queued_mutex); 249 265 250 ++if_queued; 266 #ifdef VBOX_WITH_SYNC_SLIRP 267 RTSemMutexRelease(pData->if_queued_mutex); 268 #endif 251 252 VBOX_SLIRP_UNLOCK(pData->if_queued_mutex); 269 253 270 254 if (so) { … … 282 266 (so->so_nqueued - so->so_queued) >= 3)) { 283 267 284 #ifdef VBOX_WITH_SYNC_SLIRP 285 RTSemMutexRequest(pData->if_fastq_mutex, RT_INDEFINITE_WAIT); 286 #endif 268 VBOX_SLIRP_LOCK(pData->if_fastq_mutex); 287 269 /* Remove from current queue... */ 288 270 remque(pData, ifm->ifs_next); 289 #ifdef VBOX_WITH_SYNC_SLIRP 290 RTSemMutexRelease(pData->if_fastq_mutex); 291 RTSemMutexRequest(pData->if_batchq_mutex, RT_INDEFINITE_WAIT); 292 #endif 271 272 VBOX_SLIRP_UNLOCK(pData->if_fastq_mutex); 273 VBOX_SLIRP_LOCK(pData->if_batchq_mutex); 293 274 294 275 /* ...And insert in the new. That'll teach ya! */ 295 276 insque(pData, ifm->ifs_next, &if_batchq); 296 #ifdef VBOX_WITH_SYNC_SLIRP 297 RTSemMutexRelease(pData->if_batchq_mutex); 298 #endif 277 VBOX_SLIRP_UNLOCK(pData->if_batchq_mutex); 299 278 } 300 #ifdef VBOX_WITH_SYNC_SLIRP 301 RTSemMutexRelease(so->so_mutex); 302 #endif 303 } 304 #ifdef VBOX_WITH_SYNC_SLIRP 305 RTSemMutexRelease(ifq->m_mutex); 306 RTSemMutexRelease(ifm->m_mutex); 307 #endif 279 VBOX_SLIRP_UNLOCK(so->so_mutex); 280 } 281 VBOX_SLIRP_UNLOCK(ifq->m_mutex); 282 VBOX_SLIRP_UNLOCK(ifm->m_mutex); 308 283 309 284 #ifndef FULL_BOLT … … 341 316 DEBUG_CALL("if_start"); 342 317 343 #ifdef VBOX_WITH_SYNC_SLIRP 344 RTSemMutexRequest(pData->if_queued_mutex, RT_INDEFINITE_WAIT); 345 #endif 318 VBOX_SLIRP_LOCK(pData->if_queued_mutex); 346 319 if (if_queued <= 0) { 347 #ifdef VBOX_WITH_SYNC_SLIRP 348 RTSemMutexRelease(pData->if_queued_mutex); 349 #endif 320 VBOX_SLIRP_UNLOCK(pData->if_queued_mutex); 350 321 return; /* Nothing to do */ 351 322 } 352 323 353 324 again: 354 #ifdef VBOX_WITH_SYNC_SLIRP 355 RTSemMutexRelease(pData->if_queued_mutex); 356 #endif 325 VBOX_SLIRP_UNLOCK(pData->if_queued_mutex); 326 357 327 /* check if we can really output */ 358 328 if (!slirp_can_output(pData->pvUser)) … … 363 333 * If there's something in the fastq, select it immediately 364 334 */ 365 #ifdef VBOX_WITH_SYNC_SLIRP 366 RTSemMutexRequest(pData->if_fastq_mutex, RT_INDEFINITE_WAIT); 367 #endif 335 VBOX_SLIRP_LOCK(pData->if_fastq_mutex); 368 336 if (if_fastq.ifq_next != &if_fastq) { 369 337 ifm = if_fastq.ifq_next; 370 338 #ifdef VBOX_WITH_SYNC_SLIRP 371 339 on_fast = 1; 372 RTSemMutexRequest(ifm->m_mutex, RT_INDEFINITE_WAIT); 373 #endif 340 #endif 341 VBOX_SLIRP_LOCK(ifm->m_mutex); 374 342 } else { 375 #ifdef VBOX_WITH_SYNC_SLIRP 376 RTSemMutexRelease(pData->if_fastq_mutex); 377 378 RTSemMutexRequest(pData->if_batchq_mutex, RT_INDEFINITE_WAIT); 379 RTSemMutexRequest(pData->next_m_mutex, RT_INDEFINITE_WAIT); 380 #endif 343 VBOX_SLIRP_UNLOCK(pData->if_fastq_mutex); 344 345 VBOX_SLIRP_LOCK(pData->if_batchq_mutex); 346 VBOX_SLIRP_LOCK(pData->next_m_mutex); 381 347 /* Nothing on fastq, see if next_m is valid */ 382 348 if (next_m != &if_batchq) … … 387 353 /* Set which packet to send on next iteration */ 388 354 next_m = ifm->ifq_next; 389 #ifdef VBOX_WITH_SYNC_SLIRP 390 RTSemMutexRelease(pData->next_m_mutex); 391 #endif 392 } 393 #ifdef VBOX_WITH_SYNC_SLIRP 394 RTSemMutexRequest(ifm->m_mutex, RT_INDEFINITE_WAIT); 395 RTSemMutexRequest(pData->if_queued_mutex, RT_INDEFINITE_WAIT); 355 VBOX_SLIRP_UNLOCK(pData->next_m_mutex); 356 } 357 #ifdef VBOX_WITH_SYNC_SLIRP 358 VBOX_SLIRP_LOCK(ifm->m_mutex); 359 VBOX_SLIRP_LOCK(pData->if_queued_mutex); 396 360 if (if_queued == 0) { 397 361 if (on_fast) { 398 RTSemMutexRelease(pData->if_fastq_mutex);362 VBOX_SLIRP_UNLOCK(pData->if_fastq_mutex); 399 363 }else { 400 RTSemMutexRelease(pData->if_batchq_mutex);364 VBOX_SLIRP_UNLOCK(pData->if_batchq_mutex); 401 365 } 402 366 goto done; … … 409 373 --if_queued; 410 374 #ifdef VBOX_WITH_SYNC_SLIRP 411 RTSemMutexRelease(pData->if_queued_mutex);375 VBOX_SLIRP_UNLOCK(pData->if_queued_mutex); 412 376 if (on_fast == 1) { 413 RTSemMutexRelease(pData->if_fastq_mutex);377 VBOX_SLIRP_UNLOCK(pData->if_fastq_mutex); 414 378 } 415 379 else { 416 RTSemMutexRelease(pData->if_batchq_mutex);380 VBOX_SLIRP_UNLOCK(pData->if_batchq_mutex); 417 381 } 418 382 #endif … … 426 390 /* Update so_queued */ 427 391 if (ifm->ifq_so) { 428 #ifdef VBOX_WITH_SYNC_SLIRP 429 RTSemMutexRequest(ifm->ifq_so->so_mutex, RT_INDEFINITE_WAIT); 430 #endif 392 VBOX_SLIRP_LOCK(ifm->ifq_so->so_mutex); 431 393 if (--ifm->ifq_so->so_queued == 0) 432 394 /* If there's no more queued, reset nqueued */ 433 395 ifm->ifq_so->so_nqueued = 0; 434 #ifdef VBOX_WITH_SYNC_SLIRP 435 RTSemMutexRelease(ifm->ifq_so->so_mutex); 436 #endif 396 VBOX_SLIRP_UNLOCK(ifm->ifq_so->so_mutex); 437 397 } 438 398 … … 442 402 m_free(pData, ifm); 443 403 444 #ifdef VBOX_WITH_SYNC_SLIRP 445 if (ifm != NULL) RTSemMutexRelease(ifm->m_mutex); 446 RTSemMutexRequest(pData->if_queued_mutex, RT_INDEFINITE_WAIT); 404 if (ifm != NULL)VBOX_SLIRP_UNLOCK(ifm->m_mutex); 405 VBOX_SLIRP_LOCK(pData->if_queued_mutex); 447 406 /*We release if_queued_mutex after again label and before return*/ 448 #endif 407 449 408 if (if_queued > 0) 450 409 goto again; 451 #ifdef VBOX_WITH_SYNC_SLIRP452 410 done: 453 RTSemMutexRelease(pData->if_queued_mutex); 454 #endif 455 } 411 VBOX_SLIRP_UNLOCK(pData->if_queued_mutex); 412 } -
trunk/src/VBox/Devices/Network/slirp/slirp.c
r13727 r13733 566 566 #ifndef VBOX_WITH_SYNC_SLIRP 567 567 for (so = tcb.so_next; so != &tcb; so = so_next) { 568 so_next = so->so_next; 568 569 #else 569 570 while (1) { … … 572 573 break; 573 574 } 574 #endif575 575 so_next = so->so_next; 576 577 AssertRelease(so->so_mutex != NULL); 578 AssertRelease(so->so_next != NULL && so->so_prev != NULL); 579 #endif 576 580 VBOX_SLIRP_LOCK(so->so_mutex); 577 581 VBOX_SLIRP_UNLOCK(pData->tcb_mutex); -
trunk/src/VBox/Devices/Network/slirp/socket.c
r13727 r13733 113 113 udp_last_so = &udb; 114 114 115 if(so->so_next && so->so_prev) 115 AssertRelease(so->so_next != NULL && so->so_prev != NULL); 116 if(so->so_next && so->so_prev) { 116 117 remque(pData, so); /* crashes if so is not in a queue */ 118 } 119 #ifdef VBOX_SLIRP_LOCK 120 else { 121 Assert(!"shouldn't happens"); 122 } 123 #endif 117 124 118 125 if (so->so_type == IPPROTO_UDP) { … … 679 686 if ((so->so_tcpcb = tcp_newtcpcb(pData, so)) == NULL) { 680 687 free(so); 688 #ifdef VBOX_SLIRP_UNLOCK 689 so = NULL; 690 #endif 681 691 return NULL; 682 692 } -
trunk/src/VBox/Devices/Network/slirp/tcp_input.c
r13710 r13733 424 424 goto dropwithreset; 425 425 426 if (inso != NULL) VBOX_SLIRP_UNLOCK(inso->so_mutex); 426 427 VBOX_SLIRP_LOCK(so->so_mutex); 427 428 if (tcp_attach(pData, so) < 0) { -
trunk/src/VBox/Devices/Network/slirp/tcp_subr.c
r13704 r13733 276 276 */ 277 277 /* free(tp, M_PCB); */ 278 #ifdef VBOX_WITH_SYNC_SLIRP 279 RTSemMutexRequest(pData->tcp_last_so_mutex, RT_INDEFINITE_WAIT); 280 /*sofree destrys so_mutex*/ 281 RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT); 282 #endif 278 VBOX_SLIRP_LOCK(so->so_mutex); 279 283 280 u32ptr_done(pData, ptr_to_u32(pData, tp), tp); 284 281 free(tp); 285 282 so->so_tcpcb = 0; 286 283 soisfdisconnected(so); 284 VBOX_SLIRP_LOCK(pData->tcp_last_so_mutex); 287 285 /* clobber input socket cache if we're closing the cached connection */ 288 286 if (so == tcp_last_so) 289 287 tcp_last_so = &tcb; 288 VBOX_SLIRP_UNLOCK(pData->tcp_last_so_mutex); 290 289 closesocket(so->s); 291 290 sbfree(&so->so_rcv); 292 291 sbfree(&so->so_snd); 293 292 sofree(pData, so); 293 if(so != NULL) VBOX_SLIRP_LOCK(so->so_mutex); 294 294 tcpstat.tcps_closed++; 295 #ifdef VBOX_WITH_SYNC_SLIRP296 RTSemMutexRelease(pData->tcp_last_so_mutex);297 #endif298 295 return ((struct tcpcb *)0); 299 296 } … … 456 453 DEBUG_CALL("tcp_connect"); 457 454 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 455 VBOX_SLIRP_LOCK(inso->so_mutex); 465 456 466 457 /* … … 472 463 so = inso; 473 464 } else { 465 VBOX_SLIRP_UNLOCK(inso->so_mutex); 474 466 if ((so = socreate()) == NULL) { 475 467 /* If it failed, get rid of the pending connection */ 476 468 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 469 VBOX_SLIRP_UNLOCK(inso->so_mutex); 483 470 return; 484 471 } 485 #ifdef VBOX_WITH_SYNC_SLIRP 486 rc = RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT); 487 AssertReleaseRC(rc); 488 #endif 472 VBOX_SLIRP_LOCK(so->so_mutex); 489 473 if (tcp_attach(pData, so) < 0) { 490 #ifndef VBOX_WITH_SYNC_SLIRP 474 if(so != NULL) VBOX_SLIRP_UNLOCK(so->so_mutex); 491 475 free(so); /* NOT sofree */ 492 #else493 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 #endif503 476 return; 504 477 } 505 #ifdef VBOX_WITH_SYNC_SLIRP506 rc = RTSemMutexRelease(pData->tcb_mutex);507 AssertReleaseRC(rc);508 #endif509 478 so->so_laddr = inso->so_laddr; 510 479 so->so_lport = inso->so_lport; … … 515 484 if ((s = accept(inso->s,(struct sockaddr *)&addr,&addrlen)) < 0) { 516 485 tcp_close(pData, sototcpcb(so)); /* This will sofree() as well */ 517 #ifdef VBOX_WITH_SYNC_SLIRP518 486 if (so != inso) { 519 rc = RTSemMutexRelease(inso->so_mutex); 520 AssertReleaseRC(rc); 487 VBOX_SLIRP_UNLOCK(inso->so_mutex); 521 488 } 522 rc = RTSemMutexRelease(so->so_mutex); 523 AssertReleaseRC(rc); 524 #endif 489 VBOX_SLIRP_UNLOCK(so->so_mutex); 525 490 return; 526 491 } … … 545 510 /* if it's not FACCEPTONCE, it's already NOFDREF */ 546 511 } 547 #ifdef VBOX_WITH_SYNC_SLIRP548 512 if (so != inso) { 549 rc = RTSemMutexRelease(inso->so_mutex); 550 AssertReleaseRC(rc); 513 VBOX_SLIRP_UNLOCK(inso->so_mutex); 551 514 } 552 #endif553 515 so->s = s; 554 516 … … 573 535 tcp_sendseqinit(tp); 574 536 tcp_output(pData, tp); 575 #ifdef VBOX_WITH_SYNC_SLIRP 576 rc = RTSemMutexRelease(so->so_mutex); 577 AssertReleaseRC(rc); 578 #endif 537 VBOX_SLIRP_UNLOCK(so->so_mutex); 579 538 } 580 539 … … 585 544 tcp_attach(PNATState pData, struct socket *so) 586 545 { 587 if ((so->so_tcpcb = tcp_newtcpcb(pData, so)) == NULL) 546 if ((so->so_tcpcb = tcp_newtcpcb(pData, so)) == NULL){ 588 547 return -1; 548 } 549 550 551 VBOX_SLIRP_LOCK(pData->tcb_mutex); 552 VBOX_SLIRP_LOCK(so->so_mutex); 553 insque(pData, so, &tcb); 554 VBOX_SLIRP_UNLOCK(pData->tcb_mutex); 555 589 556 #ifdef VBOX_WITH_SYNC_SLIRP 590 int rc = RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT); 591 AssertReleaseRC(rc); 557 /*we use this field to identify cache socket to lock/unlock*/ 592 558 so->so_type = IPPROTO_TCP; 593 594 rc = RTSemMutexRequest(pData->tcb_mutex, RT_INDEFINITE_WAIT);595 AssertReleaseRC(rc);596 insque(pData, so, &tcb);597 rc = RTSemMutexRelease(pData->tcb_mutex);598 AssertReleaseRC(rc);599 600 rc = RTSemMutexRelease(so->so_mutex);601 AssertReleaseRC(rc);602 #else603 insque(pData, so, &tcb);604 559 #endif 605 560 561 VBOX_SLIRP_UNLOCK(so->so_mutex); 606 562 return 0; 607 563 }
Note:
See TracChangeset
for help on using the changeset viewer.