VirtualBox

Ignore:
Timestamp:
Apr 20, 2011 10:05:09 AM (14 years ago)
Author:
vboxsync
Message:

VBoxService/PipeBuf: Fixed deadlocks, added function for pipe peeking.

Location:
trunk/src/VBox/Additions/common/VBoxService
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxService/VBoxServicePipeBuf.cpp

    r36321 r36744  
    114114        }
    115115        rc = RTCritSectLeave(&pBuf->CritSect);
     116    }
     117    return rc;
     118}
     119
     120
     121int VBoxServicePipeBufPeek(PVBOXSERVICECTRLEXECPIPEBUF pBuf,
     122                           uint8_t *pbBuffer, uint32_t cbBuffer,
     123                           uint32_t cbOffset,
     124                           uint32_t *pcbRead, uint32_t *pcbLeft)
     125{
     126    AssertPtrReturn(pBuf, VERR_INVALID_POINTER);
     127    AssertPtrReturn(pbBuffer, VERR_INVALID_POINTER);
     128    AssertReturn(cbBuffer, VERR_INVALID_PARAMETER);
     129
     130    int rc = RTCritSectEnter(&pBuf->CritSect);
     131    if (RT_SUCCESS(rc))
     132    {
     133        Assert(pBuf->cbSize >= pBuf->cbOffset);
     134        if (cbOffset > pBuf->cbSize)
     135            cbOffset = pBuf->cbSize;
     136        uint32_t cbToRead = pBuf->cbSize - cbOffset;
     137        if (cbToRead > cbBuffer)
     138            cbToRead = cbBuffer;
     139        if (cbToRead)
     140        {
     141            memcpy(pbBuffer, pBuf->pbData + cbOffset, cbToRead);
     142            pbBuffer[cbBuffer - 1] = '\0';
     143        }
     144        if (pcbRead)
     145            *pcbRead = cbToRead;
     146        if (pcbLeft)
     147            *pcbLeft = pBuf->cbSize - (cbOffset + cbToRead);
     148
     149        int rc2 = RTCritSectLeave(&pBuf->CritSect);
     150        if (RT_SUCCESS(rc))
     151            rc = rc2;
    116152    }
    117153    return rc;
     
    222258                RTSemEventSignal(pBuf->hEventSem);
    223259            }
    224             int rc2 = RTCritSectLeave(&pBuf->CritSect);
    225             if (RT_SUCCESS(rc))
    226                 rc = rc2;
    227260        }
    228261        else
    229262            rc = VERR_BAD_PIPE;
     263
     264        int rc2 = RTCritSectLeave(&pBuf->CritSect);
     265        if (RT_SUCCESS(rc))
     266            rc = rc2;
    230267    }
    231268    return rc;
     
    377414int VBoxServicePipeBufWaitForEvent(PVBOXSERVICECTRLEXECPIPEBUF pBuf, RTMSINTERVAL cMillies)
    378415{
    379     int rc = RTCritSectEnter(&pBuf->CritSect);
    380     if (RT_SUCCESS(rc))
    381     {
    382         rc = RTSemEventWait(pBuf->hEventSem, cMillies);
    383         int rc2 = RTCritSectLeave(&pBuf->CritSect);
    384         if (RT_SUCCESS(rc))
    385             rc = rc2;
    386     }
    387     return rc;
     416    AssertPtrReturn(pBuf, VERR_INVALID_POINTER);
     417
     418    /* Don't enter the critical section here; someone else could signal the event semaphore
     419     * and this will deadlock then ... */
     420    return RTSemEventWait(pBuf->hEventSem, cMillies);
    388421}
    389422
  • trunk/src/VBox/Additions/common/VBoxService/VBoxServicePipeBuf.h

    r36321 r36744  
    2424int  VBoxServicePipeBufRead(PVBOXSERVICECTRLEXECPIPEBUF pBuf,
    2525                            uint8_t *pbBuffer, uint32_t cbBuffer, uint32_t *pcbToRead);
     26int VBoxServicePipeBufPeek(PVBOXSERVICECTRLEXECPIPEBUF pBuf,
     27                           uint8_t *pbBuffer, uint32_t cbBuffer,
     28                           uint32_t cbOffset,
     29                           uint32_t *pcbRead, uint32_t *pcbLeft);
    2630int  VBoxServicePipeBufWriteToBuf(PVBOXSERVICECTRLEXECPIPEBUF pBuf,
    2731                                  uint8_t *pbData, uint32_t cbData, bool fPendingClose, uint32_t *pcbWritten);
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette