/* * ======== STRMWRAP_FreeBuffer ======== */ u32 STRMWRAP_FreeBuffer(union Trapped_Args *args, void *pr_ctxt) { DSP_STATUS status = DSP_SOK; u8 **apBuffer = NULL; u32 uNumBufs = args->ARGS_STRM_FREEBUFFER.uNumBufs; DBC_Require(uNumBufs <= MAX_BUFS); apBuffer = MEM_Alloc((uNumBufs * sizeof(u8 *)), MEM_NONPAGED); cp_fm_usr(apBuffer, args->ARGS_STRM_FREEBUFFER.apBuffer, status, uNumBufs); if (DSP_SUCCEEDED(status)) { mutex_lock(&((struct PROCESS_CONTEXT *)pr_ctxt)->strm_lock); status = STRM_FreeBuffer(args->ARGS_STRM_FREEBUFFER.hStream, apBuffer, uNumBufs, pr_ctxt); mutex_unlock(&((struct PROCESS_CONTEXT *)pr_ctxt)->strm_lock); } cp_to_usr(args->ARGS_STRM_FREEBUFFER.apBuffer, apBuffer, status, uNumBufs); if (apBuffer) MEM_Free(apBuffer); return status; }
/* * ======== STRM_AllocateBuffer ======== * Purpose: * Allocates buffers for a stream. */ DSP_STATUS STRM_AllocateBuffer(struct STRM_OBJECT *hStrm, u32 uSize, OUT u8 **apBuffer, u32 uNumBufs, struct PROCESS_CONTEXT *pr_ctxt) { DSP_STATUS status = DSP_SOK; u32 uAllocated = 0; u32 i; HANDLE hSTRMRes; DBC_Require(cRefs > 0); DBC_Require(apBuffer != NULL); /* * Allocate from segment specified at time of stream open. */ if (uSize == 0) status = DSP_ESIZE; if (DSP_FAILED(status)) goto func_end; for (i = 0; i < uNumBufs; i++) { DBC_Assert(hStrm->hXlator != NULL); (void)CMM_XlatorAllocBuf(hStrm->hXlator, &apBuffer[i], uSize); if (apBuffer[i] == NULL) { status = DSP_EMEMORY; uAllocated = i; break; } } if (DSP_FAILED(status)) STRM_FreeBuffer(hStrm, apBuffer, uAllocated, pr_ctxt); if (DSP_FAILED(status)) goto func_end; if (DRV_GetSTRMResElement(hStrm, &hSTRMRes, pr_ctxt) != DSP_ENOTFOUND) DRV_ProcUpdateSTRMRes(uNumBufs, hSTRMRes); func_end: return status; }
/* * ======== STRM_AllocateBuffer ======== * Purpose: * Allocates buffers for a stream. */ DSP_STATUS STRM_AllocateBuffer(struct STRM_OBJECT *hStrm, u32 uSize, OUT u8 **apBuffer, u32 uNumBufs) { DSP_STATUS status = DSP_SOK; u32 uAllocated = 0; u32 i; #ifndef RES_CLEANUP_DISABLE DSP_STATUS res_status = DSP_SOK; u32 hProcess; HANDLE pCtxt = NULL; HANDLE hDrvObject; HANDLE hSTRMRes; #endif DBC_Require(cRefs > 0); DBC_Require(apBuffer != NULL); GT_4trace(STRM_debugMask, GT_ENTER, "STRM_AllocateBuffer: hStrm: 0x%x\t" "uSize: 0x%x\tapBuffer: 0x%x\tuNumBufs: 0x%x\n", hStrm, uSize, apBuffer, uNumBufs); if (MEM_IsValidHandle(hStrm, STRM_SIGNATURE)) { /* * Allocate from segment specified at time of stream open. */ if (uSize == 0) status = DSP_ESIZE; } if (DSP_FAILED(status)) { status = DSP_EHANDLE; goto func_end; } for (i = 0; i < uNumBufs; i++) { DBC_Assert(hStrm->hXlator != NULL); (void)CMM_XlatorAllocBuf(hStrm->hXlator, &apBuffer[i], uSize); if (apBuffer[i] == NULL) { GT_0trace(STRM_debugMask, GT_7CLASS, "STRM_AllocateBuffer: " "DSP_FAILED to alloc shared memory.\n"); status = DSP_EMEMORY; uAllocated = i; break; } } if (DSP_FAILED(status)) STRM_FreeBuffer(hStrm, apBuffer, uAllocated); #ifndef RES_CLEANUP_DISABLE if (DSP_FAILED(status)) goto func_end; /* 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_ProcUpdateSTRMRes(uNumBufs, hSTRMRes, pCtxt); } } #endif func_end: return status; }