static DECLCALLBACK(HVBOXCRHGSMI_CLIENT) _crVBoxHGSMIClientCreate(PVBOXUHGSMI pHgsmi) { PCRVBOXHGSMI_CLIENT pClient = crAlloc(sizeof (CRVBOXHGSMI_CLIENT)); if (pClient) { int rc; pClient->pHgsmi = pHgsmi; rc = pHgsmi->pfnBufferCreate(pHgsmi, CRVBOXHGSMI_PAGE_ALIGN(1), VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT, NULL, &pClient->pCmdBuffer); AssertRC(rc); if (RT_SUCCESS(rc)) { rc = pHgsmi->pfnBufferCreate(pHgsmi, CRVBOXHGSMI_PAGE_ALIGN(0x800000), VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT, NULL, &pClient->pHGBuffer); AssertRC(rc); if (RT_SUCCESS(rc)) { pClient->pvHGBuffer = NULL; pClient->bufpool = crBufferPoolInit(16); return (HVBOXCRHGSMI_CLIENT) pClient; } } } return NULL; }
int vboxUhgsmiTst(PVBOXUHGSMI pUhgsmi, uint32_t cbBuf, uint32_t cNumCals, uint64_t * pTimeMs) { PVBOXUHGSMI_BUFFER pBuf; int rc = pUhgsmi->pfnBufferCreate(pUhgsmi, cbBuf, VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT, NULL, &pBuf); AssertRC(rc); if (RT_SUCCESS(rc)) { uint64_t TimeMs = VBOXDISPPROFILE_GET_TIME_MILLI(); do { VBOXUHGSMI_BUFFER_LOCK_FLAGS fFlags; fFlags.Value = 0; fFlags.bLockEntire = 1; fFlags.bDiscard = 1; void *pvLock; rc = pBuf->pfnLock(pBuf, 0, cbBuf, fFlags, &pvLock); AssertRC(rc); if (!RT_SUCCESS(rc)) break; rc = pBuf->pfnUnlock(pBuf); AssertRC(rc); if (!RT_SUCCESS(rc)) break; VBOXUHGSMI_BUFFER_SUBMIT SubmitData; SubmitData.pBuf = pBuf; SubmitData.fFlags.Value = 0; SubmitData.fFlags.bDoNotRetire = 1; SubmitData.fFlags.bEntireBuffer = 1; rc = pUhgsmi->pfnBufferSubmitAsynch(pUhgsmi, &SubmitData, 1); AssertRC(rc); if (!RT_SUCCESS(rc)) break; DWORD dw = WaitForSingleObject(pBuf->hSynch, INFINITE); Assert(dw == WAIT_OBJECT_0); if (dw) break; } while (--cNumCals); TimeMs = VBOXDISPPROFILE_GET_TIME_MILLI() - TimeMs; *pTimeMs = TimeMs; pBuf->pfnDestroy(pBuf); } return rc; }