Changeset 11269 in vbox for trunk/src/VBox/Devices/Serial/DrvNamedPipe.cpp
- Timestamp:
- Aug 8, 2008 4:24:48 PM (17 years ago)
- svn:sync-xref-src-repo-rev:
- 34351
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Serial/DrvNamedPipe.cpp
r11267 r11269 103 103 { 104 104 int rc = VINF_SUCCESS; 105 PDRVNAMEDPIPE p Data= PDMISTREAM_2_DRVNAMEDPIPE(pInterface);106 LogFlow(("%s: pvBuf=%p cbRead=%#x (%s)\n", __FUNCTION__, pvBuf, cbRead, p Data->pszLocation));105 PDRVNAMEDPIPE pThis = PDMISTREAM_2_DRVNAMEDPIPE(pInterface); 106 LogFlow(("%s: pvBuf=%p cbRead=%#x (%s)\n", __FUNCTION__, pvBuf, cbRead, pThis->pszLocation)); 107 107 108 108 Assert(pvBuf); 109 109 #ifdef RT_OS_WINDOWS 110 if (p Data->NamedPipe != INVALID_HANDLE_VALUE)110 if (pThis->NamedPipe != INVALID_HANDLE_VALUE) 111 111 { 112 112 DWORD cbReallyRead; 113 p Data->OverlappedRead.Offset = 0;114 p Data->OverlappedRead.OffsetHigh = 0;115 if (!ReadFile(p Data->NamedPipe, pvBuf, *cbRead, &cbReallyRead, &pData->OverlappedRead))113 pThis->OverlappedRead.Offset = 0; 114 pThis->OverlappedRead.OffsetHigh = 0; 115 if (!ReadFile(pThis->NamedPipe, pvBuf, *cbRead, &cbReallyRead, &pThis->OverlappedRead)) 116 116 { 117 117 DWORD uError = GetLastError(); … … 133 133 134 134 /* Wait for incoming bytes. */ 135 if (GetOverlappedResult(p Data->NamedPipe, &pData->OverlappedRead, &cbReallyRead, TRUE) == FALSE)135 if (GetOverlappedResult(pThis->NamedPipe, &pThis->OverlappedRead, &cbReallyRead, TRUE) == FALSE) 136 136 uError = GetLastError(); 137 137 } … … 144 144 if (RT_FAILURE(rc)) 145 145 { 146 Log(("drvNamedPipeRead: FileRead returned %Vrc fShutdown=%d\n", rc, p Data->fShutdown));147 if ( !p Data->fShutdown146 Log(("drvNamedPipeRead: FileRead returned %Vrc fShutdown=%d\n", rc, pThis->fShutdown)); 147 if ( !pThis->fShutdown 148 148 && ( rc == VERR_EOF 149 149 || rc == VERR_BROKEN_PIPE … … 152 152 153 153 { 154 FlushFileBuffers(p Data->NamedPipe);155 DisconnectNamedPipe(p Data->NamedPipe);156 if (!p Data->fIsServer)154 FlushFileBuffers(pThis->NamedPipe); 155 DisconnectNamedPipe(pThis->NamedPipe); 156 if (!pThis->fIsServer) 157 157 { 158 CloseHandle(p Data->NamedPipe);159 p Data->NamedPipe = INVALID_HANDLE_VALUE;158 CloseHandle(pThis->NamedPipe); 159 pThis->NamedPipe = INVALID_HANDLE_VALUE; 160 160 } 161 161 /* pretend success */ … … 167 167 } 168 168 #else /* !RT_OS_WINDOWS */ 169 if (p Data->LocalSocket != NIL_RTSOCKET)169 if (pThis->LocalSocket != NIL_RTSOCKET) 170 170 { 171 171 ssize_t cbReallyRead; 172 cbReallyRead = recv(p Data->LocalSocket, pvBuf, *cbRead, 0);172 cbReallyRead = recv(pThis->LocalSocket, pvBuf, *cbRead, 0); 173 173 if (cbReallyRead == 0) 174 174 { 175 RTSOCKET tmp = p Data->LocalSocket;176 p Data->LocalSocket = NIL_RTSOCKET;175 RTSOCKET tmp = pThis->LocalSocket; 176 pThis->LocalSocket = NIL_RTSOCKET; 177 177 close(tmp); 178 178 } … … 200 200 { 201 201 int rc = VINF_SUCCESS; 202 PDRVNAMEDPIPE p Data= PDMISTREAM_2_DRVNAMEDPIPE(pInterface);203 LogFlow(("%s: pvBuf=%p cbWrite=%#x (%s)\n", __FUNCTION__, pvBuf, cbWrite, p Data->pszLocation));202 PDRVNAMEDPIPE pThis = PDMISTREAM_2_DRVNAMEDPIPE(pInterface); 203 LogFlow(("%s: pvBuf=%p cbWrite=%#x (%s)\n", __FUNCTION__, pvBuf, cbWrite, pThis->pszLocation)); 204 204 205 205 Assert(pvBuf); 206 206 #ifdef RT_OS_WINDOWS 207 if (p Data->NamedPipe != INVALID_HANDLE_VALUE)207 if (pThis->NamedPipe != INVALID_HANDLE_VALUE) 208 208 { 209 209 unsigned cbWritten; 210 p Data->OverlappedWrite.Offset = 0;211 p Data->OverlappedWrite.OffsetHigh = 0;212 if (!WriteFile(p Data->NamedPipe, pvBuf, *cbWrite, NULL, &pData->OverlappedWrite))210 pThis->OverlappedWrite.Offset = 0; 211 pThis->OverlappedWrite.OffsetHigh = 0; 212 if (!WriteFile(pThis->NamedPipe, pvBuf, *cbWrite, NULL, &pThis->OverlappedWrite)) 213 213 { 214 214 DWORD uError = GetLastError(); … … 229 229 { 230 230 /* Wait for the write to complete. */ 231 if (GetOverlappedResult(p Data->NamedPipe, &pData->OverlappedWrite, (DWORD *)&cbWritten, TRUE) == FALSE)231 if (GetOverlappedResult(pThis->NamedPipe, &pThis->OverlappedWrite, (DWORD *)&cbWritten, TRUE) == FALSE) 232 232 uError = GetLastError(); 233 233 } … … 241 241 || rc == VERR_BROKEN_PIPE) 242 242 { 243 FlushFileBuffers(p Data->NamedPipe);244 DisconnectNamedPipe(p Data->NamedPipe);245 if (!p Data->fIsServer)243 FlushFileBuffers(pThis->NamedPipe); 244 DisconnectNamedPipe(pThis->NamedPipe); 245 if (!pThis->fIsServer) 246 246 { 247 CloseHandle(p Data->NamedPipe);248 p Data->NamedPipe = INVALID_HANDLE_VALUE;247 CloseHandle(pThis->NamedPipe); 248 pThis->NamedPipe = INVALID_HANDLE_VALUE; 249 249 } 250 250 /* pretend success */ … … 256 256 } 257 257 #else /* !RT_OS_WINDOWS */ 258 if (p Data->LocalSocket != NIL_RTSOCKET)258 if (pThis->LocalSocket != NIL_RTSOCKET) 259 259 { 260 260 ssize_t cbWritten; 261 cbWritten = send(p Data->LocalSocket, pvBuf, *cbWrite, 0);261 cbWritten = send(pThis->LocalSocket, pvBuf, *cbWrite, 0); 262 262 if (cbWritten == 0) 263 263 { 264 RTSOCKET tmp = p Data->LocalSocket;265 p Data->LocalSocket = NIL_RTSOCKET;264 RTSOCKET tmp = pThis->LocalSocket; 265 pThis->LocalSocket = NIL_RTSOCKET; 266 266 close(tmp); 267 267 } … … 316 316 static DECLCALLBACK(int) drvNamedPipeListenLoop(RTTHREAD ThreadSelf, void *pvUser) 317 317 { 318 PDRVNAMEDPIPE p Data= (PDRVNAMEDPIPE)pvUser;318 PDRVNAMEDPIPE pThis = (PDRVNAMEDPIPE)pvUser; 319 319 int rc = VINF_SUCCESS; 320 320 #ifdef RT_OS_WINDOWS 321 HANDLE NamedPipe = p Data->NamedPipe;321 HANDLE NamedPipe = pThis->NamedPipe; 322 322 HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, 0); 323 323 #endif 324 324 325 while (RT_LIKELY(!p Data->fShutdown))325 while (RT_LIKELY(!pThis->fShutdown)) 326 326 { 327 327 #ifdef RT_OS_WINDOWS … … 333 333 BOOL fConnected = ConnectNamedPipe(NamedPipe, &overlapped); 334 334 if ( !fConnected 335 && !p Data->fShutdown)335 && !pThis->fShutdown) 336 336 { 337 337 DWORD hrc = GetLastError(); … … 342 342 343 343 hrc = 0; 344 if (GetOverlappedResult(p Data->NamedPipe, &overlapped, &dummy, TRUE) == FALSE)344 if (GetOverlappedResult(pThis->NamedPipe, &overlapped, &dummy, TRUE) == FALSE) 345 345 hrc = GetLastError(); 346 346 347 347 } 348 348 349 if (p Data->fShutdown)349 if (pThis->fShutdown) 350 350 break; 351 351 352 352 if (hrc == ERROR_PIPE_CONNECTED) 353 353 { 354 RTSemEventWait(p Data->ListenSem, 250);354 RTSemEventWait(pThis->ListenSem, 250); 355 355 } 356 356 else if (hrc != ERROR_SUCCESS) 357 357 { 358 358 rc = RTErrConvertFromWin32(hrc); 359 LogRel(("NamedPipe%d: ConnectNamedPipe failed, rc=%Vrc\n", p Data->pDrvIns->iInstance, rc));359 LogRel(("NamedPipe%d: ConnectNamedPipe failed, rc=%Vrc\n", pThis->pDrvIns->iInstance, rc)); 360 360 break; 361 361 } 362 362 } 363 363 #else /* !RT_OS_WINDOWS */ 364 if (listen(p Data->LocalSocketServer, 0) == -1)364 if (listen(pThis->LocalSocketServer, 0) == -1) 365 365 { 366 366 rc = RTErrConvertFromErrno(errno); 367 LogRel(("NamedPipe%d: listen failed, rc=%Vrc\n", p Data->pDrvIns->iInstance, rc));367 LogRel(("NamedPipe%d: listen failed, rc=%Vrc\n", pThis->pDrvIns->iInstance, rc)); 368 368 break; 369 369 } 370 int s = accept(p Data->LocalSocketServer, NULL, NULL);370 int s = accept(pThis->LocalSocketServer, NULL, NULL); 371 371 if (s == -1) 372 372 { 373 373 rc = RTErrConvertFromErrno(errno); 374 LogRel(("NamedPipe%d: accept failed, rc=%Vrc\n", p Data->pDrvIns->iInstance, rc));374 LogRel(("NamedPipe%d: accept failed, rc=%Vrc\n", pThis->pDrvIns->iInstance, rc)); 375 375 break; 376 376 } 377 377 else 378 378 { 379 if (p Data->LocalSocket != NIL_RTSOCKET)380 { 381 LogRel(("NamedPipe%d: only single connection supported\n", p Data->pDrvIns->iInstance));379 if (pThis->LocalSocket != NIL_RTSOCKET) 380 { 381 LogRel(("NamedPipe%d: only single connection supported\n", pThis->pDrvIns->iInstance)); 382 382 close(s); 383 383 } 384 384 else 385 p Data->LocalSocket = s;385 pThis->LocalSocket = s; 386 386 } 387 387 #endif /* !RT_OS_WINDOWS */ … … 391 391 CloseHandle(hEvent); 392 392 #endif 393 p Data->ListenThread = NIL_RTTHREAD;393 pThis->ListenThread = NIL_RTTHREAD; 394 394 return VINF_SUCCESS; 395 395 } … … 410 410 int rc; 411 411 char *pszLocation = NULL; 412 PDRVNAMEDPIPE p Data= PDMINS_2_DATA(pDrvIns, PDRVNAMEDPIPE);412 PDRVNAMEDPIPE pThis = PDMINS_2_DATA(pDrvIns, PDRVNAMEDPIPE); 413 413 414 414 /* 415 415 * Init the static parts. 416 416 */ 417 p Data->pDrvIns = pDrvIns;418 p Data->pszLocation = NULL;419 p Data->fIsServer = false;420 #ifdef RT_OS_WINDOWS 421 p Data->NamedPipe = INVALID_HANDLE_VALUE;422 #else /* !RT_OS_WINDOWS */ 423 p Data->LocalSocketServer = NIL_RTSOCKET;424 p Data->LocalSocket = NIL_RTSOCKET;425 #endif /* !RT_OS_WINDOWS */ 426 p Data->ListenThread = NIL_RTTHREAD;427 p Data->fShutdown = false;417 pThis->pDrvIns = pDrvIns; 418 pThis->pszLocation = NULL; 419 pThis->fIsServer = false; 420 #ifdef RT_OS_WINDOWS 421 pThis->NamedPipe = INVALID_HANDLE_VALUE; 422 #else /* !RT_OS_WINDOWS */ 423 pThis->LocalSocketServer = NIL_RTSOCKET; 424 pThis->LocalSocket = NIL_RTSOCKET; 425 #endif /* !RT_OS_WINDOWS */ 426 pThis->ListenThread = NIL_RTTHREAD; 427 pThis->fShutdown = false; 428 428 /* IBase */ 429 429 pDrvIns->IBase.pfnQueryInterface = drvNamedPipeQueryInterface; 430 430 /* IStream */ 431 p Data->IStream.pfnRead = drvNamedPipeRead;432 p Data->IStream.pfnWrite = drvNamedPipeWrite;431 pThis->IStream.pfnRead = drvNamedPipeRead; 432 pThis->IStream.pfnWrite = drvNamedPipeWrite; 433 433 434 434 /* … … 447 447 goto out; 448 448 } 449 p Data->pszLocation = pszLocation;449 pThis->pszLocation = pszLocation; 450 450 451 451 bool fIsServer; … … 456 456 goto out; 457 457 } 458 p Data->fIsServer = fIsServer;458 pThis->fIsServer = fIsServer; 459 459 460 460 #ifdef RT_OS_WINDOWS 461 461 if (fIsServer) 462 462 { 463 HANDLE hPipe = CreateNamedPipe(p Data->pszLocation, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, 1, 32, 32, 10000, NULL);463 HANDLE hPipe = CreateNamedPipe(pThis->pszLocation, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, 1, 32, 32, 10000, NULL); 464 464 if (hPipe == INVALID_HANDLE_VALUE) 465 465 { 466 466 rc = RTErrConvertFromWin32(GetLastError()); 467 LogRel(("NamedPipe%d: CreateNamedPipe failed rc=%Vrc\n", p Data->pDrvIns->iInstance));467 LogRel(("NamedPipe%d: CreateNamedPipe failed rc=%Vrc\n", pThis->pDrvIns->iInstance)); 468 468 return PDMDrvHlpVMSetError(pDrvIns, rc, RT_SRC_POS, N_("NamedPipe#%d failed to create named pipe %s"), pDrvIns->iInstance, pszLocation); 469 469 } 470 p Data->NamedPipe = hPipe;471 472 rc = RTSemEventCreate(&p Data->ListenSem);470 pThis->NamedPipe = hPipe; 471 472 rc = RTSemEventCreate(&pThis->ListenSem); 473 473 AssertRC(rc); 474 474 475 rc = RTThreadCreate(&p Data->ListenThread, drvNamedPipeListenLoop, (void *)pData, 0, RTTHREADTYPE_IO, RTTHREADFLAGS_WAITABLE, "SerPipe");475 rc = RTThreadCreate(&pThis->ListenThread, drvNamedPipeListenLoop, (void *)pThis, 0, RTTHREADTYPE_IO, RTTHREADFLAGS_WAITABLE, "SerPipe"); 476 476 if RT_FAILURE(rc) 477 477 return PDMDrvHlpVMSetError(pDrvIns, rc, RT_SRC_POS, N_("NamedPipe#%d failed to create listening thread"), pDrvIns->iInstance); … … 481 481 { 482 482 /* Connect to the named pipe. */ 483 HANDLE hPipe = CreateFile(p Data->pszLocation, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);483 HANDLE hPipe = CreateFile(pThis->pszLocation, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); 484 484 if (hPipe == INVALID_HANDLE_VALUE) 485 485 { 486 486 rc = RTErrConvertFromWin32(GetLastError()); 487 LogRel(("NamedPipe%d: CreateFile failed rc=%Vrc\n", p Data->pDrvIns->iInstance));487 LogRel(("NamedPipe%d: CreateFile failed rc=%Vrc\n", pThis->pDrvIns->iInstance)); 488 488 return PDMDrvHlpVMSetError(pDrvIns, rc, RT_SRC_POS, N_("NamedPipe#%d failed to connect to named pipe %s"), pDrvIns->iInstance, pszLocation); 489 489 } 490 p Data->NamedPipe = hPipe;491 } 492 493 memset(&p Data->OverlappedWrite, 0, sizeof(pData->OverlappedWrite));494 memset(&p Data->OverlappedRead, 0, sizeof(pData->OverlappedRead));495 p Data->OverlappedWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);496 p Data->OverlappedRead.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);490 pThis->NamedPipe = hPipe; 491 } 492 493 memset(&pThis->OverlappedWrite, 0, sizeof(pThis->OverlappedWrite)); 494 memset(&pThis->OverlappedRead, 0, sizeof(pThis->OverlappedRead)); 495 pThis->OverlappedWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); 496 pThis->OverlappedRead.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); 497 497 #else /* !RT_OS_WINDOWS */ 498 498 int s; … … 512 512 if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) == -1) 513 513 return PDMDrvHlpVMSetError(pDrvIns, RTErrConvertFromErrno(errno), RT_SRC_POS, N_("NamedPipe#%d failed to bind to local socket %s"), pDrvIns->iInstance, pszLocation); 514 p Data->LocalSocketServer = s;515 rc = RTThreadCreate(&p Data->ListenThread, drvNamedPipeListenLoop, (void *)pData, 0, RTTHREADTYPE_IO, RTTHREADFLAGS_WAITABLE, "SerPipe");514 pThis->LocalSocketServer = s; 515 rc = RTThreadCreate(&pThis->ListenThread, drvNamedPipeListenLoop, (void *)pThis, 0, RTTHREADTYPE_IO, RTTHREADFLAGS_WAITABLE, "SerPipe"); 516 516 if RT_FAILURE(rc) 517 517 return PDMDrvHlpVMSetError(pDrvIns, rc, RT_SRC_POS, N_("NamedPipe#%d failed to create listening thread"), pDrvIns->iInstance); … … 522 522 if (connect(s, (struct sockaddr *)&addr, sizeof(addr)) == -1) 523 523 return PDMDrvHlpVMSetError(pDrvIns, RTErrConvertFromErrno(errno), RT_SRC_POS, N_("NamedPipe#%d failed to connect to local socket %s"), pDrvIns->iInstance, pszLocation); 524 p Data->LocalSocket = s;524 pThis->LocalSocket = s; 525 525 } 526 526 #endif /* !RT_OS_WINDOWS */ … … 550 550 static DECLCALLBACK(void) drvNamedPipeDestruct(PPDMDRVINS pDrvIns) 551 551 { 552 PDRVNAMEDPIPE p Data= PDMINS_2_DATA(pDrvIns, PDRVNAMEDPIPE);553 LogFlow(("%s: %s\n", __FUNCTION__, p Data->pszLocation));554 555 if (p Data->ListenThread)556 { 557 RTThreadWait(p Data->ListenThread, 250, NULL);558 if (p Data->ListenThread != NIL_RTTHREAD)552 PDRVNAMEDPIPE pThis = PDMINS_2_DATA(pDrvIns, PDRVNAMEDPIPE); 553 LogFlow(("%s: %s\n", __FUNCTION__, pThis->pszLocation)); 554 555 if (pThis->ListenThread) 556 { 557 RTThreadWait(pThis->ListenThread, 250, NULL); 558 if (pThis->ListenThread != NIL_RTTHREAD) 559 559 LogRel(("NamedPipe%d: listen thread did not terminate\n", pDrvIns->iInstance)); 560 560 } 561 561 562 if (p Data->pszLocation)563 MMR3HeapFree(p Data->pszLocation);562 if (pThis->pszLocation) 563 MMR3HeapFree(pThis->pszLocation); 564 564 } 565 565 … … 574 574 static DECLCALLBACK(void) drvNamedPipePowerOff(PPDMDRVINS pDrvIns) 575 575 { 576 PDRVNAMEDPIPE p Data= PDMINS_2_DATA(pDrvIns, PDRVNAMEDPIPE);577 LogFlow(("%s: %s\n", __FUNCTION__, p Data->pszLocation));578 579 p Data->fShutdown = true;580 581 #ifdef RT_OS_WINDOWS 582 if (p Data->NamedPipe != INVALID_HANDLE_VALUE)583 { 584 if (p Data->fIsServer)585 { 586 FlushFileBuffers(p Data->NamedPipe);587 DisconnectNamedPipe(p Data->NamedPipe);588 } 589 590 CloseHandle(p Data->NamedPipe);591 p Data->NamedPipe = INVALID_HANDLE_VALUE;592 CloseHandle(p Data->OverlappedRead.hEvent);593 CloseHandle(p Data->OverlappedWrite.hEvent);594 } 595 if (p Data->fIsServer)576 PDRVNAMEDPIPE pThis = PDMINS_2_DATA(pDrvIns, PDRVNAMEDPIPE); 577 LogFlow(("%s: %s\n", __FUNCTION__, pThis->pszLocation)); 578 579 pThis->fShutdown = true; 580 581 #ifdef RT_OS_WINDOWS 582 if (pThis->NamedPipe != INVALID_HANDLE_VALUE) 583 { 584 if (pThis->fIsServer) 585 { 586 FlushFileBuffers(pThis->NamedPipe); 587 DisconnectNamedPipe(pThis->NamedPipe); 588 } 589 590 CloseHandle(pThis->NamedPipe); 591 pThis->NamedPipe = INVALID_HANDLE_VALUE; 592 CloseHandle(pThis->OverlappedRead.hEvent); 593 CloseHandle(pThis->OverlappedWrite.hEvent); 594 } 595 if (pThis->fIsServer) 596 596 { 597 597 /* Wake up listen thread */ 598 RTSemEventSignal(p Data->ListenSem);599 RTSemEventDestroy(p Data->ListenSem);600 } 601 #else /* !RT_OS_WINDOWS */ 602 if (p Data->fIsServer)603 { 604 if (p Data->LocalSocketServer != NIL_RTSOCKET)605 close(p Data->LocalSocketServer);606 if (p Data->pszLocation)607 RTFileDelete(p Data->pszLocation);598 RTSemEventSignal(pThis->ListenSem); 599 RTSemEventDestroy(pThis->ListenSem); 600 } 601 #else /* !RT_OS_WINDOWS */ 602 if (pThis->fIsServer) 603 { 604 if (pThis->LocalSocketServer != NIL_RTSOCKET) 605 close(pThis->LocalSocketServer); 606 if (pThis->pszLocation) 607 RTFileDelete(pThis->pszLocation); 608 608 } 609 609 else 610 610 { 611 if (p Data->LocalSocket != NIL_RTSOCKET)612 close(p Data->LocalSocket);611 if (pThis->LocalSocket != NIL_RTSOCKET) 612 close(pThis->LocalSocket); 613 613 } 614 614 #endif /* !RT_OS_WINDOWS */
Note:
See TracChangeset
for help on using the changeset viewer.