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;
}