Changeset 13604 in vbox for trunk/src/VBox/Devices
- Timestamp:
- Oct 28, 2008 4:47:11 AM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 38512
- Location:
- trunk/src/VBox/Devices
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Makefile.kmk
r13435 r13604 531 531 ifdef VBOX_WITH_NETFLT 532 532 Drivers_DEFS = VBOX_WITH_NETFLT 533 endif 534 ifdef VBOX_WITH_SYNC_SLIRP 535 Drivers_DEFS = VBOX_WITH_SYNC_SLIRP 533 536 endif 534 537 Drivers_INCS := \ -
trunk/src/VBox/Devices/Network/DrvNAT.cpp
r13237 r13604 56 56 #ifdef VBOX_NAT_SOURCES 57 57 #include "Network/nat/nat.h" 58 #endif 59 60 #ifdef VBOX_WITH_SYNC_SLIRP 61 #include <iprt/semaphore.h> 58 62 #endif 59 63 … … 87 91 /** Boot file name to provide in the DHCP server response. */ 88 92 char *pszBootFile; 93 #ifdef VBOX_WITH_SYNC_SLIRP 94 /*polling thread*/ 95 PPDMTHREAD pThread; 96 /*used for wakep of poling thread*/ 97 RTSEMEVENT semIOmutex; 98 #endif 89 99 } DRVNAT, *PDRVNAT; 90 100 … … 143 153 pvBuf, cb, cb, pvBuf)); 144 154 155 #ifndef VBOX_WITH_SYNC_SLIRP 145 156 int rc = RTCritSectEnter(&pThis->CritSect); 146 157 AssertReleaseRC(rc); 158 #endif 147 159 148 160 Assert(pThis->enmLinkState == PDMNETWORKLINKSTATE_UP); … … 154 166 #endif 155 167 } 168 #ifndef VBOX_WITH_SYNC_SLIRP 156 169 RTCritSectLeave(&pThis->CritSect); 170 #endif 157 171 LogFlow(("drvNATSend: end\n")); 158 172 return VINF_SUCCESS; … … 190 204 LogFlow(("drvNATNotifyLinkChanged: enmLinkState=%d\n", enmLinkState)); 191 205 206 #ifndef VBOX_WITH_SYNC_SLIRP 192 207 int rc = RTCritSectEnter(&pThis->CritSect); 193 208 AssertReleaseRC(rc); 209 #endif 194 210 pThis->enmLinkState = enmLinkState; 195 211 … … 214 230 AssertMsgFailed(("drvNATNotifyLinkChanged: unexpected link state %d\n", enmLinkState)); 215 231 } 232 #ifndef VBOX_WITH_SYNC_SLIRP 216 233 RTCritSectLeave(&pThis->CritSect); 234 #endif 217 235 } 218 236 … … 221 239 * Poller callback. 222 240 */ 241 #ifndef VBOX_WITH_SYNC_SLIRP 223 242 static DECLCALLBACK(void) drvNATPoller(PPDMDRVINS pDrvIns) 224 243 { … … 254 273 RTCritSectLeave(&pThis->CritSect); 255 274 } 275 #else 276 277 static DECLCALLBACK(int) drvNATAsyncIoThread(PPDMDRVINS pDrvIns, PPDMTHREAD pThread) 278 { 279 PDRVNAT pThis = PDMINS_2_DATA(pDrvIns, PDRVNAT); 280 fd_set ReadFDs; 281 fd_set WriteFDs; 282 fd_set XcptFDs; 283 int cFDs = -1; 284 int rc; 285 286 LogFlow(("drvNATAsyncIoThread: pThis=%p\n", pThis)); 287 288 289 if (pThread->enmState == PDMTHREADSTATE_INITIALIZING) 290 return VINF_SUCCESS; 291 /* 292 * Polling loop. 293 */ 294 while (pThread->enmState == PDMTHREADSTATE_RUNNING) 295 { 296 FD_ZERO(&ReadFDs); 297 FD_ZERO(&WriteFDs); 298 FD_ZERO(&XcptFDs); 299 cFDs = -1; 300 301 slirp_select_fill(pThis->pNATState, &cFDs, &ReadFDs, &WriteFDs, &XcptFDs); 302 303 struct timeval tv = {0, 0}; /* no wait */ 304 305 int cReadFDs = select(cFDs + 1, &ReadFDs, &WriteFDs, &XcptFDs, &tv); 306 307 if (cReadFDs >= 0) 308 slirp_select_poll(pThis->pNATState, &ReadFDs, &WriteFDs, &XcptFDs); 309 310 #if 0 311 if (cReadFDs == 0) { 312 rc = RTSemEventWait(pThis->semIOmutex, RT_INDEFINITE_WAIT); 313 AssertReleaseRC(rc); 314 } 315 #endif 316 } 317 318 } 319 /** 320 * Unblock the send thread so it can respond to a state change. 321 * 322 * @returns VBox status code. 323 * @param pDevIns The pcnet device instance. 324 * @param pThread The send thread. 325 */ 326 static DECLCALLBACK(int) drvNATAsyncIoWakeup(PPDMDRVINS pDrvIns, PPDMTHREAD pThread) 327 { 328 #if 0 329 PDRVNAT pThis = PDMINS_2_DATA(pDrvIns, PDRVNAT); 330 int rc = RTSemEventSignal(pThis->semIOmutex); 331 AssertReleaseRC(rc); 332 #endif 333 return (VINF_SUCCESS); 334 } 335 336 #endif 256 337 257 338 #ifndef VBOX_NAT_SOURCES … … 267 348 Assert(pThis); 268 349 350 #ifndef VBOX_WITH_SYNC_SLIRP 269 351 /** Happens during termination */ 270 352 if (!RTCritSectIsOwner(&pThis->CritSect)) 271 353 return 0; 354 #endif 272 355 273 356 int rc = pThis->pPort->pfnWaitReceiveAvail(pThis->pPort, 0); … … 291 374 Assert(pThis); 292 375 376 #ifndef VBOX_WITH_SYNC_SLIRP 293 377 /** Happens during termination */ 294 378 if (!RTCritSectIsOwner(&pThis->CritSect)) 295 379 return; 380 #endif 296 381 297 382 int rc = pThis->pPort->pfnReceive(pThis->pPort, pu8Buf, cb); … … 591 676 NULL, NULL, NULL, NULL, NULL, drvNATLoadDone); 592 677 AssertRC(rc2); 678 #ifndef VBOX_WITH_SYNC_SLIRP 593 679 pDrvIns->pDrvHlp->pfnPDMPollerRegister(pDrvIns, drvNATPoller); 680 #else 681 rc = RTSemEventCreate(&pThis->semIOmutex); 682 AssertReleaseRC(rc); 683 rc = PDMDrvHlpPDMThreadCreate(pDrvIns, &pThis->pThread, pThis, drvNATAsyncIoThread, drvNATAsyncIoWakeup, 128 * _1K, RTTHREADTYPE_IO, "NAT"); 684 AssertReleaseRC(rc); 685 #endif 594 686 595 687 pThis->enmLinkState = PDMNETWORKLINKSTATE_UP; -
trunk/src/VBox/Devices/Network/slirp/if.c
r1076 r13604 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 54 50 55 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 51 60 /* sl_compress_init(&comp_s); */ 52 61 next_m = &if_batchq; … … 149 158 { 150 159 struct mbuf *ifq; 160 #ifdef VBOX_WITH_SYNC_SLIRP 161 struct mbuf *ifqprev; 162 #endif 151 163 int on_fastq = 1; 152 164 … … 154 166 DEBUG_ARG("so = %lx", (long)so); 155 167 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 156 172 157 173 /* … … 160 176 * XXX Shouldn't need this, gotta change dtom() etc. 161 177 */ 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 162 182 if (ifm->m_flags & M_USEDLIST) { 163 183 remque(pData, ifm); 164 184 ifm->m_flags &= ~M_USEDLIST; 165 185 } 186 #ifdef VBOX_WITH_SYNC_SLIRP 187 RTSemMutexRelease(pData->m_usedlist_mutex); 188 #endif 166 189 167 190 /* … … 172 195 * XXX add cache here? 173 196 */ 197 #ifndef VBOX_WITH_SYNC_SLIRP 174 198 for (ifq = if_batchq.ifq_prev; ifq != &if_batchq; ifq = ifq->ifq_prev) { 199 #else 200 RTSemMutexRequest(pData->if_batchq_mutex, RT_INDEFINITE_WAIT); 201 ifq = if_batchq.ifq_prev; 202 while(1){ 203 if (ifq == &if_batchq) { 204 RTSemMutexRelease(pData->if_batchq_mutex); 205 break; 206 } 207 ifqprev = ifq->ifq_prev; 208 RTSemMutexRequest(ifq->m_mutex, RT_INDEFINITE_WAIT); 209 RTSemMutexRelease(pData->if_batchq_mutex); 210 #endif 175 211 if (so == ifq->ifq_so) { 176 212 /* A match! */ … … 179 215 goto diddit; 180 216 } 217 #ifdef VBOX_WITH_SYNC_SLIRP 218 RTSemMutexRequest(pData->if_batchq_mutex, RT_INDEFINITE_WAIT); 219 RTSemMutexRelease(ifq->m_mutex); 220 ifq = ifqprev; 221 #endif 181 222 } 182 223 183 224 /* No match, check which queue to put it on */ 184 225 if (so && (so->so_iptos & IPTOS_LOWDELAY)) { 226 #ifdef VBOX_WITH_SYNC_SLIRP 227 RTSemMutexRequest(pData->if_fastq_mutex, RT_INDEFINITE_WAIT); 228 #endif 185 229 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 186 234 on_fastq = 1; 187 235 /* … … 194 242 goto diddit; 195 243 } 196 } else 244 } 245 else { 246 #ifdef VBOX_WITH_SYNC_SLIRP 247 RTSemMutexRequest(pData->if_batchq_mutex, RT_INDEFINITE_WAIT); 248 #endif 197 249 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 254 } 198 255 199 256 /* Create a new doubly linked list for this session */ … … 203 260 204 261 diddit: 262 #ifdef VBOX_WITH_SYNC_SLIRP 263 RTSemMutexRequest(pData->if_queued_mutex, RT_INDEFINITE_WAIT); 264 #endif 205 265 ++if_queued; 266 #ifdef VBOX_WITH_SYNC_SLIRP 267 RTSemMutexRelease(pData->if_queued_mutex); 268 #endif 206 269 207 270 if (so) { … … 219 282 (so->so_nqueued - so->so_queued) >= 3)) { 220 283 284 #ifdef VBOX_WITH_SYNC_SLIRP 285 RTSemMutexRequest(pData->if_fastq_mutex, RT_INDEFINITE_WAIT); 286 #endif 221 287 /* Remove from current queue... */ 222 288 remque(pData, ifm->ifs_next); 289 #ifdef VBOX_WITH_SYNC_SLIRP 290 RTSemMutexRequest(pData->if_batchq_mutex, RT_INDEFINITE_WAIT); 291 #endif 223 292 224 293 /* ...And insert in the new. That'll teach ya! */ 225 294 insque(pData, ifm->ifs_next, &if_batchq); 226 } 227 } 295 #ifdef VBOX_WITH_SYNC_SLIRP 296 RTSemMutexRelease(pData->if_fastq_mutex); 297 RTSemMutexRelease(pData->if_batchq_mutex); 298 #endif 299 } 300 RTSemMutexRelease(so->so_mutex); 301 } 302 #ifdef VBOX_WITH_SYNC_SLIRP 303 RTSemMutexRelease(ifq->m_mutex); 304 RTSemMutexRelease(ifm->m_mutex); 305 #endif 228 306 229 307 #ifndef FULL_BOLT … … 254 332 { 255 333 struct mbuf *ifm, *ifqt; 334 #ifdef VBOX_WITH_SYNC_SLIRP 335 int on_fast = 0; /*required for correctness */ 336 struct mbuf *ifm_prev; 337 #endif 256 338 257 339 DEBUG_CALL("if_start"); 258 340 259 if (if_queued == 0) 341 #ifdef VBOX_WITH_SYNC_SLIRP 342 RTSemMutexRequest(pData->if_queued_mutex, RT_INDEFINITE_WAIT); 343 #endif 344 if (if_queued <= 0) { 345 #ifdef VBOX_WITH_SYNC_SLIRP 346 RTSemMutexRelease(pData->if_queued_mutex); 347 #endif 260 348 return; /* Nothing to do */ 349 } 261 350 262 351 again: 352 #ifdef VBOX_WITH_SYNC_SLIRP 353 RTSemMutexRelease(pData->if_queued_mutex); 354 #endif 263 355 /* check if we can really output */ 264 356 if (!slirp_can_output(pData->pvUser)) … … 269 361 * If there's something in the fastq, select it immediately 270 362 */ 363 #ifdef VBOX_WITH_SYNC_SLIRP 364 RTSemMutexRequest(pData->if_fastq_mutex, RT_INDEFINITE_WAIT); 365 #endif 271 366 if (if_fastq.ifq_next != &if_fastq) { 272 367 ifm = if_fastq.ifq_next; 368 #ifdef VBOX_WITH_SYNC_SLIRP 369 on_fast = 1; 370 RTSemMutexRequest(ifm->m_mutex, RT_INDEFINITE_WAIT); 371 #endif 273 372 } else { 373 #ifdef VBOX_WITH_SYNC_SLIRP 374 RTSemMutexRelease(pData->if_fastq_mutex); 375 RTSemMutexRequest(pData->next_m_mutex, RT_INDEFINITE_WAIT); 376 RTSemMutexRequest(pData->if_batchq_mutex, RT_INDEFINITE_WAIT); 377 #endif 274 378 /* Nothing on fastq, see if next_m is valid */ 275 379 if (next_m != &if_batchq) … … 280 384 /* Set which packet to send on next iteration */ 281 385 next_m = ifm->ifq_next; 282 } 386 #ifdef VBOX_WITH_SYNC_SLIRP 387 RTSemMutexRelease(pData->next_m_mutex); 388 #endif 389 } 390 #ifdef VBOX_WITH_SYNC_SLIRP 391 RTSemMutexRequest(ifm->m_mutex, RT_INDEFINITE_WAIT); 392 RTSemMutexRequest(pData->if_queued_mutex, RT_INDEFINITE_WAIT); 393 #endif 283 394 /* Remove it from the queue */ 284 395 ifqt = ifm->ifq_prev; 396 ifqt = ifm->ifq_prev; 285 397 remque(pData, ifm); 398 286 399 --if_queued; 400 #ifdef VBOX_WITH_SYNC_SLIRP 401 RTSemMutexRelease(pData->if_queued_mutex); 402 if (on_fast == 1) { 403 RTSemMutexRelease(pData->if_fastq_mutex); 404 } 405 else { 406 RTSemMutexRelease(pData->if_batchq_mutex); 407 } 408 #endif 287 409 288 410 /* If there are more packets for this session, re-queue them */ … … 294 416 /* Update so_queued */ 295 417 if (ifm->ifq_so) { 418 #ifndef VBOX_WITH_SYNC_SLIRP 419 RTSemMutexRequest(ifm->ifq_so->so_mutex, RT_INDEFINITE_WAIT); 420 #endif 296 421 if (--ifm->ifq_so->so_queued == 0) 297 422 /* If there's no more queued, reset nqueued */ 298 423 ifm->ifq_so->so_nqueued = 0; 424 #ifndef VBOX_WITH_SYNC_SLIRP 425 RTSemMutexRelease(ifm->ifq_so->so_mutex); 426 #endif 299 427 } 300 428 301 429 /* Encapsulate the packet for sending */ 302 430 if_encap(pData, (const uint8_t *)ifm->m_data, ifm->m_len); 431 #ifdef VBOX_WITH_SYNC_SLIRP 432 RTSemMutexRelease(ifm->m_mutex); 433 #endif 303 434 304 435 m_free(pData, ifm); 305 436 306 if (if_queued) 437 #ifdef VBOX_WITH_SYNC_SLIRP 438 RTSemMutexRequest(pData->if_queued_mutex, RT_INDEFINITE_WAIT); 439 /*We release if_queued_mutex after again label and before return*/ 440 #endif 441 if (if_queued > 0) 307 442 goto again; 308 } 443 #ifdef VBOX_WITH_SYNC_SLIRP 444 RTSemMutexRelease(pData->if_queued_mutex); 445 #endif 446 } -
trunk/src/VBox/Devices/Network/slirp/mbuf.c
r1076 r13604 25 25 m_usedlist.m_next = m_usedlist.m_prev = &m_usedlist; 26 26 mbuf_alloced = 0; 27 #ifdef VBOX_WITH_SYNC_SLIRP 28 RTSemMutexCreate(&pData->m_usedlist_mutex); 29 RTSemMutexCreate(&pData->m_freelist_mutex); 30 RTSemMutexCreate(&pData->mbuf_alloced_mutex); 31 #endif 27 32 msize_init(pData); 28 33 } … … 52 57 register struct mbuf *m; 53 58 int flags = 0; 59 #ifdef VBOX_WITH_SYNC_SLIRP 60 int on_free_list = 0; 61 #endif 54 62 55 63 DEBUG_CALL("m_get"); 56 64 65 #ifdef VBOX_WITH_SYNC_SLIRP 66 RTSemMutexRequest(pData->m_freelist_mutex, RT_INDEFINITE_WAIT); 67 #endif 57 68 if (m_freelist.m_next == &m_freelist) { 58 69 m = (struct mbuf *)malloc(msize); 59 if (m == NULL) goto end_error; 70 if (m == NULL) { 71 #ifdef VBOX_WITH_SYNC_SLIRP 72 RTSemMutexRelease(pData->m_freelist_mutex); 73 #endif 74 goto end_error; 75 } 76 #ifdef VBOX_WITH_SYNC_SLIRP 77 RTSemMutexRequest(pData->mbuf_alloced_mutex, RT_INDEFINITE_WAIT); 78 #endif 60 79 mbuf_alloced++; 61 80 if (mbuf_alloced > mbuf_thresh) … … 63 82 if (mbuf_alloced > mbuf_max) 64 83 mbuf_max = mbuf_alloced; 84 #ifdef VBOX_WITH_SYNC_SLIRP 85 RTSemMutexRelease(pData->mbuf_alloced_mutex); 86 #endif 65 87 } else { 66 88 m = m_freelist.m_next; 67 89 remque(pData, m); 68 90 } 91 #ifdef VBOX_WITH_SYNC_SLIRP 92 RTSemMutexRequest(pData->m_usedlist_mutex, RT_INDEFINITE_WAIT); 93 #endif 69 94 70 95 /* Insert it in the used list */ 71 96 insque(pData, m,&m_usedlist); 72 97 m->m_flags = (flags | M_USEDLIST); 98 #ifdef VBOX_WITH_SYNC_SLIRP 99 RTSemMutexCreate(&m->m_mutex); 100 RTSemMutexRequest(m->m_mutex, RT_INDEFINITE_WAIT); 101 RTSemMutexRelease(pData->m_usedlist_mutex); 102 RTSemMutexRelease(pData->m_freelist_mutex); 103 #endif 73 104 74 105 /* Initialise it */ … … 78 109 m->m_nextpkt = 0; 79 110 m->m_prevpkt = 0; 111 #ifdef VBOX_WITH_SYNC_SLIRP 112 RTSemMutexRelease(m->m_mutex); 113 #endif 80 114 end_error: 81 115 DEBUG_ARG("m = %lx", (long )m); … … 92 126 if(m) { 93 127 /* Remove from m_usedlist */ 94 if (m->m_flags & M_USEDLIST) 128 #ifdef VBOX_WITH_SYNC_SLIRP 129 RTSemMutexRequest(m->m_mutex, RT_INDEFINITE_WAIT); 130 #endif 131 if (m->m_flags & M_USEDLIST) { 132 #ifdef VBOX_WITH_SYNC_SLIRP 133 RTSemMutexRequest(pData->m_usedlist_mutex, RT_INDEFINITE_WAIT); 134 #endif 95 135 remque(pData, m); 136 #ifdef VBOX_WITH_SYNC_SLIRP 137 RTSemMutexRelease(pData->m_usedlist_mutex); 138 #endif 139 } 96 140 97 141 /* If it's M_EXT, free() it */ … … 104 148 if (m->m_flags & M_DOFREE) { 105 149 u32ptr_done(pData, ptr_to_u32(pData, m), m); 150 #ifdef VBOX_WITH_SYNC_SLIRP 151 RTSemMutexRelease(m->m_mutex); 152 RTSemMutexDestroy(m->m_mutex); 153 #endif 106 154 free(m); 155 #ifdef VBOX_WITH_SYNC_SLIRP 156 RTSemMutexRequest(pData->mbuf_alloced_mutex, RT_INDEFINITE_WAIT); 107 157 mbuf_alloced--; 158 RTSemMutexRelease(pData->mbuf_alloced_mutex); 159 #endif 108 160 } else if ((m->m_flags & M_FREELIST) == 0) { 161 #ifdef VBOX_WITH_SYNC_SLIRP 162 RTSemMutexRequest(pData->m_freelist_mutex, RT_INDEFINITE_WAIT); 163 #endif 109 164 insque(pData, m,&m_freelist); 110 165 m->m_flags = M_FREELIST; /* Clobber other flags */ 166 #ifdef VBOX_WITH_SYNC_SLIRP 167 RTSemMutexRelease(pData->m_freelist_mutex); 168 RTSemMutexRelease(m->m_mutex); 169 #endif 111 170 } 112 171 } /* if(m) */ … … 124 183 * If there's no room, realloc 125 184 */ 185 #ifdef VBOX_WITH_SYNC_SLIRP 186 RTSemMutexRequest(m->m_mutex, RT_INDEFINITE_WAIT); 187 RTSemMutexRequest(n->m_mutex, RT_INDEFINITE_WAIT); 188 #endif 126 189 if (M_FREEROOM(m) < n->m_len) 127 190 m_inc(m,m->m_size+MINCSIZE); … … 130 193 m->m_len += n->m_len; 131 194 195 #ifdef VBOX_WITH_SYNC_SLIRP 196 RTSemMutexRelease(m->m_mutex); 197 RTSemMutexRelease(n->m_mutex); 198 #endif 132 199 m_free(pData, n); 133 200 } … … 143 210 144 211 /* some compiles throw up on gotos. This one we can fake. */ 145 if(m->m_size>size) return; 212 #ifdef VBOX_WITH_SYNC_SLIRP 213 RTSemMutexRequest(m->m_mutex, RT_INDEFINITE_WAIT); 214 #endif 215 if(m->m_size>size) { 216 #ifdef VBOX_WITH_SYNC_SLIRP 217 RTSemMutexRelease(m->m_mutex); 218 #endif 219 return; 220 } 146 221 147 222 if (m->m_flags & M_EXT) { … … 167 242 168 243 m->m_size = size; 169 244 #ifdef VBOX_WITH_SYNC_SLIRP 245 RTSemMutexRelease(m->m_mutex); 246 #endif 170 247 } 171 248 … … 179 256 if (m == NULL) 180 257 return; 258 #ifdef VBOX_WITH_SYNC_SLIRP 259 RTSemMutexRequest(m->m_mutex, RT_INDEFINITE_WAIT); 260 #endif 181 261 if (len >= 0) { 182 262 /* Trim from head */ … … 188 268 m->m_len -= len; 189 269 } 270 #ifdef VBOX_WITH_SYNC_SLIRP 271 RTSemMutexRelease(m->m_mutex); 272 #endif 190 273 } 191 274 … … 199 282 int off, len; 200 283 { 201 if (len > M_FREEROOM(n)) 284 #ifdef VBOX_WITH_SYNC_SLIRP 285 RTSemMutexRequest(m->m_mutex, RT_INDEFINITE_WAIT); 286 RTSemMutexRequest(n->m_mutex, RT_INDEFINITE_WAIT); 287 #endif 288 if (len > M_FREEROOM(n)) { 289 #ifdef VBOX_WITH_SYNC_SLIRP 290 RTSemMutexRelease(n->m_mutex); 291 RTSemMutexRelease(m->m_mutex); 292 #endif 202 293 return -1; 294 } 203 295 204 296 memcpy((n->m_data + n->m_len), (m->m_data + off), len); 205 297 n->m_len += len; 298 #ifdef VBOX_WITH_SYNC_SLIRP 299 RTSemMutexRelease(n->m_mutex); 300 RTSemMutexRelease(m->m_mutex); 301 #endif 206 302 return 0; 207 303 } … … 222 318 223 319 /* bug corrected for M_EXT buffers */ 320 #ifndef VBOX_WITH_SYNC_SLIRP 224 321 for (m = m_usedlist.m_next; m != &m_usedlist; m = m->m_next) { 322 #else 323 RTSemMutexRequest(pData->m_usedlist_mutex, RT_INDEFINITE_WAIT); 324 m = m_usedlist.m_next; 325 while(1) { 326 RTSemMutexRequest(m->m_mutex, RT_INDEFINITE_WAIT); 327 RTSemMutexRelease(pData->m_usedlist_mutex); 328 #endif 225 329 if (m->m_flags & M_EXT) { 226 if( (char *)dat>=m->m_ext && (char *)dat<(m->m_ext + m->m_size) ) 330 if( (char *)dat>=m->m_ext && (char *)dat<(m->m_ext + m->m_size) ) { 331 #ifdef VBOX_WITH_SYNC_SLIRP 332 RTSemMutexRelease(m->m_mutex); 333 #endif 227 334 return m; 335 } 228 336 } else { 229 if( (char *)dat >= m->m_dat && (char *)dat<(m->m_dat + m->m_size) ) 337 if( (char *)dat >= m->m_dat && (char *)dat<(m->m_dat + m->m_size) ) { 338 #ifdef VBOX_WITH_SYNC_SLIRP 339 RTSemMutexRelease(m->m_mutex); 340 #endif 230 341 return m; 342 } 231 343 } 344 #ifdef VBOX_WITH_SYNC_SLIRP 345 RTSemMutexRelease(m->m_mutex); 346 RTSemMutexRequest(pData->m_usedlist_mutex, RT_INDEFINITE_WAIT); 347 m = m->m_next; 348 #endif 232 349 } 233 350 -
trunk/src/VBox/Devices/Network/slirp/mbuf.h
r1076 r13604 37 37 #ifndef _MBUF_H_ 38 38 #define _MBUF_H_ 39 #ifdef VBOX_WITH_SYNC_SLIRP 40 #include <iprt/semaphore.h> 41 #endif 39 42 40 43 #define m_freem m_free … … 73 76 caddr_t mh_data; /* Location of data */ 74 77 int mh_len; /* Amount of data in this mbuf */ 78 #ifdef VBOX_WITH_SYNC_SLIRP 79 RTSEMMUTEX mh_mutex; 80 #endif 75 81 }; 76 82 … … 108 114 #define m_ext M_dat.m_ext_ 109 115 #define m_so m_hdr.mh_so 116 #ifdef VBOX_WITH_SYNC_SLIRP 117 #define m_mutex m_hdr.mh_mutex 118 #endif 110 119 111 120 #define ifq_prev m_prev -
trunk/src/VBox/Devices/Network/slirp/slirp.c
r9150 r13604 6 6 #include <VBox/err.h> 7 7 #include <iprt/assert.h> 8 #ifdef VBOX_WITH_SYNC_SLIRP 9 #include <iprt/semaphore.h> 10 #endif 8 11 9 12 static const uint8_t special_ethaddr[6] = { … … 200 203 { 201 204 int fNATfailed = 0; 205 #ifdef VBOX_WITH_SYNC_SLIRP 206 int rc = 0; 207 #endif 202 208 PNATState pData = malloc(sizeof(NATState)); 203 209 *ppData = pData; … … 222 228 WSAStartup(MAKEWORD(2,0), &Data); 223 229 } 230 #endif 231 232 #ifdef VBOX_WITH_SYNC_SLIRP 233 rc = RTSemMutexCreate(&pData->tcb_mutex); 234 AssertReleaseRC(rc); 235 rc = RTSemMutexCreate(&pData->udb_mutex); 236 AssertReleaseRC(rc); 237 rc = RTSemMutexCreate(&pData->if_queued_mutex); 238 AssertReleaseRC(rc); 239 rc = RTSemMutexCreate(&pData->next_m_mutex); 240 AssertReleaseRC(rc); 224 241 #endif 225 242 … … 358 375 * in the fragment queue, or there are TCP connections active 359 376 */ 377 #ifndef VBOX_WITH_SYNC_SLIRP 360 378 do_slowtimo = ((tcb.so_next != &tcb) || 361 379 ((struct ipasfrag *)&ipq != u32_to_ptr(pData, ipq.next, struct ipasfrag *))); … … 363 381 for (so = tcb.so_next; so != &tcb; so = so_next) { 364 382 so_next = so->so_next; 383 #else 384 RTSemMutexRequest(pData->tcb_mutex, RT_INDEFINITE_WAIT); 385 so = tcb.so_next; 386 do_slowtimo = ((so != &tcb) || 387 ((struct ipasfrag *)&ipq != u32_to_ptr(pData, ipq.next, struct ipasfrag *))); 388 while (1) { 389 if (so == &tcb) { 390 RTSemMutexRelease(pData->tcb_mutex); 391 break; 392 } 393 so_next = so->so_next; 394 RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT); 395 RTSemMutexRelease(pData->tcb_mutex); 396 #endif 365 397 366 398 /* … … 375 407 */ 376 408 if (so->so_state & SS_NOFDREF || so->s == -1) 377 continue; 409 #ifndef VBOX_WITH_SYNC_SLIRP 410 continue; 411 #else 412 goto before_loop_ends; 413 #endif 378 414 379 415 /* … … 383 419 FD_SET(so->s, readfds); 384 420 UPD_NFDS(so->s); 421 #ifndef VBOX_WITH_SYNC_SLIRP 385 422 continue; 423 #else 424 goto before_loop_ends; 425 #endif 386 426 } 387 427 … … 392 432 FD_SET(so->s, writefds); 393 433 UPD_NFDS(so->s); 434 #ifndef VBOX_WITH_SYNC_SLIRP 394 435 continue; 436 #else 437 goto before_loop_ends; 438 #endif 395 439 } 396 440 … … 413 457 UPD_NFDS(so->s); 414 458 } 459 #ifdef VBOX_WITH_SYNC_SLIRP 460 before_loop_ends: 461 /*Release of global tcb mutex happens in the head of loop*/ 462 RTSemMutexRequest(pData->tcb_mutex, RT_INDEFINITE_WAIT); 463 RTSemMutexRelease(so->so_mutex); 464 so = so_next; 465 #endif 415 466 } 416 467 … … 418 469 * UDP sockets 419 470 */ 471 #ifndef VBOX_WITH_SYNC_SLIRP 420 472 for (so = udb.so_next; so != &udb; so = so_next) { 421 473 so_next = so->so_next; 474 #else 475 RTSemMutexRequest(pData->udb_mutex, RT_INDEFINITE_WAIT); 476 so = udb.so_next; 477 while(1) { 478 if (so == &udb) { 479 RTSemMutexRelease(pData->udb_mutex); 480 break; 481 } 482 so_next = so->so_next; 483 RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT); 484 RTSemMutexRelease(pData->udb_mutex); 485 #endif 422 486 423 487 /* … … 427 491 if (so->so_expire <= curtime) { 428 492 udp_detach(pData, so); 493 #ifndef VBOX_WITH_SYNC_SLIRP 429 494 continue; 495 #else 496 goto before_udp_loop_end; 497 #endif 430 498 } else 431 499 do_slowtimo = 1; /* Let socket expire */ … … 446 514 UPD_NFDS(so->s); 447 515 } 516 #ifdef VBOX_WITH_SYNC_SLIRP 517 before_udp_loop_end: 518 RTSemMutexRequest(pData->udb_mutex, RT_INDEFINITE_WAIT); 519 RTSemMutexRelease(so->so_mutex); 520 so = so_next; 521 #endif 448 522 } 449 523 } … … 515 589 * Check TCP sockets 516 590 */ 591 #ifndef VBOX_WITH_SYNC_SLIRP 517 592 for (so = tcb.so_next; so != &tcb; so = so_next) { 518 593 so_next = so->so_next; 594 #else 595 RTSemMutexRequest(pData->tcb_mutex, RT_INDEFINITE_WAIT); 596 so = tcb.so_next; 597 while (1) { 598 if (so == &tcb) { 599 RTSemMutexRelease(pData->tcb_mutex); 600 break; 601 } 602 so_next = so->so_next; 603 RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT); 604 RTSemMutexRelease(pData->tcb_mutex); 605 #endif 519 606 520 607 /* … … 523 610 */ 524 611 if (so->so_state & SS_NOFDREF || so->s == -1) 525 continue; 612 #ifndef VBOX_WITH_SYNC_SLIRP 613 continue; 614 #else 615 goto before_loop_ends; 616 #endif 526 617 527 618 /* … … 541 632 if (so->so_state & SS_FACCEPTCONN) { 542 633 tcp_connect(pData, so); 543 continue; 634 #ifndef VBOX_WITH_SYNC_SLIRP 635 continue; 636 #else 637 goto before_loop_ends; 638 #endif 544 639 } /* else */ 545 640 ret = soread(pData, so); … … 573 668 if (errno == EAGAIN || errno == EWOULDBLOCK || 574 669 errno == EINPROGRESS || errno == ENOTCONN) 575 continue; 670 #ifndef VBOX_WITH_SYNC_SLIRP 671 continue; 672 #else 673 goto before_loop_ends; 674 #endif 576 675 577 676 /* else failed */ … … 608 707 if (errno == EAGAIN || errno == EWOULDBLOCK || 609 708 errno == EINPROGRESS || errno == ENOTCONN) 610 continue; /* Still connecting, continue */ 709 #ifndef VBOX_WITH_SYNC_SLIRP 710 continue;/* Still connecting, continue */ 711 #else 712 goto before_loop_ends; 713 #endif 611 714 612 715 /* else failed */ … … 620 723 if (errno == EAGAIN || errno == EWOULDBLOCK || 621 724 errno == EINPROGRESS || errno == ENOTCONN) 622 continue; 725 #ifndef VBOX_WITH_SYNC_SLIRP 726 continue; 727 #else 728 goto before_loop_ends; 729 #endif 623 730 /* else failed */ 624 731 so->so_state = SS_NOFDREF; … … 629 736 tcp_input((struct mbuf *)NULL, sizeof(struct ip),so); 630 737 } /* SS_ISFCONNECTING */ 738 #endif 739 #ifdef VBOX_WITH_SYNC_SLIRP 740 before_loop_ends: 741 RTSemMutexRequest(pData->tcb_mutex, RT_INDEFINITE_WAIT); 742 RTSemMutexRelease(so->so_mutex); 743 so = so_next; 631 744 #endif 632 745 } … … 637 750 * Incoming UDP data isn't buffered either. 638 751 */ 752 #ifndef VBOX_WITH_SYNC_SLIRP 639 753 for (so = udb.so_next; so != &udb; so = so_next) { 640 754 so_next = so->so_next; 755 #else 756 RTSemMutexRequest(pData->udb_mutex, RT_INDEFINITE_WAIT); 757 so = udb.so_next; 758 while(1) { 759 if (so == &udb) { 760 RTSemMutexRelease(pData->udb_mutex); 761 break; 762 } 763 so_next = so->so_next; 764 RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT); 765 RTSemMutexRelease(pData->udb_mutex); 766 #endif 641 767 642 768 if (so->s != -1 && FD_ISSET(so->s, readfds)) { 643 769 sorecvfrom(pData, so); 644 770 } 771 #ifdef VBOX_WITH_SYNC_SLIRP 772 RTSemMutexRequest(pData->udb_mutex, RT_INDEFINITE_WAIT); 773 RTSemMutexRelease(so->so_mutex); 774 so = so_next; 775 #endif 645 776 } 646 777 } … … 649 780 * See if we can start outputting 650 781 */ 782 #ifndef VBOX_WITH_SYNC_SLIRP 651 783 if (if_queued && link_up) 652 784 if_start(pData); 785 #else 786 #if 0 787 if (link_up) { 788 RTSemMutexRequest(pData->if_queued_mutex, RT_INDEFINITE_WAIT); 789 if (if_queued > 0){ 790 RTSemMutexRelease(pData->if_queued_mutex); 791 if_start(pData); 792 } 793 else { 794 RTSemMutexRelease(pData->if_queued_mutex); 795 } 796 } 797 #endif 798 #endif 653 799 } 654 800 -
trunk/src/VBox/Devices/Network/slirp/slirp_state.h
r8155 r13604 21 21 #ifndef _slirp_state_h_ 22 22 #define _slirp_state_h_ 23 #ifndef VBOX_WITH_SYNC_SLIRP 24 #include <iprt/semaphore.h> 25 #endif 23 26 24 27 /** Number of DHCP clients supported by NAT. */ … … 61 64 int if_maxlinkhdr; 62 65 int if_queued; 66 #ifdef VBOX_WITH_SYNC_SLIRP 67 RTSEMMUTEX if_queued_mutex; 68 #endif 63 69 int if_thresh; 64 70 struct mbuf if_fastq; 71 #ifdef VBOX_WITH_SYNC_SLIRP 72 RTSEMMUTEX if_fastq_mutex; 73 #endif 65 74 struct mbuf if_batchq; 75 #ifdef VBOX_WITH_SYNC_SLIRP 76 RTSEMMUTEX if_batchq_mutex; 77 #endif 66 78 struct mbuf *next_m; 79 #ifdef VBOX_WITH_SYNC_SLIRP 80 RTSEMMUTEX next_m_mutex; 81 #endif 67 82 /* Stuff from icmp.c */ 68 83 struct icmpstat_t icmpstat; … … 73 88 /* Stuff from mbuf.c */ 74 89 int mbuf_alloced, mbuf_max; 90 #ifdef VBOX_WITH_SYNC_SLIRP 91 RTSEMMUTEX mbuf_alloced_mutex; 92 #endif 75 93 int msize; 76 94 struct mbuf m_freelist, m_usedlist; 95 #ifdef VBOX_WITH_SYNC_SLIRP 96 RTSEMMUTEX m_freelist_mutex; 97 RTSEMMUTEX m_usedlist_mutex; 98 #endif 77 99 /* Stuff from slirp.c */ 78 100 void *pvUser; … … 98 120 struct socket *tcp_last_so; 99 121 tcp_seq tcp_iss; 122 RTSEMMUTEX tcb_mutex; 100 123 #if ARCH_BITS == 64 101 124 /* Stuff from tcp_subr.c */ … … 116 139 struct socket udb; 117 140 struct socket *udp_last_so; 141 RTSEMMUTEX udb_mutex; 118 142 } NATState; 119 143 -
trunk/src/VBox/Devices/Network/slirp/socket.c
r8009 r13604 12 12 #ifdef __sun__ 13 13 #include <sys/filio.h> 14 #endif 15 16 #ifdef VBOX_WITH_SYNC_SLIRP 17 #include <iprt/semaphore.h> 14 18 #endif 15 19 … … 60 64 so->so_state = SS_NOFDREF; 61 65 so->s = -1; 66 #ifdef VBOX_WITH_SYNC_SLIRP 67 RTSemMutexCreate(&so->so_mutex); 68 #endif 62 69 } 63 70 return(so); … … 70 77 sofree(PNATState pData, struct socket *so) 71 78 { 79 #ifndef VBOX_WITH_SYNC_SLIRP 72 80 if (so->so_emu==EMU_RSH && so->extra) { 73 81 sofree(pData, so->extra); … … 83 91 if(so->so_next && so->so_prev) 84 92 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 85 137 86 138 free(so); 139 so = NULL; 87 140 } 88 141 … … 101 154 int mss = so->so_tcpcb->t_maxseg; 102 155 156 #ifdef VBOX_WITH_SYNC_SLIRP 157 RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT); 158 #endif 103 159 DEBUG_CALL("soread"); 104 160 DEBUG_ARG("so = %lx", (long )so); … … 159 215 #endif 160 216 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 162 221 return 0; 222 } 163 223 else { 164 224 DEBUG_MISC((dfd, " --- soread() disconnected, nn = %d, errno = %d-%s\n", nn, errno,strerror(errno))); 165 225 sofcantrcvmore(so); 166 226 tcp_sockclosed(pData, sototcpcb(so)); 227 #ifdef VBOX_WITH_SYNC_SLIRP 228 RTSemMutexRelease(so->so_mutex); 229 #endif 167 230 return -1; 168 231 } … … 194 257 if (sb->sb_wptr >= (sb->sb_data + sb->sb_datalen)) 195 258 sb->sb_wptr -= sb->sb_datalen; 259 #ifdef VBOX_WITH_SYNC_SLIRP 260 RTSemMutexRelease(so->so_mutex); 261 #endif 196 262 return nn; 197 263 } … … 207 273 sorecvoob(PNATState pData, struct socket *so) 208 274 { 275 #ifdef VBOX_WITH_SYNC_SLIRP 276 RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT); 277 #endif 209 278 struct tcpcb *tp = sototcpcb(so); 210 279 … … 225 294 tcp_output(pData, tp); 226 295 tp->t_force = 0; 296 #ifdef VBOX_WITH_SYNC_SLIRP 297 RTSemMutexRelease(so->so_mutex); 298 #endif 227 299 } 228 300 … … 239 311 240 312 int n, len; 313 #ifdef VBOX_WITH_SYNC_SLIRP 314 RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT); 315 #endif 241 316 242 317 DEBUG_CALL("sosendoob"); … … 283 358 sb->sb_rptr -= sb->sb_datalen; 284 359 360 #ifdef VBOX_WITH_SYNC_SLIRP 361 RTSemMutexRelease(so->so_mutex); 362 #endif 285 363 return n; 286 364 } … … 297 375 int len = sb->sb_cc; 298 376 struct iovec iov[2]; 377 #ifdef VBOX_WITH_SYNC_SLIRP 378 RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT); 379 #endif 299 380 300 381 DEBUG_CALL("sowrite"); … … 344 425 #endif 345 426 /* 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 347 431 return 0; 432 } 348 433 349 434 if (nn <= 0) { … … 352 437 sofcantsendmore(so); 353 438 tcp_sockclosed(pData, sototcpcb(so)); 439 #ifdef VBOX_WITH_SYNC_SLIRP 440 RTSemMutexRelease(so->so_mutex); 441 #endif 354 442 return -1; 355 443 } … … 378 466 sofcantsendmore(so); 379 467 468 #ifdef VBOX_WITH_SYNC_SLIRP 469 RTSemMutexRelease(so->so_mutex); 470 #endif 380 471 return nn; 381 472 } … … 392 483 DEBUG_CALL("sorecvfrom"); 393 484 DEBUG_ARG("so = %lx", (long)so); 485 486 #ifdef VBOX_WITH_SYNC_SLIRP 487 RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT); 488 #endif 394 489 395 490 if (so->so_type == IPPROTO_ICMP) { /* This is a "ping" reply */ … … 478 573 } /* rx error */ 479 574 } /* if ping packet */ 575 #ifdef VBOX_WITH_SYNC_SLIRP 576 RTSemMutexRelease(so->so_mutex); 577 #endif 480 578 } 481 579 … … 490 588 #if 0 491 589 struct sockaddr_in host_addr; 590 #endif 591 #ifdef VBOX_WITH_SYNC_SLIRP 592 RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT); 492 593 #endif 493 594 … … 542 643 ret = sendto(so->s, m->m_data, m->m_len, 0, 543 644 (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 545 649 return -1; 650 } 546 651 547 652 /* … … 552 657 so->so_expire = curtime + SO_EXPIRE; 553 658 so->so_state = SS_ISFCONNECTED; /* So that it gets select()ed */ 659 #ifdef VBOX_WITH_SYNC_SLIRP 660 RTSemMutexRelease(so->so_mutex); 661 #endif 554 662 return 0; 555 663 } … … 582 690 return NULL; 583 691 } 692 #ifndef VBOX_WITH_SYNC_SLIRP 584 693 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 585 701 586 702 /* … … 627 743 628 744 so->s = s; 745 #ifdef VBOX_WITH_SYNC_SLIRP 746 RTSemMutexRelease(so->so_mutex); 747 #endif 629 748 return so; 630 749 } … … 665 784 register struct socket *so; 666 785 { 786 #ifdef VBOX_WITH_SYNC_SLIRP 787 RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT); 788 #endif 667 789 so->so_state &= ~(SS_NOFDREF|SS_ISFCONNECTED|SS_FCANTRCVMORE| 668 790 SS_FCANTSENDMORE|SS_FWDRAIN); 669 791 so->so_state |= SS_ISFCONNECTING; /* Clobber other states */ 792 #ifdef VBOX_WITH_SYNC_SLIRP 793 RTSemMutexRelease(so->so_mutex); 794 #endif 670 795 } 671 796 … … 674 799 register struct socket *so; 675 800 { 801 #ifdef VBOX_WITH_SYNC_SLIRP 802 RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT); 803 #endif 676 804 so->so_state &= ~(SS_ISFCONNECTING|SS_FWDRAIN|SS_NOFDREF); 677 805 so->so_state |= SS_ISFCONNECTED; /* Clobber other states */ 806 #ifdef VBOX_WITH_SYNC_SLIRP 807 RTSemMutexRelease(so->so_mutex); 808 #endif 678 809 } 679 810 … … 682 813 struct socket *so; 683 814 { 815 #ifdef VBOX_WITH_SYNC_SLIRP 816 RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT); 817 #endif 684 818 if ((so->so_state & SS_NOFDREF) == 0) { 685 819 shutdown(so->s,0); … … 690 824 else 691 825 so->so_state |= SS_FCANTRCVMORE; 826 #ifdef VBOX_WITH_SYNC_SLIRP 827 RTSemMutexRelease(so->so_mutex); 828 #endif 692 829 } 693 830 … … 696 833 struct socket *so; 697 834 { 835 #ifdef VBOX_WITH_SYNC_SLIRP 836 RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT); 837 #endif 698 838 if ((so->so_state & SS_NOFDREF) == 0) { 699 839 shutdown(so->s,1); /* send FIN to fhost */ … … 704 844 else 705 845 so->so_state |= SS_FCANTSENDMORE; 846 #ifdef VBOX_WITH_SYNC_SLIRP 847 RTSemMutexRelease(so->so_mutex); 848 #endif 706 849 } 707 850 … … 726 869 struct socket *so; 727 870 { 871 #ifdef VBOX_WITH_SYNC_SLIRP 872 RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT); 873 #endif 728 874 if (so->so_rcv.sb_cc) 729 875 so->so_state |= SS_FWDRAIN; 730 876 else 731 877 sofcantsendmore(so); 732 } 733 878 #ifdef VBOX_WITH_SYNC_SLIRP 879 RTSemMutexRelease(so->so_mutex); 880 #endif 881 } 882 -
trunk/src/VBox/Devices/Network/slirp/socket.h
r1076 r13604 10 10 #ifndef _SLIRP_SOCKET_H_ 11 11 #define _SLIRP_SOCKET_H_ 12 #ifndef VBOX_WITH_SYNC_SLIRP 13 #include <iprt/semaphore.h> 14 #endif 12 15 13 16 #define SO_EXPIRE 240000 … … 52 55 struct sbuf so_snd; /* Send buffer */ 53 56 void * extra; /* Extra pointer */ 57 RTSEMMUTEX so_mutex; /*per socket mutex*/ 54 58 }; 55 59 -
trunk/src/VBox/Devices/Network/slirp/tcp_subr.c
r8009 r13604 262 262 DEBUG_CALL("tcp_close"); 263 263 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 264 268 265 269 /* free the reassembly queue, if any */ … … 528 532 if ((so->so_tcpcb = tcp_newtcpcb(pData, so)) == NULL) 529 533 return -1; 530 534 so->so_type = IPPROTO_TCP; 535 536 RTSemMutexRequest(pData->tcb_mutex, RT_INDEFINITE_WAIT); 531 537 insque(pData, so, &tcb); 538 RTSemMutexRelease(pData->tcb_mutex); 532 539 533 540 return 0; -
trunk/src/VBox/Devices/Network/slirp/tcp_timer.c
r1076 r13604 46 46 register struct socket *so; 47 47 register struct tcpcb *tp; 48 #ifdef VBOX_WITH_SYNC_SLIRP 49 struct socket *so_next; 50 #endif 48 51 49 52 DEBUG_CALL("tcp_fasttimo"); 50 53 54 #ifndef VBOX_WITH_SYNC_SLIRP 51 55 so = tcb.so_next; 52 56 if (so) 53 57 for (; so != &tcb; so = so->so_next) 58 #else 59 RTSemMutexRequest(pData->tcb_mutex, RT_INDEFINITE_WAIT); 60 so = tcb.so_next; 61 while(1) { 62 if ( so == &tcb) { 63 RTSemMutexRelease(pData->tcb_mutex); 64 break; 65 } 66 so_next = so->so_next; 67 RTSemMutexRequest(so->so_mutex, RT_INDEFINITE_WAIT); 68 RTSemMutexRelease(pData->tcb_mutex); 69 #endif 54 70 if ((tp = (struct tcpcb *)so->so_tcpcb) && 55 71 (tp->t_flags & TF_DELACK)) { … … 59 75 (void) tcp_output(pData, tp); 60 76 } 77 #ifdef VBOX_WITH_SYNC_SLIRP 78 RTSemMutexRequest(pData->tcb_mutex, RT_INDEFINITE_WAIT); 79 RTSemMutexRelease(so->so_mutex); 80 so = so_next; 81 } 82 #endif 83 61 84 } 62 85 … … 78 101 * Search through tcb's and update active timers. 79 102 */ 103 #ifndef VBOX_WITH_SYNC_SLIRP 80 104 ip = tcb.so_next; 81 105 if (ip == 0) 82 106 return; 83 107 for (; ip != &tcb; ip = ipnxt) { 108 #else 109 RTSemMutexRequest(pData->tcb_mutex, RT_INDEFINITE_WAIT); 110 ip = tcb.so_next; 111 if (ip == NULL) { 112 RTSemMutexRelease(pData->tcb_mutex); 113 return; 114 } 115 while (1) { 116 if (ip == &tcb) { 117 RTSemMutexRelease(pData->tcb_mutex); 118 break; 119 } 120 ipnxt = ip->so_next; 121 RTSemMutexRequest(ip->so_mutex, RT_INDEFINITE_WAIT); 122 RTSemMutexRelease(pData->tcb_mutex); 123 #endif 84 124 ipnxt = ip->so_next; 85 125 tp = sototcpcb(ip); 86 126 if (tp == 0) 127 #ifndef VBOX_WITH_SYNC_SLIRP 87 128 continue; 129 #else 130 goto before_loop_ends; 131 #endif 88 132 for (i = 0; i < TCPT_NTIMERS; i++) { 89 133 if (tp->t_timer[i] && --tp->t_timer[i] == 0) { … … 98 142 tpgone: 99 143 ; 144 #ifdef VBOX_WITH_SYNC_SLIRP 145 before_loop_ends: 146 RTSemMutexRequest(pData->tcb_mutex, RT_INDEFINITE_WAIT); 147 RTSemMutexRelease(ip->so_mutex); 148 ip=ipnxt; 149 #endif 100 150 } 101 151 tcp_iss += TCP_ISSINCR/PR_SLOWHZ; /* increment iss */ -
trunk/src/VBox/Devices/Network/slirp/udp.c
r8009 r13604 351 351 } 352 352 } 353 #ifdef VBOX_WITH_SYNC_SLIRP 354 so->so_type = IPPROTO_UDP; 355 #endif 353 356 return(so->s); 354 357 }
Note:
See TracChangeset
for help on using the changeset viewer.