static PVRSRV_ERROR FreeDeviceMemCallBack(IMG_PVOID pvParam, IMG_UINT32 ui32Param) { PVRSRV_ERROR eError = PVRSRV_OK; PVRSRV_KERNEL_MEM_INFO *psMemInfo = pvParam; PVR_UNREFERENCED_PARAMETER(ui32Param); psMemInfo->ui32RefCount--; if(psMemInfo->ui32Flags & PVRSRV_MEM_EXPORTED) { IMG_HANDLE hMemInfo = IMG_NULL; if (psMemInfo->ui32RefCount != 0) { PVR_DPF((PVR_DBG_ERROR, "FreeDeviceMemCallBack: mappings are open in other processes")); return PVRSRV_ERROR_GENERIC; } eError = PVRSRVFindHandle(KERNEL_HANDLE_BASE, &hMemInfo, psMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO); if(eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR, "FreeDeviceMemCallBack: can't find exported meminfo in the global handle list")); return eError; } eError = PVRSRVReleaseHandle(KERNEL_HANDLE_BASE, hMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO); if(eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR, "FreeDeviceMemCallBack: PVRSRVReleaseHandle failed for exported meminfo")); return eError; } } PVR_ASSERT(psMemInfo->ui32RefCount == 0); if (psMemInfo->psKernelSyncInfo) { eError = PVRSRVFreeSyncInfoKM(psMemInfo->psKernelSyncInfo); } if (eError == PVRSRV_OK) { eError = FreeDeviceMem(psMemInfo); } return eError; }
static PVRSRV_ERROR FreeMemCallBackCommon(PVRSRV_KERNEL_MEM_INFO *psMemInfo, IMG_UINT32 ui32Param, IMG_BOOL bFromAllocator) { PVRSRV_ERROR eError = PVRSRV_OK; PVR_UNREFERENCED_PARAMETER(ui32Param); psMemInfo->ui32RefCount--; if (psMemInfo->ui32RefCount == 0) { if(psMemInfo->ui32Flags & PVRSRV_MEM_EXPORTED) { IMG_HANDLE hMemInfo = IMG_NULL; eError = PVRSRVFindHandle(KERNEL_HANDLE_BASE, &hMemInfo, psMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO); if(eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR, "FreeMemCallBackCommon: can't find exported meminfo in the global handle list")); return eError; } eError = PVRSRVReleaseHandle(KERNEL_HANDLE_BASE, hMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO); if(eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR, "FreeMemCallBackCommon: PVRSRVReleaseHandle failed for exported meminfo")); return eError; } } switch(psMemInfo->memType) { case PVRSRV_MEMTYPE_WRAPPED: freeWrapped(psMemInfo); case PVRSRV_MEMTYPE_DEVICE: if (psMemInfo->psKernelSyncInfo) { psMemInfo->psKernelSyncInfo->ui32RefCount--; if (psMemInfo->psKernelSyncInfo->ui32RefCount == 0) { eError = PVRSRVFreeSyncInfoKM(psMemInfo->psKernelSyncInfo); } } case PVRSRV_MEMTYPE_DEVICECLASS: break; default: PVR_DPF((PVR_DBG_ERROR, "FreeMemCallBackCommon: Unknown memType")); eError = PVRSRV_ERROR_INVALID_MEMINFO; } } eError = FreeDeviceMem2(psMemInfo, bFromAllocator); return eError; }