/*! ****************************************************************************** @Function PVRSRVLookupHandleAnyType @Description Lookup the data pointer and type corresponding to a handle @Input ppvData - location to return data pointer peType - location to return handle type hHandle - handle from client @Output ppvData - points to the data pointer peType - points to handle type @Return Error code or PVRSRV_OK ******************************************************************************/ PVRSRV_ERROR PVRSRVLookupHandleAnyType(PVRSRV_HANDLE_BASE *psBase, IMG_PVOID *ppvData, PVRSRV_HANDLE_TYPE *peType, IMG_HANDLE hHandle) { HANDLE_DATA *psHandleData = IMG_NULL; PVRSRV_ERROR eError; PVR_ASSERT(gpsHandleFuncs); if (psBase == IMG_NULL) { PVR_DPF((PVR_DBG_ERROR, "PVRSRVLookupHandleAnyType: Missing handle base")); eError = PVRSRV_ERROR_INVALID_PARAMS; goto err; } eError = GetHandleData(psBase, &psHandleData, hHandle, PVRSRV_HANDLE_TYPE_NONE); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR, "PVRSRVLookupHandleAnyType: Error looking up handle (%s)", PVRSRVGetErrorStringKM(eError))); OSDumpStack(); goto err; } *ppvData = psHandleData->pvData; *peType = psHandleData->eType; eError = PVRSRV_OK; err: return eError; }
/*! ****************************************************************************** @Function GetHandleData @Description Get the data associated with the given handle @Input psBase - Pointer to handle base structure hHandle - Handle from which data should be retrieved ppvData - Points to a void data pointer @Output ppvData - Points to a void data pointer @Return Error code or PVRSRV_OK ******************************************************************************/ static PVRSRV_ERROR GetHandleData(HANDLE_IMPL_BASE *psBase, IMG_HANDLE hHandle, IMG_VOID **ppvData) { IMG_UINT32 ui32Index = HANDLE_TO_INDEX(hHandle); HANDLE_IMPL_DATA *psHandleData; PVR_ASSERT(psBase); PVR_ASSERT(ppvData); /* Check handle index is in range */ if (!INDEX_IS_VALID(psBase, ui32Index)) { PVR_DPF((PVR_DBG_ERROR, "%s: Handle index out of range (%u >= %u)", __FUNCTION__, ui32Index, psBase->ui32TotalHandCount)); OSDumpStack(); return PVRSRV_ERROR_HANDLE_INDEX_OUT_OF_RANGE; } psHandleData = INDEX_TO_HANDLE_DATA(psBase, ui32Index); *ppvData = psHandleData->pvData; return PVRSRV_OK; }
/*! ****************************************************************************** @Function PVRSRVLookupSubHandle @Description Lookup the data pointer corresponding to a subhandle @Input ppvData - location to return data pointer hHandle - handle from client eType - handle type hAncestor - ancestor handle @Output ppvData - points to the data pointer @Return Error code or PVRSRV_OK ******************************************************************************/ PVRSRV_ERROR PVRSRVLookupSubHandle(PVRSRV_HANDLE_BASE *psBase, IMG_PVOID *ppvData, IMG_HANDLE hHandle, PVRSRV_HANDLE_TYPE eType, IMG_HANDLE hAncestor) { HANDLE_DATA *psPHandleData = IMG_NULL; HANDLE_DATA *psCHandleData = IMG_NULL; PVRSRV_ERROR eError; /* PVRSRV_HANDLE_TYPE_NONE is reserved for internal use */ PVR_ASSERT(eType != PVRSRV_HANDLE_TYPE_NONE); PVR_ASSERT(gpsHandleFuncs); if (psBase == IMG_NULL) { PVR_DPF((PVR_DBG_ERROR, "PVRSRVLookupSubHandle: Missing handle base")); eError = PVRSRV_ERROR_INVALID_PARAMS; goto err; } eError = GetHandleData(psBase, &psCHandleData, hHandle, eType); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR, "PVRSRVLookupSubHandle: Error looking up subhandle (%s)", PVRSRVGetErrorStringKM(eError))); OSDumpStack(); goto err; } /* Look for hAncestor among the handle's ancestors */ for (psPHandleData = psCHandleData; ParentHandle(psPHandleData) != hAncestor; ) { eError = GetHandleData(psBase, &psPHandleData, ParentHandle(psPHandleData), PVRSRV_HANDLE_TYPE_NONE); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVLookupSubHandle: Subhandle doesn't belong to given ancestor")); eError = PVRSRV_ERROR_INVALID_SUBHANDLE; goto err; } } *ppvData = psCHandleData->pvData; eError = PVRSRV_OK; err: return eError; }
/*! ****************************************************************************** @Function PVRSRVGetParentHandle @Description Lookup the parent of a handle @Input phParent - location for returning parent handle hHandle - handle for which the parent handle is required eType - handle type hParent - parent handle @Output *phParent - parent handle, or IMG_NULL if there is no parent @Return Error code or PVRSRV_OK. Note that not having a parent is not regarded as an error. ******************************************************************************/ PVRSRV_ERROR PVRSRVGetParentHandle(PVRSRV_HANDLE_BASE *psBase, IMG_HANDLE *phParent, IMG_HANDLE hHandle, PVRSRV_HANDLE_TYPE eType) { HANDLE_DATA *psHandleData = IMG_NULL; PVRSRV_ERROR eError; /* PVRSRV_HANDLE_TYPE_NONE is reserved for internal use */ PVR_ASSERT(eType != PVRSRV_HANDLE_TYPE_NONE); PVR_ASSERT(gpsHandleFuncs); if (psBase == IMG_NULL) { PVR_DPF((PVR_DBG_ERROR, "PVRSRVGetParentHandle: Missing handle base")); eError = PVRSRV_ERROR_INVALID_PARAMS; goto err; } eError = GetHandleData(psBase, &psHandleData, hHandle, eType); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR, "PVRSRVGetParentHandle: Error looking up subhandle (%s)", PVRSRVGetErrorStringKM(eError))); OSDumpStack(); goto err; } *phParent = ParentHandle(psHandleData); eError = PVRSRV_OK; err: return eError; }