IMG_INTERNAL PVRSRV_ERROR IMG_CALLCONV BridgeFreeSyncPrimitiveBlock(IMG_HANDLE hBridge, IMG_HANDLE hSyncHandle) { PVRSRV_ERROR eError; SYNC_PRIMITIVE_BLOCK * psSyncHandleInt; PVR_UNREFERENCED_PARAMETER(hBridge); psSyncHandleInt = (SYNC_PRIMITIVE_BLOCK *) hSyncHandle; eError = PVRSRVFreeSyncPrimitiveBlockKM( psSyncHandleInt); return eError; }
static IMG_INT PVRSRVBridgeAllocSyncPrimitiveBlock(IMG_UINT32 ui32BridgeID, PVRSRV_BRIDGE_IN_ALLOCSYNCPRIMITIVEBLOCK *psAllocSyncPrimitiveBlockIN, PVRSRV_BRIDGE_OUT_ALLOCSYNCPRIMITIVEBLOCK *psAllocSyncPrimitiveBlockOUT, CONNECTION_DATA *psConnection) { IMG_HANDLE hDevNodeInt = IMG_NULL; SYNC_PRIMITIVE_BLOCK * psSyncHandleInt = IMG_NULL; IMG_HANDLE hSyncHandleInt2 = IMG_NULL; DEVMEM_EXPORTCOOKIE * psExportCookieInt = IMG_NULL; PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SYNC_ALLOCSYNCPRIMITIVEBLOCK); psAllocSyncPrimitiveBlockOUT->hSyncHandle = IMG_NULL; { /* Look up the address from the handle */ psAllocSyncPrimitiveBlockOUT->eError = PVRSRVLookupHandle(psConnection->psHandleBase, (IMG_HANDLE *) &hDevNodeInt, psAllocSyncPrimitiveBlockIN->hDevNode, PVRSRV_HANDLE_TYPE_DEV_NODE); if(psAllocSyncPrimitiveBlockOUT->eError != PVRSRV_OK) { goto AllocSyncPrimitiveBlock_exit; } } psAllocSyncPrimitiveBlockOUT->eError = PVRSRVAllocSyncPrimitiveBlockKM(psConnection, hDevNodeInt, &psSyncHandleInt, &psAllocSyncPrimitiveBlockOUT->ui32SyncPrimVAddr, &psAllocSyncPrimitiveBlockOUT->ui32SyncPrimBlockSize, &psExportCookieInt); /* Exit early if bridged call fails */ if(psAllocSyncPrimitiveBlockOUT->eError != PVRSRV_OK) { goto AllocSyncPrimitiveBlock_exit; } /* Create a resman item and overwrite the handle with it */ hSyncHandleInt2 = ResManRegisterRes(psConnection->hResManContext, RESMAN_TYPE_SYNC_PRIMITIVE_BLOCK, psSyncHandleInt, /* FIXME: how can we avoid this cast? */ (RESMAN_FREE_FN)&PVRSRVFreeSyncPrimitiveBlockKM); if (hSyncHandleInt2 == IMG_NULL) { psAllocSyncPrimitiveBlockOUT->eError = PVRSRV_ERROR_UNABLE_TO_REGISTER_RESOURCE; goto AllocSyncPrimitiveBlock_exit; } psAllocSyncPrimitiveBlockOUT->eError = PVRSRVAllocHandle(psConnection->psHandleBase, &psAllocSyncPrimitiveBlockOUT->hSyncHandle, (IMG_HANDLE) hSyncHandleInt2, PVRSRV_HANDLE_TYPE_SYNC_PRIMITIVE_BLOCK, PVRSRV_HANDLE_ALLOC_FLAG_NONE ); if (psAllocSyncPrimitiveBlockOUT->eError != PVRSRV_OK) { goto AllocSyncPrimitiveBlock_exit; } psAllocSyncPrimitiveBlockOUT->eError = PVRSRVAllocSubHandle(psConnection->psHandleBase, &psAllocSyncPrimitiveBlockOUT->hExportCookie, (IMG_HANDLE) psExportCookieInt, PVRSRV_HANDLE_TYPE_SERVER_EXPORTCOOKIE, PVRSRV_HANDLE_ALLOC_FLAG_NONE ,psAllocSyncPrimitiveBlockOUT->hSyncHandle); if (psAllocSyncPrimitiveBlockOUT->eError != PVRSRV_OK) { goto AllocSyncPrimitiveBlock_exit; } AllocSyncPrimitiveBlock_exit: if (psAllocSyncPrimitiveBlockOUT->eError != PVRSRV_OK) { if (psAllocSyncPrimitiveBlockOUT->hSyncHandle) { PVRSRVReleaseHandle(psConnection->psHandleBase, (IMG_HANDLE) psAllocSyncPrimitiveBlockOUT->hSyncHandle, PVRSRV_HANDLE_TYPE_SYNC_PRIMITIVE_BLOCK); } /* If we have a valid resman item we should undo the bridge function by freeing the resman item */ if (hSyncHandleInt2) { PVRSRV_ERROR eError = ResManFreeResByPtr(hSyncHandleInt2); /* Freeing a resource should never fail... */ PVR_ASSERT((eError == PVRSRV_OK) || (eError == PVRSRV_ERROR_RETRY)); } else if (psSyncHandleInt) { PVRSRVFreeSyncPrimitiveBlockKM(psSyncHandleInt); } } return 0; }