本文整理汇总了C++中RT_MIN函数的典型用法代码示例。如果您正苦于以下问题:C++ RT_MIN函数的具体用法?C++ RT_MIN怎么用?C++ RT_MIN使用的例子?那么, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了RT_MIN函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: parallelsWrite
/** @copydoc VBOXHDDBACKEND::pfnWrite */
static int parallelsWrite(void *pBackendData, uint64_t uOffset, const void *pvBuf,
size_t cbToWrite, size_t *pcbWriteProcess,
size_t *pcbPreRead, size_t *pcbPostRead, unsigned fWrite)
{
LogFlowFunc(("pBackendData=%#p uOffset=%llu pvBuf=%#p cbToWrite=%zu pcbWriteProcess=%#p\n",
pBackendData, uOffset, pvBuf, cbToWrite, pcbWriteProcess));
PPARALLELSIMAGE pImage = (PPARALLELSIMAGE)pBackendData;
int rc = VINF_SUCCESS;
AssertPtr(pImage);
Assert(uOffset % 512 == 0);
Assert(cbToWrite % 512 == 0);
if (pImage->uImageFlags & VD_IMAGE_FLAGS_FIXED)
rc = vdIfIoIntFileWriteSync(pImage->pIfIo, pImage->pStorage, uOffset,
pvBuf, cbToWrite, NULL);
else
{
uint64_t uSector;
uint64_t uOffsetInFile;
uint32_t iIndexInAllocationTable;
/* Calculate offset in the real file. */
uSector = uOffset / 512;
/* One chunk in the file is always one track big. */
iIndexInAllocationTable = (uint32_t)(uSector / pImage->PCHSGeometry.cSectors);
uSector = uSector % pImage->PCHSGeometry.cSectors;
Assert(iIndexInAllocationTable < pImage->cAllocationBitmapEntries);
cbToWrite = RT_MIN(cbToWrite, (pImage->PCHSGeometry.cSectors - uSector)*512);
LogFlowFunc(("AllocationBitmap[%u]=%u uSector=%u cbToWrite=%zu cAllocationBitmapEntries=%u\n",
iIndexInAllocationTable, pImage->pAllocationBitmap[iIndexInAllocationTable],
uSector, cbToWrite, pImage->cAllocationBitmapEntries));
if (pImage->pAllocationBitmap[iIndexInAllocationTable] == 0)
{
if ( cbToWrite == pImage->PCHSGeometry.cSectors * 512
&& !(fWrite & VD_WRITE_NO_ALLOC))
{
/* Stay on the safe side. Do not run the risk of confusing the higher
* level, as that can be pretty lethal to image consistency. */
*pcbPreRead = 0;
*pcbPostRead = 0;
/* Allocate new chunk in the file. */
AssertMsg(pImage->cbFileCurrent % 512 == 0, ("File size is not a multiple of 512\n"));
pImage->pAllocationBitmap[iIndexInAllocationTable] = (uint32_t)(pImage->cbFileCurrent / 512);
pImage->cbFileCurrent += pImage->PCHSGeometry.cSectors * 512;
pImage->fAllocationBitmapChanged = true;
uOffsetInFile = (uint64_t)pImage->pAllocationBitmap[iIndexInAllocationTable] * 512;
LogFlowFunc(("uOffsetInFile=%llu\n", uOffsetInFile));
/*
* Write the new block at the current end of the file.
*/
rc = vdIfIoIntFileWriteSync(pImage->pIfIo, pImage->pStorage,
uOffsetInFile, pvBuf, cbToWrite, NULL);
}
else
{
/* Trying to do a partial write to an unallocated cluster. Don't do
* anything except letting the upper layer know what to do. */
*pcbPreRead = uSector * 512;
*pcbPostRead = (pImage->PCHSGeometry.cSectors * 512) - cbToWrite - *pcbPreRead;
rc = VERR_VD_BLOCK_FREE;
}
}
else
{
uOffsetInFile = ((uint64_t)pImage->pAllocationBitmap[iIndexInAllocationTable] + uSector) * 512;
LogFlowFunc(("uOffsetInFile=%llu\n", uOffsetInFile));
rc = vdIfIoIntFileWriteSync(pImage->pIfIo, pImage->pStorage, uOffsetInFile,
pvBuf, cbToWrite, NULL);
}
}
if (pcbWriteProcess)
*pcbWriteProcess = cbToWrite;
out:
LogFlowFunc(("returns %Rrc\n", rc));
return rc;
}
示例2: RTR3DECL
RTR3DECL(int) RTFileRead(RTFILE hFile, void *pvBuf, size_t cbToRead, size_t *pcbRead)
{
if (cbToRead <= 0)
return VINF_SUCCESS;
ULONG cbToReadAdj = (ULONG)cbToRead;
AssertReturn(cbToReadAdj == cbToRead, VERR_NUMBER_TOO_BIG);
ULONG cbRead = 0;
if (ReadFile((HANDLE)RTFileToNative(hFile), pvBuf, cbToReadAdj, &cbRead, NULL))
{
if (pcbRead)
/* Caller can handle partial reads. */
*pcbRead = cbRead;
else
{
/* Caller expects everything to be read. */
while (cbToReadAdj > cbRead)
{
ULONG cbReadPart = 0;
if (!ReadFile((HANDLE)RTFileToNative(hFile), (char*)pvBuf + cbRead, cbToReadAdj - cbRead, &cbReadPart, NULL))
return RTErrConvertFromWin32(GetLastError());
if (cbReadPart == 0)
return VERR_EOF;
cbRead += cbReadPart;
}
}
return VINF_SUCCESS;
}
/*
* If it's a console, we might bump into out of memory conditions in the
* ReadConsole call.
*/
DWORD dwErr = GetLastError();
if (dwErr == ERROR_NOT_ENOUGH_MEMORY)
{
ULONG cbChunk = cbToReadAdj / 2;
if (cbChunk > 16*_1K)
cbChunk = 16*_1K;
else
cbChunk = RT_ALIGN_32(cbChunk, 256);
cbRead = 0;
while (cbToReadAdj > cbRead)
{
ULONG cbToRead = RT_MIN(cbChunk, cbToReadAdj - cbRead);
ULONG cbReadPart = 0;
if (!ReadFile((HANDLE)RTFileToNative(hFile), (char *)pvBuf + cbRead, cbToRead, &cbReadPart, NULL))
{
/* If we failed because the buffer is too big, shrink it and
try again. */
dwErr = GetLastError();
if ( dwErr == ERROR_NOT_ENOUGH_MEMORY
&& cbChunk > 8)
{
cbChunk /= 2;
continue;
}
return RTErrConvertFromWin32(dwErr);
}
cbRead += cbReadPart;
/* Return if the caller can handle partial reads, otherwise try
fill the buffer all the way up. */
if (pcbRead)
{
*pcbRead = cbRead;
break;
}
if (cbReadPart == 0)
return VERR_EOF;
}
return VINF_SUCCESS;
}
return RTErrConvertFromWin32(dwErr);
}
示例3: rtUtf16Length
/**
* Get get length in code points of an UTF-16 encoded string, validating the
* string while doing so.
*
* @returns IPRT status code.
* @param pwsz Pointer to the UTF-16 string.
* @param cwc The max length of the string in UTF-16 units. Use
* RTSTR_MAX if all of the string is to be examined.
* @param pcuc Where to store the length in unicode code points.
* @param pcwcActual Where to store the actual size of the UTF-16 string
* on success. Optional.
*/
static int rtUtf16Length(PCRTUTF16 pwsz, size_t cwc, size_t *pcuc, size_t *pcwcActual)
{
PCRTUTF16 pwszStart = pwsz;
size_t cCodePoints = 0;
while (cwc > 0)
{
RTUTF16 wc = *pwsz;
if (!wc)
break;
if (wc < 0xd800 || wc > 0xdfff)
{
cCodePoints++;
pwsz++;
cwc--;
}
/* Surrogate pair: */
else if (wc >= 0xdc00)
{
RTStrAssertMsgFailed(("Lone UTF-16 trail surrogate: %#x (%.*Rhxs)\n", wc, RT_MIN(cwc * 2, 10), pwsz));
return VERR_INVALID_UTF16_ENCODING;
}
else if (cwc < 2)
{
RTStrAssertMsgFailed(("Lone UTF-16 lead surrogate: %#x\n", wc));
return VERR_INVALID_UTF16_ENCODING;
}
else
{
RTUTF16 wcTrail = pwsz[1];
if (wcTrail < 0xdc00 || wcTrail > 0xdfff)
{
RTStrAssertMsgFailed(("Invalid UTF-16 trail surrogate: %#x (lead %#x)\n", wcTrail, wc));
return VERR_INVALID_UTF16_ENCODING;
}
cCodePoints++;
pwsz += 2;
cwc -= 2;
}
}
/* done */
*pcuc = cCodePoints;
if (pcwcActual)
*pcwcActual = pwsz - pwszStart;
return VINF_SUCCESS;
}
示例4: drvdiskintDiscardRecords
/**
* Discards the given ranges from the disk.
*
* @returns VBox status code.
* @param pThis Disk integrity driver instance data.
* @param paRanges Array of ranges to discard.
* @param cRanges Number of ranges in the array.
*/
static int drvdiskintDiscardRecords(PDRVDISKINTEGRITY pThis, PCRTRANGE paRanges, unsigned cRanges)
{
int rc = VINF_SUCCESS;
LogFlowFunc(("pThis=%#p paRanges=%#p cRanges=%u\n", pThis, paRanges, cRanges));
for (unsigned i = 0; i < cRanges; i++)
{
uint64_t offStart = paRanges[i].offStart;
size_t cbLeft = paRanges[i].cbRange;
LogFlowFunc(("Discarding off=%llu cbRange=%zu\n", offStart, cbLeft));
while (cbLeft)
{
size_t cbRange;
PDRVDISKSEGMENT pSeg = (PDRVDISKSEGMENT)RTAvlrFileOffsetRangeGet(pThis->pTreeSegments, offStart);
if (!pSeg)
{
/* Get next segment */
pSeg = (PDRVDISKSEGMENT)RTAvlrFileOffsetGetBestFit(pThis->pTreeSegments, offStart, true);
if ( !pSeg
|| (RTFOFF)offStart + (RTFOFF)cbLeft <= pSeg->Core.Key)
cbRange = cbLeft;
else
cbRange = pSeg->Core.Key - offStart;
Assert(!(cbRange % 512));
}
else
{
size_t cbPreLeft, cbPostLeft;
cbRange = RT_MIN(cbLeft, pSeg->Core.KeyLast - offStart + 1);
cbPreLeft = offStart - pSeg->Core.Key;
cbPostLeft = pSeg->cbSeg - cbRange - cbPreLeft;
Assert(!(cbRange % 512));
Assert(!(cbPreLeft % 512));
Assert(!(cbPostLeft % 512));
LogFlowFunc(("cbRange=%zu cbPreLeft=%zu cbPostLeft=%zu\n",
cbRange, cbPreLeft, cbPostLeft));
RTAvlrFileOffsetRemove(pThis->pTreeSegments, pSeg->Core.Key);
if (!cbPreLeft && !cbPostLeft)
{
/* Just free the whole segment. */
LogFlowFunc(("Freeing whole segment pSeg=%#p\n", pSeg));
RTMemFree(pSeg->pbSeg);
for (unsigned idx = 0; idx < pSeg->cIoLogEntries; idx++)
drvdiskintIoLogEntryRelease(pSeg->apIoLog[idx]);
RTMemFree(pSeg);
}
else if (cbPreLeft && !cbPostLeft)
{
/* Realloc to new size and insert. */
LogFlowFunc(("Realloc segment pSeg=%#p\n", pSeg));
pSeg->pbSeg = (uint8_t *)RTMemRealloc(pSeg->pbSeg, cbPreLeft);
for (unsigned idx = cbPreLeft / 512; idx < pSeg->cIoLogEntries; idx++)
drvdiskintIoLogEntryRelease(pSeg->apIoLog[idx]);
pSeg = (PDRVDISKSEGMENT)RTMemRealloc(pSeg, RT_OFFSETOF(DRVDISKSEGMENT, apIoLog[cbPreLeft / 512]));
pSeg->Core.KeyLast = pSeg->Core.Key + cbPreLeft - 1;
pSeg->cbSeg = cbPreLeft;
pSeg->cIoLogEntries = cbPreLeft / 512;
bool fInserted = RTAvlrFileOffsetInsert(pThis->pTreeSegments, &pSeg->Core);
Assert(fInserted);
}
else if (!cbPreLeft && cbPostLeft)
{
/* Move data to the front and realloc. */
LogFlowFunc(("Move data and realloc segment pSeg=%#p\n", pSeg));
memmove(pSeg->pbSeg, pSeg->pbSeg + cbRange, cbPostLeft);
for (unsigned idx = 0; idx < cbRange / 512; idx++)
drvdiskintIoLogEntryRelease(pSeg->apIoLog[idx]);
for (unsigned idx = 0; idx < cbPostLeft /512; idx++)
pSeg->apIoLog[idx] = pSeg->apIoLog[(cbRange / 512) + idx];
pSeg = (PDRVDISKSEGMENT)RTMemRealloc(pSeg, RT_OFFSETOF(DRVDISKSEGMENT, apIoLog[cbPostLeft / 512]));
pSeg->pbSeg = (uint8_t *)RTMemRealloc(pSeg->pbSeg, cbPostLeft);
pSeg->Core.Key += cbRange;
pSeg->cbSeg = cbPostLeft;
pSeg->cIoLogEntries = cbPostLeft / 512;
bool fInserted = RTAvlrFileOffsetInsert(pThis->pTreeSegments, &pSeg->Core);
Assert(fInserted);
}
else
{
/* Split the segment into 2 new segments. */
LogFlowFunc(("Split segment pSeg=%#p\n", pSeg));
PDRVDISKSEGMENT pSegPost = (PDRVDISKSEGMENT)RTMemAllocZ(RT_OFFSETOF(DRVDISKSEGMENT, apIoLog[cbPostLeft / 512]));
//.........这里部分代码省略.........
示例5: RTDECL
RTDECL(int) RTSymlinkCreate(const char *pszSymlink, const char *pszTarget, RTSYMLINKTYPE enmType, uint32_t fCreate)
{
/*
* Validate the input.
*/
AssertReturn(enmType > RTSYMLINKTYPE_INVALID && enmType < RTSYMLINKTYPE_END, VERR_INVALID_PARAMETER);
AssertPtrReturn(pszSymlink, VERR_INVALID_POINTER);
AssertPtrReturn(pszTarget, VERR_INVALID_POINTER);
/*
* Resolve the API.
*/
typedef BOOLEAN (WINAPI *PFNCREATESYMBOLICLINKW)(LPCWSTR, LPCWSTR, DWORD);
static PFNCREATESYMBOLICLINKW s_pfnCreateSymbolicLinkW = NULL;
static bool s_fTried = FALSE;
if (!s_fTried)
{
HMODULE hmod = LoadLibrary("KERNEL32.DLL");
if (hmod)
{
PFNCREATESYMBOLICLINKW pfn = (PFNCREATESYMBOLICLINKW)GetProcAddress(hmod, "CreateSymbolicLinkW");
if (pfn)
s_pfnCreateSymbolicLinkW = pfn;
}
s_fTried = true;
}
if (!s_pfnCreateSymbolicLinkW)
{
LogFlow(("RTSymlinkCreate(%p={%s}, %p={%s}, %d, %#x): returns VERR_NOT_SUPPORTED - Windows API not found\n",
pszSymlink, pszSymlink, pszTarget, pszTarget, enmType, fCreate));
return VERR_NOT_SUPPORTED;
}
/*
* Convert the paths.
*/
PRTUTF16 pwszNativeSymlink;
int rc = RTStrToUtf16(pszSymlink, &pwszNativeSymlink);
if (RT_SUCCESS(rc))
{
PRTUTF16 pwszNativeTarget;
rc = RTStrToUtf16(pszTarget, &pwszNativeTarget);
if (RT_SUCCESS(rc))
{
/*
* Massage the target path, determin the link type.
*/
size_t cchTarget = strlen(pszTarget);
size_t cchVolSpecTarget = rtPathVolumeSpecLen(pszTarget);
#if 0 /* looks like this isn't needed after all. That makes everything much simper :-) */
if ( cchTarget > RT_MIN(cchVolSpecTarget, 1)
&& RTPATH_IS_SLASH(pszTarget[cchTarget - 1]))
{
size_t cwcNativeTarget = RTUtf16Len(pwszNativeTarget);
size_t offFromEnd = 1;
while ( offFromEnd < cchTarget
&& cchTarget - offFromEnd >= cchVolSpecTarget
&& RTPATH_IS_SLASH(pszTarget[cchTarget - offFromEnd]))
{
Assert(offFromEnd < cwcNativeTarget);
pwszNativeTarget[cwcNativeTarget - offFromEnd] = 0;
offFromEnd++;
}
}
#endif
if (enmType == RTSYMLINKTYPE_UNKNOWN)
{
if ( cchTarget > cchVolSpecTarget
&& RTPATH_IS_SLASH(pszTarget[cchTarget - 1]))
enmType = RTSYMLINKTYPE_DIR;
else if (cchVolSpecTarget)
{
/** @todo this is subject to sharing violations. */
DWORD dwAttr = GetFileAttributesW(pwszNativeTarget);
if ( dwAttr != INVALID_FILE_ATTRIBUTES
&& (dwAttr & FILE_ATTRIBUTE_DIRECTORY))
enmType = RTSYMLINKTYPE_DIR;
}
else
{
/** @todo Join the symlink directory with the target and
* look up the attributes on that. -lazy bird. */
}
}
/*
* Create the link.
*/
if (s_pfnCreateSymbolicLinkW(pwszNativeSymlink, pwszNativeTarget, enmType == RTSYMLINKTYPE_DIR))
rc = VINF_SUCCESS;
else
rc = RTErrConvertFromWin32(GetLastError());
RTUtf16Free(pwszNativeTarget);
}
RTUtf16Free(pwszNativeSymlink);
}
LogFlow(("RTSymlinkCreate(%p={%s}, %p={%s}, %d, %#x): returns %Rrc\n", pszSymlink, pszSymlink, pszTarget, pszTarget, enmType, fCreate, rc));
//.........这里部分代码省略.........
示例6: DECLHIDDEN
DECLHIDDEN(int) drvHostBaseScsiCmdOs(PDRVHOSTBASE pThis, const uint8_t *pbCmd, size_t cbCmd, PDMMEDIATXDIR enmTxDir,
void *pvBuf, uint32_t *pcbBuf, uint8_t *pbSense, size_t cbSense, uint32_t cTimeoutMillies)
{
/*
* Minimal input validation.
*/
Assert(enmTxDir == PDMMEDIATXDIR_NONE || enmTxDir == PDMMEDIATXDIR_FROM_DEVICE || enmTxDir == PDMMEDIATXDIR_TO_DEVICE);
Assert(!pvBuf || pcbBuf);
Assert(pvBuf || enmTxDir == PDMMEDIATXDIR_NONE);
Assert(pbSense || !cbSense);
RT_NOREF(cbSense);
AssertPtr(pbCmd);
Assert(cbCmd <= 16 && cbCmd >= 1);
/* Allocate the temporary buffer lazily. */
if(RT_UNLIKELY(!pThis->Os.pbDoubleBuffer))
{
pThis->Os.pbDoubleBuffer = (uint8_t *)RTMemAlloc(SCSI_MAX_BUFFER_SIZE);
if (!pThis->Os.pbDoubleBuffer)
return VERR_NO_MEMORY;
}
int rc = VERR_GENERAL_FAILURE;
int direction;
struct cdrom_generic_command cgc;
switch (enmTxDir)
{
case PDMMEDIATXDIR_NONE:
Assert(*pcbBuf == 0);
direction = CGC_DATA_NONE;
break;
case PDMMEDIATXDIR_FROM_DEVICE:
Assert(*pcbBuf != 0);
Assert(*pcbBuf <= SCSI_MAX_BUFFER_SIZE);
/* Make sure that the buffer is clear for commands reading
* data. The actually received data may be shorter than what
* we expect, and due to the unreliable feedback about how much
* data the ioctl actually transferred, it's impossible to
* prevent that. Returning previous buffer contents may cause
* security problems inside the guest OS, if users can issue
* commands to the CDROM device. */
memset(pThis->Os.pbDoubleBuffer, '\0', *pcbBuf);
direction = CGC_DATA_READ;
break;
case PDMMEDIATXDIR_TO_DEVICE:
Assert(*pcbBuf != 0);
Assert(*pcbBuf <= SCSI_MAX_BUFFER_SIZE);
memcpy(pThis->Os.pbDoubleBuffer, pvBuf, *pcbBuf);
direction = CGC_DATA_WRITE;
break;
default:
AssertMsgFailed(("enmTxDir invalid!\n"));
direction = CGC_DATA_NONE;
}
memset(&cgc, '\0', sizeof(cgc));
memcpy(cgc.cmd, pbCmd, RT_MIN(CDROM_PACKET_SIZE, cbCmd));
cgc.buffer = (unsigned char *)pThis->Os.pbDoubleBuffer;
cgc.buflen = *pcbBuf;
cgc.stat = 0;
Assert(cbSense >= sizeof(struct request_sense));
cgc.sense = (struct request_sense *)pbSense;
cgc.data_direction = direction;
cgc.quiet = false;
cgc.timeout = cTimeoutMillies;
rc = ioctl(RTFileToNative(pThis->Os.hFileDevice), CDROM_SEND_PACKET, &cgc);
if (rc < 0)
{
if (errno == EBUSY)
rc = VERR_PDM_MEDIA_LOCKED;
else if (errno == ENOSYS)
rc = VERR_NOT_SUPPORTED;
else
{
rc = RTErrConvertFromErrno(errno);
if (rc == VERR_ACCESS_DENIED && cgc.sense->sense_key == SCSI_SENSE_NONE)
cgc.sense->sense_key = SCSI_SENSE_ILLEGAL_REQUEST;
Log2(("%s: error status %d, rc=%Rrc\n", __FUNCTION__, cgc.stat, rc));
}
}
switch (enmTxDir)
{
case PDMMEDIATXDIR_FROM_DEVICE:
memcpy(pvBuf, pThis->Os.pbDoubleBuffer, *pcbBuf);
break;
default:
;
}
Log2(("%s: after ioctl: cgc.buflen=%d txlen=%d\n", __FUNCTION__, cgc.buflen, *pcbBuf));
/* The value of cgc.buflen does not reliably reflect the actual amount
* of data transferred (for packet commands with little data transfer
* it's 0). So just assume that everything worked ok. */
return rc;
}
示例7: drvdiskintWriteRecord
/**
* Record a successful write to the virtual disk.
*
* @returns VBox status code.
* @param pThis Disk integrity driver instance data.
* @param paSeg Segment array of the write to record.
* @param cSeg Number of segments.
* @param off Start offset.
* @param cbWrite Number of bytes to record.
*/
static int drvdiskintWriteRecord(PDRVDISKINTEGRITY pThis, PCRTSGSEG paSeg, unsigned cSeg,
uint64_t off, size_t cbWrite)
{
int rc = VINF_SUCCESS;
LogFlowFunc(("pThis=%#p paSeg=%#p cSeg=%u off=%llx cbWrite=%u\n",
pThis, paSeg, cSeg, off, cbWrite));
/* Update the segments */
size_t cbLeft = cbWrite;
RTFOFF offCurr = (RTFOFF)off;
RTSGBUF SgBuf;
PIOLOGENT pIoLogEnt = (PIOLOGENT)RTMemAllocZ(sizeof(IOLOGENT));
if (!pIoLogEnt)
return VERR_NO_MEMORY;
pIoLogEnt->off = off;
pIoLogEnt->cbWrite = cbWrite;
pIoLogEnt->cRefs = 0;
RTSgBufInit(&SgBuf, paSeg, cSeg);
while (cbLeft)
{
PDRVDISKSEGMENT pSeg = (PDRVDISKSEGMENT)RTAvlrFileOffsetRangeGet(pThis->pTreeSegments, offCurr);
size_t cbRange = 0;
bool fSet = false;
unsigned offSeg = 0;
if (!pSeg)
{
/* Get next segment */
pSeg = (PDRVDISKSEGMENT)RTAvlrFileOffsetGetBestFit(pThis->pTreeSegments, offCurr, true);
if ( !pSeg
|| offCurr + (RTFOFF)cbLeft <= pSeg->Core.Key)
cbRange = cbLeft;
else
cbRange = pSeg->Core.Key - offCurr;
Assert(cbRange % 512 == 0);
/* Create new segment */
pSeg = (PDRVDISKSEGMENT)RTMemAllocZ(RT_OFFSETOF(DRVDISKSEGMENT, apIoLog[cbRange / 512]));
if (pSeg)
{
pSeg->Core.Key = offCurr;
pSeg->Core.KeyLast = offCurr + (RTFOFF)cbRange - 1;
pSeg->cbSeg = cbRange;
pSeg->pbSeg = (uint8_t *)RTMemAllocZ(cbRange);
pSeg->cIoLogEntries = cbRange / 512;
if (!pSeg->pbSeg)
RTMemFree(pSeg);
else
{
bool fInserted = RTAvlrFileOffsetInsert(pThis->pTreeSegments, &pSeg->Core);
AssertMsg(fInserted, ("Bug!\n"));
fSet = true;
}
}
}
else
{
fSet = true;
offSeg = offCurr - pSeg->Core.Key;
cbRange = RT_MIN(cbLeft, (size_t)(pSeg->Core.KeyLast + 1 - offCurr));
}
if (fSet)
{
AssertPtr(pSeg);
size_t cbCopied = RTSgBufCopyToBuf(&SgBuf, pSeg->pbSeg + offSeg, cbRange);
Assert(cbCopied == cbRange);
/* Update the I/O log pointers */
Assert(offSeg % 512 == 0);
Assert(cbRange % 512 == 0);
while (offSeg < cbRange)
{
uint32_t uSector = offSeg / 512;
PIOLOGENT pIoLogOld = NULL;
AssertMsg(uSector < pSeg->cIoLogEntries, ("Internal bug!\n"));
pIoLogOld = pSeg->apIoLog[uSector];
if (pIoLogOld)
{
pIoLogOld->cRefs--;
if (!pIoLogOld->cRefs)
RTMemFree(pIoLogOld);
}
//.........这里部分代码省略.........
示例8: IDirect3D9Impl_GetDeviceCaps
static HRESULT WINAPI IDirect3D9Impl_GetDeviceCaps(LPDIRECT3D9EX iface, UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS9* pCaps) {
IDirect3D9Impl *This = (IDirect3D9Impl *)iface;
HRESULT hrc = D3D_OK;
WINED3DCAPS *pWineCaps;
TRACE("iface %p, adapter %u, device_type %#x, caps %p.\n", iface, Adapter, DeviceType, pCaps);
if(NULL == pCaps){
return D3DERR_INVALIDCALL;
}
pWineCaps = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WINED3DCAPS));
if(pWineCaps == NULL){
return D3DERR_INVALIDCALL; /*well this is what MSDN says to return*/
}
memset(pCaps, 0, sizeof(*pCaps));
wined3d_mutex_lock();
hrc = IWineD3D_GetDeviceCaps(This->WineD3D, Adapter, DeviceType, pWineCaps);
wined3d_mutex_unlock();
WINECAPSTOD3D9CAPS(pCaps, pWineCaps)
HeapFree(GetProcessHeap(), 0, pWineCaps);
/* Some functionality is implemented in d3d9.dll, not wined3d.dll. Add the needed caps */
pCaps->DevCaps2 |= D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES;
filter_caps(pCaps);
/* fixup caps */
#ifdef VBOX_WITH_WDDM
/* needed for Windows Media Player to work properly */
pCaps->Caps |= D3DCAPS_READ_SCANLINE;
pCaps->Caps2 |= 0x00080000 /*D3DCAPS2_CANRENDERWINDOWED*/;
pCaps->Caps2 |= D3DCAPS2_CANSHARERESOURCE;
pCaps->DevCaps |= D3DDEVCAPS_FLOATTLVERTEX /* <- must be set according to the docs */
/*| D3DDEVCAPS_HWVERTEXBUFFER | D3DDEVCAPS_HWINDEXBUFFER | D3DDEVCAPS_SUBVOLUMELOCK */;
pCaps->PrimitiveMiscCaps |= D3DPMISCCAPS_INDEPENDENTWRITEMASKS
| D3DPMISCCAPS_FOGINFVF
| D3DPMISCCAPS_SEPARATEALPHABLEND | D3DPMISCCAPS_MRTINDEPENDENTBITDEPTHS;
pCaps->RasterCaps |= D3DPRASTERCAPS_SUBPIXEL | D3DPRASTERCAPS_STIPPLE | D3DPRASTERCAPS_ZBIAS | D3DPRASTERCAPS_COLORPERSPECTIVE /* keep */;
pCaps->TextureCaps |= D3DPTEXTURECAPS_TRANSPARENCY | D3DPTEXTURECAPS_TEXREPEATNOTSCALEDBYSIZE;
pCaps->TextureAddressCaps |= D3DPTADDRESSCAPS_MIRRORONCE;
pCaps->VolumeTextureAddressCaps |= D3DPTADDRESSCAPS_MIRRORONCE;
pCaps->StencilCaps |= D3DSTENCILCAPS_TWOSIDED;
pCaps->DeclTypes |= D3DDTCAPS_FLOAT16_2 | D3DDTCAPS_FLOAT16_4;
pCaps->VertexTextureFilterCaps |= D3DPTFILTERCAPS_MINFPOINT | D3DPTFILTERCAPS_MAGFPOINT;
pCaps->GuardBandLeft = -8192.;
pCaps->GuardBandTop = -8192.;
pCaps->GuardBandRight = 8192.;
pCaps->GuardBandBottom = 8192.;
pCaps->VS20Caps.DynamicFlowControlDepth = 24;
pCaps->VS20Caps.NumTemps = D3DVS20_MAX_NUMTEMPS;
pCaps->PS20Caps.DynamicFlowControlDepth = 24;
pCaps->PS20Caps.NumTemps = D3DVS20_MAX_NUMTEMPS;
#endif
/* workaround for wine not returning InstructionSlots correctly for shaders v3.0 */
if ((pCaps->VertexShaderVersion & 0xff00) == 0x0300)
{
pCaps->MaxVertexShader30InstructionSlots = RT_MIN(32768, pCaps->MaxVertexShader30InstructionSlots);
pCaps->MaxPixelShader30InstructionSlots = RT_MIN(32768, pCaps->MaxPixelShader30InstructionSlots);
}
#if defined(DEBUG)
if ((pCaps->VertexShaderVersion & 0xff00) == 0x0300)
{
ASSERT_D3D(pCaps->MaxVertexShader30InstructionSlots >= 512);
ASSERT_D3D(pCaps->MaxVertexShader30InstructionSlots <= 32768);
ASSERT_D3D(pCaps->MaxPixelShader30InstructionSlots >= 512);
ASSERT_D3D(pCaps->MaxPixelShader30InstructionSlots <= 32768);
}
else if ((pCaps->VertexShaderVersion & 0xff00) == 0x0200)
{
ASSERT_D3D(pCaps->MaxVertexShader30InstructionSlots == 0);
ASSERT_D3D(pCaps->MaxPixelShader30InstructionSlots == 0);
}
else
{
ERR_D3D();
}
#endif
TRACE("(%p) returning %p\n", This, pCaps);
ASSERT_D3D(hrc == S_OK);
return hrc;
}
示例9: LogFlow
/* Synchronously obtain a standard USB descriptor for a device, used in order
* to grab configuration descriptors when we first add the device
*/
static void *GetStdDescSync(PUSBPROXYDEV pProxyDev, uint8_t iDescType, uint8_t iIdx, uint16_t LangId, uint16_t cbHint)
{
#define GET_DESC_RETRIES 6
int cRetries = 0;
uint16_t cbInitialHint = cbHint;
LogFlow(("GetStdDescSync: pProxyDev=%s\n", pProxyDev->pUsbIns->pszName));
for (;;)
{
/*
* Setup a MSG URB, queue and reap it.
*/
int rc = VINF_SUCCESS;
VUSBURB Urb;
AssertCompile(RT_SIZEOFMEMB(VUSBURB, abData) >= _4K);
Urb.u32Magic = VUSBURB_MAGIC;
Urb.enmState = VUSBURBSTATE_IN_FLIGHT;
Urb.pszDesc = (char*)"URB sync";
Urb.pHci = NULL;
Urb.paTds = NULL;
Urb.Dev.pvPrivate = NULL;
Urb.Dev.pNext = NULL;
Urb.DstAddress = 0;
Urb.EndPt = 0;
Urb.enmType = VUSBXFERTYPE_MSG;
Urb.enmDir = VUSBDIRECTION_IN;
Urb.fShortNotOk = false;
Urb.enmStatus = VUSBSTATUS_INVALID;
Urb.pVUsb = NULL;
cbHint = RT_MIN(cbHint, sizeof(Urb.abData) - sizeof(VUSBSETUP));
Urb.cbData = cbHint + sizeof(VUSBSETUP);
PVUSBSETUP pSetup = (PVUSBSETUP)Urb.abData;
pSetup->bmRequestType = VUSB_DIR_TO_HOST | VUSB_REQ_STANDARD | VUSB_TO_DEVICE;
pSetup->bRequest = VUSB_REQ_GET_DESCRIPTOR;
pSetup->wValue = (iDescType << 8) | iIdx;
pSetup->wIndex = LangId;
pSetup->wLength = cbHint;
uint8_t *pbDesc = (uint8_t *)(pSetup + 1);
uint32_t cbDesc = 0;
PVUSBURB pUrbReaped = NULL;
rc = pProxyDev->pOps->pfnUrbQueue(pProxyDev, &Urb);
if (RT_FAILURE(rc))
{
Log(("GetStdDescSync: pfnUrbReap failed, rc=%d\n", rc));
goto err;
}
/* Don't wait forever, it's just a simple request that should
return immediately. Since we're executing in the EMT thread
it's important not to get stuck here. (Some of the builtin
iMac devices may refuse to respond for instance.) */
pUrbReaped = pProxyDev->pOps->pfnUrbReap(pProxyDev, 5000 /* ms */);
if (!pUrbReaped)
{
rc = pProxyDev->pOps->pfnUrbCancel(pProxyDev, &Urb);
AssertRC(rc);
/** @todo: This breaks the comment above... */
pUrbReaped = pProxyDev->pOps->pfnUrbReap(pProxyDev, RT_INDEFINITE_WAIT);
}
if (pUrbReaped != &Urb)
{
Log(("GetStdDescSync: pfnUrbReap failed, pUrbReaped=%p\n", pUrbReaped));
goto err;
}
if (Urb.enmStatus != VUSBSTATUS_OK)
{
Log(("GetStdDescSync: Urb.enmStatus=%d\n", Urb.enmStatus));
goto err;
}
/*
* Check the length, config descriptors have total_length field
*/
if (iDescType == VUSB_DT_CONFIG)
{
if (Urb.cbData < sizeof(VUSBSETUP) + 4)
{
Log(("GetStdDescSync: Urb.cbData=%#x (min 4)\n", Urb.cbData));
goto err;
}
cbDesc = RT_LE2H_U16(((uint16_t *)pbDesc)[1]);
}
else
{
if (Urb.cbData < sizeof(VUSBSETUP) + 1)
{
Log(("GetStdDescSync: Urb.cbData=%#x (min 1)\n", Urb.cbData));
goto err;
}
cbDesc = ((uint8_t *)pbDesc)[0];
}
Log(("GetStdDescSync: got Urb.cbData=%u, cbDesc=%u cbHint=%u\n", Urb.cbData, cbDesc, cbHint));
//.........这里部分代码省略.........
示例10: vboxWddmGetD3D9Caps
static HRESULT vboxWddmGetD3D9Caps(PVBOXWDDMDISP_D3D pD3D, D3DCAPS9 *pCaps)
{
HRESULT hr = pD3D->pD3D9If->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, pCaps);
if (FAILED(hr))
{
WARN(("GetDeviceCaps failed hr(0x%x)",hr));
return hr;
}
/* needed for Windows Media Player to work properly */
pCaps->Caps |= D3DCAPS_READ_SCANLINE;
pCaps->Caps2 |= 0x00080000 /*D3DCAPS2_CANRENDERWINDOWED*/;
pCaps->Caps2 |= D3DCAPS2_CANSHARERESOURCE;
pCaps->DevCaps |= D3DDEVCAPS_FLOATTLVERTEX /* <- must be set according to the docs */
/*| D3DDEVCAPS_HWVERTEXBUFFER | D3DDEVCAPS_HWINDEXBUFFER | D3DDEVCAPS_SUBVOLUMELOCK */;
pCaps->PrimitiveMiscCaps |= D3DPMISCCAPS_INDEPENDENTWRITEMASKS
| D3DPMISCCAPS_FOGINFVF
| D3DPMISCCAPS_SEPARATEALPHABLEND | D3DPMISCCAPS_MRTINDEPENDENTBITDEPTHS;
pCaps->RasterCaps |= D3DPRASTERCAPS_SUBPIXEL | D3DPRASTERCAPS_STIPPLE | D3DPRASTERCAPS_ZBIAS | D3DPRASTERCAPS_COLORPERSPECTIVE /* keep */;
pCaps->TextureCaps |= D3DPTEXTURECAPS_TRANSPARENCY | D3DPTEXTURECAPS_TEXREPEATNOTSCALEDBYSIZE;
pCaps->TextureAddressCaps |= D3DPTADDRESSCAPS_MIRRORONCE;
pCaps->VolumeTextureAddressCaps |= D3DPTADDRESSCAPS_MIRRORONCE;
pCaps->StencilCaps |= D3DSTENCILCAPS_TWOSIDED;
pCaps->DeclTypes |= D3DDTCAPS_FLOAT16_2 | D3DDTCAPS_FLOAT16_4;
pCaps->VertexTextureFilterCaps |= D3DPTFILTERCAPS_MINFPOINT | D3DPTFILTERCAPS_MAGFPOINT;
pCaps->GuardBandLeft = -8192.;
pCaps->GuardBandTop = -8192.;
pCaps->GuardBandRight = 8192.;
pCaps->GuardBandBottom = 8192.;
pCaps->VS20Caps.DynamicFlowControlDepth = 24;
pCaps->VS20Caps.NumTemps = D3DVS20_MAX_NUMTEMPS;
pCaps->PS20Caps.DynamicFlowControlDepth = 24;
pCaps->PS20Caps.NumTemps = D3DVS20_MAX_NUMTEMPS;
/* workaround for wine not returning InstructionSlots correctly for shaders v3.0 */
if ((pCaps->VertexShaderVersion & 0xff00) == 0x0300)
{
pCaps->MaxVertexShader30InstructionSlots = RT_MIN(32768, pCaps->MaxVertexShader30InstructionSlots);
pCaps->MaxPixelShader30InstructionSlots = RT_MIN(32768, pCaps->MaxPixelShader30InstructionSlots);
}
#if defined(DEBUG)
if ((pCaps->VertexShaderVersion & 0xff00) == 0x0300)
{
Assert(pCaps->MaxVertexShader30InstructionSlots >= 512);
Assert(pCaps->MaxVertexShader30InstructionSlots <= 32768);
Assert(pCaps->MaxPixelShader30InstructionSlots >= 512);
Assert(pCaps->MaxPixelShader30InstructionSlots <= 32768);
}
else if ((pCaps->VertexShaderVersion & 0xff00) == 0x0200)
{
Assert(pCaps->MaxVertexShader30InstructionSlots == 0);
Assert(pCaps->MaxPixelShader30InstructionSlots == 0);
}
else
{
WARN(("incorect shader caps!"));
}
#endif
vboxDispDumpD3DCAPS9(pCaps);
return S_OK;
}
示例11: RTDECL
RTDECL(int) RTVfsIoStrmReadAll(RTVFSIOSTREAM hVfsIos, void **ppvBuf, size_t *pcbBuf)
{
/*
* Try query the object information and in case the stream has a known
* size we could use for guidance.
*/
RTFSOBJINFO ObjInfo;
int rc = RTVfsIoStrmQueryInfo(hVfsIos, &ObjInfo, RTFSOBJATTRADD_NOTHING);
size_t cbAllocated = RT_SUCCESS(rc) && ObjInfo.cbObject > 0 && ObjInfo.cbObject < _1G
? (size_t)ObjInfo.cbObject + 1 : _16K;
cbAllocated += READ_ALL_HEADER_SIZE;
void *pvBuf = RTMemAlloc(cbAllocated);
if (pvBuf)
{
memset(pvBuf, 0xfe, READ_ALL_HEADER_SIZE);
size_t off = 0;
for (;;)
{
/*
* Handle buffer growing and detecting the end of it all.
*/
size_t cbToRead = cbAllocated - off - READ_ALL_HEADER_SIZE - 1;
if (!cbToRead)
{
/* The end? */
uint8_t bIgn;
size_t cbIgn;
rc = RTVfsIoStrmRead(hVfsIos, &bIgn, 0, true /*fBlocking*/, &cbIgn);
if (rc == VINF_EOF)
break;
/* Grow the buffer. */
cbAllocated -= READ_ALL_HEADER_SIZE - 1;
cbAllocated = RT_MAX(RT_MIN(cbAllocated, _32M), _1K);
cbAllocated = RT_ALIGN_Z(cbAllocated, _4K);
cbAllocated += READ_ALL_HEADER_SIZE + 1;
void *pvNew = RTMemRealloc(pvBuf, cbAllocated);
AssertBreakStmt(pvNew, rc = VERR_NO_MEMORY);
pvBuf = pvNew;
cbToRead = cbAllocated - off - READ_ALL_HEADER_SIZE - 1;
}
Assert(cbToRead < cbAllocated);
/*
* Read.
*/
size_t cbActual;
rc = RTVfsIoStrmRead(hVfsIos, (uint8_t *)pvBuf + READ_ALL_HEADER_SIZE + off, cbToRead,
true /*fBlocking*/, &cbActual);
if (RT_FAILURE(rc))
break;
Assert(cbActual > 0);
Assert(cbActual <= cbToRead);
off += cbActual;
if (rc == VINF_EOF)
break;
}
Assert(rc != VERR_EOF);
if (RT_SUCCESS(rc))
{
((size_t *)pvBuf)[0] = READ_ALL_HEADER_MAGIC;
((size_t *)pvBuf)[1] = off;
((uint8_t *)pvBuf)[READ_ALL_HEADER_SIZE + off] = 0;
*ppvBuf = (uint8_t *)pvBuf + READ_ALL_HEADER_SIZE;
*pcbBuf = off;
return VINF_SUCCESS;
}
RTMemFree(pvBuf);
}
else
rc = VERR_NO_MEMORY;
*ppvBuf = NULL;
*pcbBuf = 0;
return rc;
}
示例12: bench
/**
* Method that does the actual resize of the guest framebuffer and
* then changes the SDL framebuffer setup.
*/
static void bench(unsigned long w, unsigned long h, unsigned long bpp)
{
Uint32 Rmask, Gmask, Bmask, Amask = 0;
Uint32 Rsize, Gsize, Bsize;
Uint32 newWidth, newHeight;
guGuestXRes = w;
guGuestYRes = h;
guGuestBpp = bpp;
RTPrintf("\n");
/* a different format we support directly? */
switch (guGuestBpp)
{
case 16:
{
Rmask = 0xF800;
Gmask = 0x07E0;
Bmask = 0x001F;
Amask = 0x0000;
Rsize = 5;
Gsize = 6;
Bsize = 5;
break;
}
case 24:
{
Rmask = 0x00FF0000;
Gmask = 0x0000FF00;
Bmask = 0x000000FF;
Amask = 0x00000000;
Rsize = 8;
Gsize = 8;
Bsize = 8;
break;
}
default:
Rmask = 0x00FF0000;
Gmask = 0x0000FF00;
Bmask = 0x000000FF;
Amask = 0x00000000;
Rsize = 8;
Gsize = 8;
Bsize = 8;
break;
}
int sdlFlags = SDL_HWSURFACE | SDL_ASYNCBLIT | SDL_HWACCEL;
#ifdef VBOX_OPENGL
if (gfOpenGL)
sdlFlags |= SDL_OPENGL;
#endif
if (gfResizable)
sdlFlags |= SDL_RESIZABLE;
if (gfFullscreen)
sdlFlags |= SDL_FULLSCREEN;
/*
* Now we have to check whether there are video mode restrictions
*/
SDL_Rect **modes;
/* Get available fullscreen/hardware modes */
modes = SDL_ListModes(NULL, sdlFlags);
if (modes == NULL)
{
RTPrintf("Error: SDL_ListModes failed with message '%s'\n", SDL_GetError());
return;
}
/* -1 means that any mode is possible (usually non fullscreen) */
if (modes != (SDL_Rect **)-1)
{
/*
* according to the SDL documentation, the API guarantees that
* the modes are sorted from larger to smaller, so we just
* take the first entry as the maximum.
*/
guMaxScreenWidth = modes[0]->w;
guMaxScreenHeight = modes[0]->h;
}
else
{
/* no restriction */
guMaxScreenWidth = ~0U;
guMaxScreenHeight = ~0U;
}
newWidth = RT_MIN(guMaxScreenWidth, guGuestXRes);
newHeight = RT_MIN(guMaxScreenHeight, guGuestYRes);
/*
* Now set the screen resolution and get the surface pointer
* @todo BPP is not supported!
//.........这里部分代码省略.........
示例13: vboxGlobal
void VBoxGuestRAMSlider::init()
{
ulong fullSize = vboxGlobal().host().GetMemorySize();
CSystemProperties sys = vboxGlobal().virtualBox().GetSystemProperties();
mMinRAM = sys.GetMinGuestRAM();
mMaxRAM = RT_MIN (RT_ALIGN (fullSize, _1G / _1M), sys.GetMaxGuestRAM());
/* Come up with some nice round percent boundaries relative to
* the system memory. A max of 75% on a 256GB config is ridiculous,
* even on an 8GB rig reserving 2GB for the OS is way to conservative.
* The max numbers can be estimated using the following program:
*
* double calcMaxPct(uint64_t cbRam)
* {
* double cbRamOverhead = cbRam * 0.0390625; // 160 bytes per page.
* double cbRamForTheOS = RT_MAX(RT_MIN(_512M, cbRam * 0.25), _64M);
* double OSPct = (cbRamOverhead + cbRamForTheOS) * 100.0 / cbRam;
* double MaxPct = 100 - OSPct;
* return MaxPct;
* }
*
* int main()
* {
* uint64_t cbRam = _1G;
* for (; !(cbRam >> 33); cbRam += _1G)
* printf("%8lluGB %.1f%% %8lluKB\n", cbRam >> 30, calcMaxPct(cbRam),
* (uint64_t)(cbRam * calcMaxPct(cbRam) / 100.0) >> 20);
* for (; !(cbRam >> 51); cbRam <<= 1)
* printf("%8lluGB %.1f%% %8lluKB\n", cbRam >> 30, calcMaxPct(cbRam),
* (uint64_t)(cbRam * calcMaxPct(cbRam) / 100.0) >> 20);
* return 0;
* }
*
* Note. We might wanna put these calculations somewhere global later. */
/* System RAM amount test */
mMaxRAMAlw = (uint)(0.75 * fullSize);
mMaxRAMOpt = (uint)(0.50 * fullSize);
if (fullSize < 3072)
/* done */;
else if (fullSize < 4096) /* 3GB */
mMaxRAMAlw = (uint)(0.80 * fullSize);
else if (fullSize < 6144) /* 4-5GB */
{
mMaxRAMAlw = (uint)(0.84 * fullSize);
mMaxRAMOpt = (uint)(0.60 * fullSize);
}
else if (fullSize < 8192) /* 6-7GB */
{
mMaxRAMAlw = (uint)(0.88 * fullSize);
mMaxRAMOpt = (uint)(0.65 * fullSize);
}
else if (fullSize < 16384) /* 8-15GB */
{
mMaxRAMAlw = (uint)(0.90 * fullSize);
mMaxRAMOpt = (uint)(0.70 * fullSize);
}
else if (fullSize < 32768) /* 16-31GB */
{
mMaxRAMAlw = (uint)(0.93 * fullSize);
mMaxRAMOpt = (uint)(0.75 * fullSize);
}
else if (fullSize < 65536) /* 32-63GB */
{
mMaxRAMAlw = (uint)(0.94 * fullSize);
mMaxRAMOpt = (uint)(0.80 * fullSize);
}
else if (fullSize < 131072) /* 64-127GB */
{
mMaxRAMAlw = (uint)(0.95 * fullSize);
mMaxRAMOpt = (uint)(0.85 * fullSize);
}
else /* 128GB- */
{
mMaxRAMAlw = (uint)(0.96 * fullSize);
mMaxRAMOpt = (uint)(0.90 * fullSize);
}
/* Now check the calculated maximums are out of the range for the guest
* RAM. If so change it accordingly. */
mMaxRAMAlw = RT_MIN (mMaxRAMAlw, mMaxRAM);
mMaxRAMOpt = RT_MIN (mMaxRAMOpt, mMaxRAM);
setPageStep (calcPageStep (mMaxRAM));
setSingleStep (pageStep() / 4);
setTickInterval (pageStep());
/* Setup the scale so that ticks are at page step boundaries */
setMinimum ((mMinRAM / pageStep()) * pageStep());
setMaximum (mMaxRAM);
setSnappingEnabled (true);
setOptimalHint (mMinRAM, mMaxRAMOpt);
setWarningHint (mMaxRAMOpt, mMaxRAMAlw);
setErrorHint (mMaxRAMAlw, mMaxRAM);
}
示例14: tstPDMACStressTestFileWrite
static int tstPDMACStressTestFileWrite(PPDMACTESTFILE pTestFile, PPDMACTESTFILETASK pTestTask)
{
int rc = VINF_SUCCESS;
Assert(!pTestTask->fActive);
pTestTask->fActive = true;
pTestTask->fWrite = true;
pTestTask->DataSeg.cbSeg = RTRandU32Ex(512, TASK_TRANSFER_SIZE_MAX) & ~511;
uint64_t offMax;
/* Did we reached the maximum file size */
if (pTestFile->cbFileCurr < pTestFile->cbFileMax)
{
offMax = (pTestFile->cbFileMax - pTestFile->cbFileCurr) < pTestTask->DataSeg.cbSeg
? pTestFile->cbFileMax - pTestTask->DataSeg.cbSeg
: pTestFile->cbFileCurr;
}
else
offMax = pTestFile->cbFileMax - pTestTask->DataSeg.cbSeg;
uint64_t offMin;
/*
* If we reached the maximum file size write in the whole file
* otherwise we will enforce the range for random offsets to let it grow
* more quickly.
*/
if (pTestFile->cbFileCurr == pTestFile->cbFileMax)
offMin = 0;
else
offMin = RT_MIN(pTestFile->cbFileCurr, offMax);
pTestTask->off = RTRandU64Ex(offMin, offMax) & ~511;
/* Set new file size of required */
if ((uint64_t)pTestTask->off + pTestTask->DataSeg.cbSeg > pTestFile->cbFileCurr)
pTestFile->cbFileCurr = pTestTask->off + pTestTask->DataSeg.cbSeg;
AssertMsg(pTestFile->cbFileCurr <= pTestFile->cbFileMax,
("Current file size (%llu) exceeds final size (%llu)\n",
pTestFile->cbFileCurr, pTestFile->cbFileMax));
/* Allocate data buffer. */
pTestTask->DataSeg.pvSeg = RTMemAlloc(pTestTask->DataSeg.cbSeg);
if (!pTestTask->DataSeg.pvSeg)
return VERR_NO_MEMORY;
/* Fill data into buffer. */
tstPDMACStressTestFileFillBuffer(pTestFile, pTestTask);
/* Engage */
rc = PDMR3AsyncCompletionEpWrite(pTestFile->hEndpoint, pTestTask->off,
&pTestTask->DataSeg, 1,
pTestTask->DataSeg.cbSeg,
pTestTask,
&pTestTask->hTask);
return rc;
}
示例15: DECLCALLBACK
/**
* The old halt loop.
*/
static DECLCALLBACK(int) vmR3HaltOldDoHalt(PUVMCPU pUVCpu, const uint32_t fMask, uint64_t /* u64Now*/)
{
/*
* Halt loop.
*/
PVM pVM = pUVCpu->pVM;
PVMCPU pVCpu = pUVCpu->pVCpu;
int rc = VINF_SUCCESS;
ASMAtomicWriteBool(&pUVCpu->vm.s.fWait, true);
//unsigned cLoops = 0;
for (;;)
{
/*
* Work the timers and check if we can exit.
* The poll call gives us the ticks left to the next event in
* addition to perhaps set an FF.
*/
uint64_t const u64StartTimers = RTTimeNanoTS();
TMR3TimerQueuesDo(pVM);
uint64_t const cNsElapsedTimers = RTTimeNanoTS() - u64StartTimers;
STAM_REL_PROFILE_ADD_PERIOD(&pUVCpu->vm.s.StatHaltTimers, cNsElapsedTimers);
if ( VM_FF_IS_PENDING(pVM, VM_FF_EXTERNAL_HALTED_MASK)
|| VMCPU_FF_IS_PENDING(pVCpu, fMask))
break;
uint64_t u64NanoTS;
TMTimerPollGIP(pVM, pVCpu, &u64NanoTS);
if ( VM_FF_IS_PENDING(pVM, VM_FF_EXTERNAL_HALTED_MASK)
|| VMCPU_FF_IS_PENDING(pVCpu, fMask))
break;
/*
* Wait for a while. Someone will wake us up or interrupt the call if
* anything needs our attention.
*/
if (u64NanoTS < 50000)
{
//RTLogPrintf("u64NanoTS=%RI64 cLoops=%d spin\n", u64NanoTS, cLoops++);
/* spin */;
}
else
{
VMMR3YieldStop(pVM);
//uint64_t u64Start = RTTimeNanoTS();
if (u64NanoTS < 870000) /* this is a bit speculative... works fine on linux. */
{
//RTLogPrintf("u64NanoTS=%RI64 cLoops=%d yield", u64NanoTS, cLoops++);
uint64_t const u64StartSchedYield = RTTimeNanoTS();
RTThreadYield(); /* this is the best we can do here */
uint64_t const cNsElapsedSchedYield = RTTimeNanoTS() - u64StartSchedYield;
STAM_REL_PROFILE_ADD_PERIOD(&pUVCpu->vm.s.StatHaltYield, cNsElapsedSchedYield);
}
else if (u64NanoTS < 2000000)
{
//RTLogPrintf("u64NanoTS=%RI64 cLoops=%d sleep 1ms", u64NanoTS, cLoops++);
uint64_t const u64StartSchedHalt = RTTimeNanoTS();
rc = RTSemEventWait(pUVCpu->vm.s.EventSemWait, 1);
uint64_t const cNsElapsedSchedHalt = RTTimeNanoTS() - u64StartSchedHalt;
STAM_REL_PROFILE_ADD_PERIOD(&pUVCpu->vm.s.StatHaltBlock, cNsElapsedSchedHalt);
}
else
{
//RTLogPrintf("u64NanoTS=%RI64 cLoops=%d sleep %dms", u64NanoTS, cLoops++, (uint32_t)RT_MIN((u64NanoTS - 500000) / 1000000, 15));
uint64_t const u64StartSchedHalt = RTTimeNanoTS();
rc = RTSemEventWait(pUVCpu->vm.s.EventSemWait, RT_MIN((u64NanoTS - 1000000) / 1000000, 15));
uint64_t const cNsElapsedSchedHalt = RTTimeNanoTS() - u64StartSchedHalt;
STAM_REL_PROFILE_ADD_PERIOD(&pUVCpu->vm.s.StatHaltBlock, cNsElapsedSchedHalt);
}
//uint64_t u64Slept = RTTimeNanoTS() - u64Start;
//RTLogPrintf(" -> rc=%Rrc in %RU64 ns / %RI64 ns delta\n", rc, u64Slept, u64NanoTS - u64Slept);
}
if (rc == VERR_TIMEOUT)
rc = VINF_SUCCESS;
else if (RT_FAILURE(rc))
{
rc = vmR3FatalWaitError(pUVCpu, "RTSemEventWait->%Rrc\n", rc);
break;
}
}
ASMAtomicUoWriteBool(&pUVCpu->vm.s.fWait, false);
return rc;
}