IMG_INTERNAL PVRSRV_ERROR IMG_CALLCONV BridgeServerSyncFree(IMG_HANDLE hBridge, IMG_HANDLE hSyncHandle) { PVRSRV_ERROR eError; SERVER_SYNC_PRIMITIVE * psSyncHandleInt; PVR_UNREFERENCED_PARAMETER(hBridge); psSyncHandleInt = (SERVER_SYNC_PRIMITIVE *) hSyncHandle; eError = PVRSRVServerSyncFreeKM( psSyncHandleInt); return eError; }
static IMG_INT PVRSRVBridgeServerSyncAlloc(IMG_UINT32 ui32BridgeID, PVRSRV_BRIDGE_IN_SERVERSYNCALLOC *psServerSyncAllocIN, PVRSRV_BRIDGE_OUT_SERVERSYNCALLOC *psServerSyncAllocOUT, CONNECTION_DATA *psConnection) { IMG_HANDLE hDevNodeInt = IMG_NULL; SERVER_SYNC_PRIMITIVE * psSyncHandleInt = IMG_NULL; IMG_HANDLE hSyncHandleInt2 = IMG_NULL; PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SYNC_SERVERSYNCALLOC); { /* Look up the address from the handle */ psServerSyncAllocOUT->eError = PVRSRVLookupHandle(psConnection->psHandleBase, (IMG_HANDLE *) &hDevNodeInt, psServerSyncAllocIN->hDevNode, PVRSRV_HANDLE_TYPE_DEV_NODE); if(psServerSyncAllocOUT->eError != PVRSRV_OK) { goto ServerSyncAlloc_exit; } } psServerSyncAllocOUT->eError = PVRSRVServerSyncAllocKM( hDevNodeInt, &psSyncHandleInt, &psServerSyncAllocOUT->ui32SyncPrimVAddr); /* Exit early if bridged call fails */ if(psServerSyncAllocOUT->eError != PVRSRV_OK) { goto ServerSyncAlloc_exit; } /* Create a resman item and overwrite the handle with it */ hSyncHandleInt2 = ResManRegisterRes(psConnection->hResManContext, RESMAN_TYPE_SERVER_SYNC_PRIMITIVE, psSyncHandleInt, /* FIXME: how can we avoid this cast? */ (RESMAN_FREE_FN)&PVRSRVServerSyncFreeKM); if (hSyncHandleInt2 == IMG_NULL) { psServerSyncAllocOUT->eError = PVRSRV_ERROR_UNABLE_TO_REGISTER_RESOURCE; goto ServerSyncAlloc_exit; } psServerSyncAllocOUT->eError = PVRSRVAllocHandle(psConnection->psHandleBase, &psServerSyncAllocOUT->hSyncHandle, (IMG_HANDLE) hSyncHandleInt2, PVRSRV_HANDLE_TYPE_SERVER_SYNC_PRIMITIVE, PVRSRV_HANDLE_ALLOC_FLAG_NONE ); if (psServerSyncAllocOUT->eError != PVRSRV_OK) { goto ServerSyncAlloc_exit; } ServerSyncAlloc_exit: if (psServerSyncAllocOUT->eError != PVRSRV_OK) { /* 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) { PVRSRVServerSyncFreeKM(psSyncHandleInt); } } return 0; }