HRESULT MV_CC_DSS_Reg(pMV_CC_DSS_ServiceInfo_t pSrvInfo) { HRESULT res; pMV_CC_ICCNet_t pICCNet; pMV_CC_DSS_ServiceInfo_t pSrvInfo_copy; if (pSrvInfo == NULL) MV_CC_DBG_Error(E_INVALIDARG, "MV_CC_DSS_Reg", NULL); if (pMV_APP_DSS == NULL) MV_CC_DBG_Error(E_NOTREADY, "MV_CC_DSS_Reg", NULL); pICCNet = pMV_APP_DSS->m_pICCNet; // check service id need dynamic generator? if (pSrvInfo->m_ServiceID == MV_CC_ServiceID_DynamicApply) { //get a new dynamic service id pSrvInfo->m_ServiceID = MV_CC_DSS_GetDynamicSID(pMV_APP_DSS); if (pSrvInfo->m_ServiceID == MV_CC_ServiceID_None) MV_CC_DBG_Error(E_FAIL, "MV_CC_DSS_Reg", NULL); } pSrvInfo_copy = MV_CC_DSS_GlobalServiceList_SrvInfo_Ctor(); if (pSrvInfo_copy == NULL) MV_CC_DBG_Error(E_OUTOFMEMORY, "MV_CC_DSS_Reg", NULL); GaloisMemcpy(pSrvInfo_copy, pSrvInfo, sizeof(MV_CC_DSS_ServiceInfo_t)); MV_OSAL_Mutex_Lock(pMV_APP_DSS->m_hGSListMutex); res = MV_CC_DSS_GlobalServiceList_Add(pSrvInfo->m_ServiceID, pSrvInfo_copy); if (res != S_OK) { MV_CC_DBG_Warning(res, "MV_CC_DSS_Reg MV_CC_DSS_GlobalServiceList_Add", NULL); goto MV_CC_DSS_Reg_Failure; } // Only for test //res = MV_CC_DSS_GlobalServiceList_Traversal(GSList_VisitFunc_Demo, NULL); MV_OSAL_Mutex_Unlock(pMV_APP_DSS->m_hGSListMutex); // Synchronize with Remote CPU res = MV_CC_DSS_DSPSendTo( pMV_APP_DSS, pMV_APP_DSS->m_RemoteCPU, DSPPacket_HeadGEN(CMD_DSS_Add, 1, 0, 0), (UCHAR *)pSrvInfo, sizeof(MV_CC_DSS_ServiceInfo_t)); if (res == E_FULL) res = S_OK; return res; MV_CC_DSS_Reg_Failure: MV_OSAL_Mutex_Unlock(pMV_APP_DSS->m_hGSListMutex); return res; }
HRESULT MV_CC_DSS_Reg(pMV_CC_DSS_ServiceInfo_t pSrvInfo, MV_CC_Task *cc_task ) { HRESULT res; pMV_CC_DSS_ServiceInfo_t pSrvInfo_copy; if (pSrvInfo == NULL) MV_CC_DBG_Error(E_INVALIDARG, "MV_CC_DSS_Reg", NULL); if (pMV_APP_DSS == NULL) MV_CC_DBG_Error(E_NOTREADY, "MV_CC_DSS_Reg", NULL); MV_OSAL_Mutex_Lock(pMV_APP_DSS->m_hGSListMutex); // check service id need dynamic generator? if (pSrvInfo->m_ServiceID == MV_CC_ServiceID_DynamicApply) { //get a new dynamic service id pSrvInfo->m_ServiceID = MV_CC_DSS_GetDynamicSID(pMV_APP_DSS); if (pSrvInfo->m_ServiceID == MV_CC_ServiceID_None) { pMV_APP_DSS->m_Status.m_RegErrCount++; MV_OSAL_Mutex_Unlock(pMV_APP_DSS->m_hGSListMutex); MV_CC_DBG_Error(E_FAIL, "MV_CC_DSS_Reg", NULL); } } pSrvInfo_copy = MV_CC_DSS_GlobalServiceList_SrvInfo_Ctor(); if (pSrvInfo_copy == NULL) { MV_OSAL_Mutex_Unlock(pMV_APP_DSS->m_hGSListMutex); MV_CC_DBG_Error(E_OUTOFMEMORY, "MV_CC_DSS_Reg", NULL); } GaloisMemcpy(pSrvInfo_copy, pSrvInfo, sizeof(MV_CC_DSS_ServiceInfo_t)); res = MV_CC_DSS_GlobalServiceList_Add(pSrvInfo->m_ServiceID, pSrvInfo_copy); if (res != S_OK) { pMV_APP_DSS->m_Status.m_RegErrCount++; MV_CC_DBG_Warning(res, "MV_CC_DSS_Reg" " MV_CC_DSS_GlobalServiceList_Add", NULL); goto MV_CC_DSS_Reg_Failure; } singlenode_add(cc_task->serverid_head, pSrvInfo->m_ServiceID); pMV_APP_DSS->m_Status.m_RegCount++; pMV_APP_DSS->m_Status.m_ServiceCount++; pMV_APP_DSS->m_Status.m_LastServiceID = pSrvInfo->m_ServiceID; MV_CC_DSS_Reg_Failure: MV_OSAL_Mutex_Unlock(pMV_APP_DSS->m_hGSListMutex); return res; }
HRESULT MV_CC_DSS_DSPOnRecvDemux(void *self, UCHAR *pFrameBuf) { HRESULT res = S_OK, i; MV_OSAL_CPUID_U8_t DstCPU; UINT8 Cmd, Param1; pMV_CC_DSP_t pHandle; pMV_CC_DSS_ServiceInfo_t pSrvInfo, pSrvInfo_copy; /* Parameter Check */ if (((pHandle = (pMV_CC_DSP_t)self ) == NULL) || (pFrameBuf == NULL)) MV_CC_DBG_Error(E_NOTREADY, "MV_CC_DSS_DSPOnRecvDemux", NULL); DstCPU = ICCP_SrcCPU(pFrameBuf); Cmd = CCDSP_Command(pFrameBuf); switch (Cmd) { case CMD_DSS_AskUpdate: //if (DstCPU != MV_OSAL_CPU_LOCAL) if (DstCPU == pHandle->m_RemoteCPU) { // Ask DSS_Update_Task to update with Remote CPU //MV_OSAL_Sem_Post(pHandle->m_UpdateTaskSem); res = DSS_Update(pHandle); } else { MV_CC_DBG_Warning(res, "MV_CC_DSS_DSPOnRecvDemux CMD_DSS_AskUpdate error", NULL); res = E_FAIL; } break; case CMD_DSS_UpdateOK: MV_CC_DBG_Info("(CPU-%d)MV_CC_DSS_DSPOnRecvDemux CMD_DSS_UpdateOK from (CPU-%d)\n", MV_OSAL_CPU_LOCAL, DstCPU); pHandle->m_bStatusUpdate = true; res = S_OK; // Only for test //res = MV_CC_DSS_GlobalServiceList_Traversal(GSList_VisitFunc_Demo, NULL); break; case CMD_DSS_UpdateError: MV_CC_DBG_Info("(CPU-%d)MV_CC_DSS_DSPOnRecvDemux CMD_DSS_UpdateError from (CPU-%d)\n", MV_OSAL_CPU_LOCAL, DstCPU); //pHandle->m_bStatusUpdate = false; res = S_OK; break; case CMD_DSS_Add: Param1 = CCDSP_Param1(pFrameBuf); i = 0; while (i < Param1) { if ( (sizeof(MV_CC_DSS_ServiceInfo_t) * ( i + 1 )) > MV_CC_CCDSP_DATA_BYTESIZE) { res = E_OUTOFRANGE; MV_CC_DBG_Warning(res, "MV_CC_DSS_DSPOnRecvDemux CMD_DSS_Add->Parameter 1", NULl); break; } pSrvInfo = (pMV_CC_DSS_ServiceInfo_t)(DSPPacket_DataStart(pFrameBuf) + sizeof(MV_CC_DSS_ServiceInfo_t) * i); pSrvInfo_copy = MV_CC_DSS_GlobalServiceList_SrvInfo_Ctor(); if (pSrvInfo_copy == NULL) MV_CC_DBG_Error(E_OUTOFMEMORY, "MV_CC_DSS_DSPOnRecvDemux", NULL); GaloisMemcpy(pSrvInfo_copy, pSrvInfo, sizeof(MV_CC_DSS_ServiceInfo_t)); MV_OSAL_Mutex_Lock(pHandle->m_hGSListMutex); res = MV_CC_DSS_GlobalServiceList_Add(pSrvInfo->m_ServiceID, pSrvInfo_copy); if (res != S_OK) MV_CC_DBG_Warning(res, "MV_CC_DSS_DSPOnRecvDemux MV_CC_DSS_GlobalServiceList_Add", NULL); // Only for test //res = MV_CC_DSS_GlobalServiceList_Traversal(GSList_VisitFunc_Demo, NULL); MV_OSAL_Mutex_Unlock(pHandle->m_hGSListMutex); i++; } break; case CMD_DSS_Delete: Param1 = CCDSP_Param1(pFrameBuf); i = 0; while (i < Param1) { if ( (sizeof(MV_CC_DSS_ServiceInfo_t) * ( i + 1 )) > MV_CC_CCDSP_DATA_BYTESIZE) { res = E_OUTOFRANGE; MV_CC_DBG_Warning(res, "MV_CC_DSS_DSPOnRecvDemux CMD_DSS_Delete->Parameter 1", NULL); break; } pSrvInfo = (pMV_CC_DSS_ServiceInfo_t)(DSPPacket_DataStart(pFrameBuf) + sizeof(MV_CC_DSS_ServiceInfo_t) * i); MV_OSAL_Mutex_Lock(pHandle->m_hGSListMutex); res = MV_CC_DSS_GlobalServiceList_Delete(pSrvInfo->m_ServiceID); if (res != S_OK) MV_CC_DBG_Warning(res, "MV_CC_DSS_DSPOnRecvDemux MV_CC_DSS_GlobalServiceList_Delete", NULL); // Only for test //res = MV_CC_DSS_GlobalServiceList_Traversal(GSList_VisitFunc_Demo, NULL); MV_OSAL_Mutex_Unlock(pHandle->m_hGSListMutex); i++; } break; default: res = E_BADVALUE; MV_CC_DBG_Warning(res, "MV_CC_DSS_DSPOnRecvDemux Error Command", NULL); break; } if (res == S_OK) pHandle->m_RdCount++; else pHandle->m_RdErrCount++; return res; }