/* * ======== STRM_Close ======== * Purpose: * Close a stream opened with STRM_Open(). */ DSP_STATUS STRM_Close(struct STRM_OBJECT *hStrm, struct PROCESS_CONTEXT *pr_ctxt) { struct WMD_DRV_INTERFACE *pIntfFxns; struct CHNL_INFO chnlInfo; DSP_STATUS status = DSP_SOK; HANDLE hSTRMRes; DBC_Require(cRefs > 0); GT_1trace(STRM_debugMask, GT_ENTER, "STRM_Close: hStrm: 0x%x\n", hStrm); /* Have all buffers been reclaimed? If not, return * DSP_EPENDING */ pIntfFxns = hStrm->hStrmMgr->pIntfFxns; status = (*pIntfFxns->pfnChnlGetInfo) (hStrm->hChnl, &chnlInfo); DBC_Assert(DSP_SUCCEEDED(status)); if (chnlInfo.cIOCs > 0 || chnlInfo.cIOReqs > 0) status = DSP_EPENDING; else status = DeleteStrm(hStrm); if (DSP_FAILED(status)) goto func_end; if (DRV_GetSTRMResElement(hStrm, &hSTRMRes, pr_ctxt) != DSP_ENOTFOUND) DRV_ProcRemoveSTRMResElement(hSTRMRes, pr_ctxt); func_end: DBC_Ensure(status == DSP_SOK || status == DSP_EHANDLE || status == DSP_EPENDING || status == DSP_EFAIL); return status; }
/* * ======== STRM_Close ======== * Purpose: * Close a stream opened with STRM_Open(). */ DSP_STATUS STRM_Close(struct STRM_OBJECT *hStrm) { struct WMD_DRV_INTERFACE *pIntfFxns; struct CHNL_INFO chnlInfo; DSP_STATUS status = DSP_SOK; #ifndef RES_CLEANUP_DISABLE u32 hProcess; HANDLE pCtxt = NULL; HANDLE hDrvObject; HANDLE hSTRMRes; DSP_STATUS res_status = DSP_SOK; #endif DBC_Require(cRefs > 0); GT_1trace(STRM_debugMask, GT_ENTER, "STRM_Close: hStrm: 0x%x\n", hStrm); if (!MEM_IsValidHandle(hStrm, STRM_SIGNATURE)) { status = DSP_EHANDLE; } else { /* Have all buffers been reclaimed? If not, return * DSP_EPENDING */ pIntfFxns = hStrm->hStrmMgr->pIntfFxns; status = (*pIntfFxns->pfnChnlGetInfo) (hStrm->hChnl, &chnlInfo); DBC_Assert(DSP_SUCCEEDED(status)); if (chnlInfo.cIOCs > 0 || chnlInfo.cIOReqs > 0) { status = DSP_EPENDING; } else { status = DeleteStrm(hStrm); if (DSP_FAILED(status)) { /* we already validated the handle. */ DBC_Assert(status != DSP_EHANDLE); /* make sure we return a documented result */ status = DSP_EFAIL; } } } #ifndef RES_CLEANUP_DISABLE if (DSP_FAILED(status)) goto func_end; /* Update the node and stream resource status */ /* Return PID instead of process handle */ hProcess = current->pid; res_status = CFG_GetObject((u32 *)&hDrvObject, REG_DRV_OBJECT); if (DSP_FAILED(res_status)) goto func_end; DRV_GetProcContext(hProcess, (struct DRV_OBJECT *)hDrvObject, &pCtxt, NULL, 0); if (pCtxt != NULL) { if (DRV_GetSTRMResElement(hStrm, &hSTRMRes, pCtxt) != DSP_ENOTFOUND) { DRV_ProcRemoveSTRMResElement(hSTRMRes, pCtxt); } } func_end: #endif DBC_Ensure(status == DSP_SOK || status == DSP_EHANDLE || status == DSP_EPENDING || status == DSP_EFAIL); return status; }