Int IpcResource_request(IpcResource_Handle handle, IpcResource_ResHandle *resHandle, IpcResource_Type type, Void *resParams) { Char msg[MAXMSGSIZE]; IpcResource_Req *req = (Void *)msg; IpcResource_Ack *ack = (Void *)msg; UInt16 hlen = sizeof(*req); UInt16 alen = sizeof(*ack); UInt16 rlen = IpcResource_resLen(type); UInt16 len; UInt32 remote; Int status; if (!handle || !resHandle) { System_printf("IpcResource_request: Invalid paramaters\n"); return IpcResource_E_INVALARGS; } if (rlen && !resParams) { System_printf("IpcResource_request: resource type %d " "needs parameters\n", type); return IpcResource_E_INVALARGS; } req->resType = type; req->reqType = IpcResource_REQ_TYPE_ALLOC; memcpy(req->resParams, resParams, rlen); status = MessageQCopy_send(MultiProc_getId("HOST"), IpcResource_server, handle->endPoint, req, hlen + rlen); if (status) { System_printf("IpcResource_request: MessageQCopy_send " "failed status %d\n", status); status = IpcResource_E_FAIL; goto end; } status = MessageQCopy_recv(handle->msgq, ack, &len, &remote, handle->timeout); if (status) { System_printf("IpcResource_request: MessageQCopy_recv " "failed status %d\n", status); status = (status == MessageQCopy_E_TIMEOUT) ? IpcResource_E_TIMEOUT : IpcResource_E_FAIL; goto end; } status = _IpcResource_translateError(ack->status); if (status) { System_printf("IpcResource_request: error from Host " "failed status %d\n", status); goto end; } Assert_isTrue(len == (rlen + alen), NULL); *resHandle = ack->resHandle; memcpy(resParams, ack->resParams, rlen); end: return status; }
Int IpcResource_request(IpcResource_Handle handle, IpcResource_ResHandle *resHandle, IpcResource_Type type, Void *resParams) { Char msg[MAXMSGSIZE]; IpcResource_Req *req = (Void *)msg; IpcResource_AllocData *rdata = (Void *)req->data; IpcResource_Ack *ack = (Void *)msg; IpcResource_AckData *adata = (Void *)ack->data; UInt16 hlen = sizeof(*rdata) + sizeof(*req); UInt16 alen = sizeof(*ack); UInt16 rlen = IpcResource_resLen(type); UInt16 len; UInt32 remote; Int status; Char *name; IpcResource_Processor rproc; if (!handle || !resHandle) { System_printf("IpcResource_request: Invalid paramaters\n"); return IpcResource_E_INVALARGS; } name = IpcResource_toName(type); if (!name) { System_printf("IpcResource_request: resource type %d " "is invalid\n", type); return IpcResource_E_INVALARGS; } if (rlen && !resParams) { System_printf("IpcResource_request: resource type %d " "needs parameters\n", type); return IpcResource_E_INVALARGS; } strncpy(rdata->resName, name, 16); req->reqType = IpcResource_ReqType_ALLOC; switch(type) { case IpcResource_TYPE_IPU: case IpcResource_TYPE_DSP: strcpy(rproc.name, rdata->resName); strncpy(rdata->resName, "rproc", 16); resParams = &rproc; rlen = sizeof(rproc); break; default: break; } memcpy(rdata->resParams, resParams, rlen); Semaphore_pend(handle->sem, BIOS_WAIT_FOREVER); status = MessageQCopy_send(MultiProc_getId("HOST"), handle->remote, handle->endPoint, req, hlen + rlen); if (status) { Semaphore_post(handle->sem); System_printf("IpcResource_request: MessageQCopy_send " "failed status %d\n", status); status = IpcResource_E_FAIL; goto end; } status = MessageQCopy_recv(handle->msgq, ack, &len, &remote, handle->timeout); Semaphore_post(handle->sem); if (status) { System_printf("IpcResource_request: MessageQCopy_recv " "failed status %d\n", status); status = (status == MessageQCopy_E_TIMEOUT) ? IpcResource_E_TIMEOUT : IpcResource_E_FAIL; goto end; } if (remote != handle->remote) { System_printf("IpcResource_request: MessageQCopy_recv " "invalid message source %d, channel source %d\n", remote, handle->remote); status = IpcResource_E_FAIL; goto end; } status = _IpcResource_translateError(ack->status); if (status) { System_printf("IpcResource_request: error from Host " "failed status %d\n", status); goto end; } Assert_isTrue(len == rlen + alen + sizeof(*adata), NULL); *resHandle = adata->resHandle; memcpy(resParams, adata->resParams, rlen); end: return status; }