ret_ CXMLLoaderActions::Load(XercesDOMParser *pParser, const ch_1 *pszEnvironmentPath) { #ifdef _DEBUG_ if (!pParser) return PARAMETER_NULL | PARAMETER_1; if (!pszEnvironmentPath) return PARAMETER_NULL | PARAMETER_2; if (null_v == pszEnvironmentPath[0]) return PARAMETER_EMPTY | PARAMETER_2; #endif SetParser(pParser); ch_1 sActions[ENVIRONMENT_PATH_LENGTH]; memset(sActions, 0, ENVIRONMENT_PATH_LENGTH); sprintf(sActions, "%s%s", pszEnvironmentPath, ACTIONS_XML_FILE); DOMDocument *pActionsDoc = null_v; try { GetParser()->parse(sActions); pActionsDoc = GetParser()->getDocument(); } catch (const OutOfMemoryException &err) { auto_xerces_str sErr(err.getMessage()); printf("%s\n", (const ch_1 *)sErr); return XML_LOADER_ERROR; } catch (const XMLException &err) { auto_xerces_str sErr(err.getMessage()); printf("%s\n", (const ch_1 *)sErr); return XML_LOADER_ERROR; } catch (const DOMException &err) { auto_xerces_str sErr(err.msg); printf("%s\n", (const ch_1 *)sErr); return XML_LOADER_ERROR; } catch (...) { printf("Unexpected error during parsing.\n"); return XML_LOADER_ERROR; } if (!pActionsDoc) return XML_LOADER_ERROR; DOMElement *pRoot = pActionsDoc->getDocumentElement(); if (!pRoot) return XML_LOADER_ERROR; DOMElement *pChild = (DOMElement *)pRoot->getFirstChild(); if (!pChild) return XML_LOADER_ERROR; auto_xerces_str wsDataBlock("data_block"); auto_xerces_str wsStart("start"); auto_xerces_str wsProcessor("processor"); auto_xerces_str wsEnd("end"); while (pChild) { if (0 == XMLString::compareString(pChild->getNodeName(), wsDataBlock)) { if (SUCCESS != LoadDataBlock(CUIManager::Instance()->Data(), pChild)) { return XML_LOADER_ERROR; } } else if (0 == XMLString::compareString(pChild->getNodeName(), wsStart)) { if (SUCCESS != LoadProgram(&CUIManager::Instance()->Data(), CUIManager::Instance()->StartProgram(), pChild)) { return XML_LOADER_ERROR; } } else if (0 == XMLString::compareString(pChild->getNodeName(), wsProcessor)) { if (SUCCESS != LoadProcessor(pChild)) return XML_LOADER_ERROR; m_pTmpContainer = null_v; } else if (0 == XMLString::compareString(pChild->getNodeName(), wsEnd)) { if (SUCCESS != LoadProgram(&CUIManager::Instance()->Data(), CUIManager::Instance()->EndProgram(), pChild)) { return XML_LOADER_ERROR; } } pChild = (DOMElement *)pChild->getNextSibling(); } return SUCCESS; }
/* * Run task SIII */ int RCSchedIII(Queue ReadyQ, struct Counts *counters, struct PEs *pes) { int task,tmp; struct NodeData nd; int freePRR = 5; int freeGPP=0; if (IsEmpty(ReadyQ)) return QEmpty; task = Front(ReadyQ); switch (getTaskMode(task)) { case HybSW: case SWOnly: /* * FIXME this has to be changed to accommodate more than one GPPs */ if ((freeGPP=FindFreeGPP(0xFF,pes->SWPE))<0) { #if SW_HW_MIG if (getTaskMode(task) == HybSW) { setTaskMode(task, HybHW); counters->SW2HWMig++; #if DEBUG_PRINT fprintf(stderr,"Task %d migrate from SW to Any\n",task); #endif } else { #endif counters->busyCounterSW++; return BUSY; } #if SW_HW_MIG } #endif Dequeue(ReadyQ); nd.ExecCount = (unsigned int) dfg1[task].Emu.SWdelay; nd.Module = dfg1[task].TypeID; nd.TaskID = task; setTaskSimPrrUsed(task,freeGPP+pes->HWPE->size); LoadProcessor(pes->SWPE->pe+freeGPP, nd); counters->SWTasksCounter++; break; case HybHW: case HWOnly: nd.ExecCount = (unsigned int) dfg1[task].Emu.HWdelay; nd.Module = dfg1[task].TypeID; nd.TaskID = task; #if SW_HW_MIG if (TasksTypes[dfg1[task].TypeID].SWPriority == 0 && FindFreeGPP(0xFF,pes->SWPE)>=0 && getTaskMode(task) == HybHW) { setTaskMode(task, HybSW); counters->HW2SWMig++; #if DEBUG_PRINT fprintf(stderr,"Task %d migrate from HW to SW highest prio \n",task); #endif return EXIT_SUCCESS; } #endif if ((tmp=SearchReuse(ReadyQ,pes->HWPE,MAX_QUEUE_TASKS))>=0) {task=tmp; nd.ExecCount = (unsigned int) dfg1[task].Emu.HWdelay; nd.Module = dfg1[task].TypeID; nd.TaskID = task; } if ((freePRR = ReusePRR_V2(nd.Module, pes->HWPE)) < 0) { if (IsReconfiguring()) { return 5; } if ((freePRR = FindFreePRRPrio( getTaskTypeCanRun(dfg1[task].TypeID), pes->HWPE)) < 0) { #if SW_HW_MIG if (FindFreeGPP(0xFF,pes->SWPE)>=0 && getTaskMode(task) == HybHW) { setTaskMode(task, HybSW); counters->HW2SWMig++; #if DEBUG_PRINT fprintf(stderr,"Task %d migrate from HW to SW\n",task); #endif return EXIT_SUCCESS; } else { #endif counters->busyCounterHW++; return BUSY; #if SW_HW_MIG } #endif } #if SW_HW_MIG else if (TasksTypes[dfg1[task].TypeID].SWPriority <= freePRR && FindFreeGPP(0xFF,pes->SWPE)>=0 && getTaskMode(task) == HybHW) { setTaskMode(task, HybSW); counters->HW2SWMig++; return EXIT_SUCCESS; #if DEBUG_PRINT fprintf(stderr,"tasks [%d] moved to software due to priority \n",task); #endif } #endif Dequeue(ReadyQ); setTaskSimPrrUsed(task,freePRR); setTaskSimReused(task,NO); setTaskSimConfTimeStart(task,GetTimer()); ReconfignLoad(pes->HWPE->pe + freePRR, freePRR, ConfigTime[freePRR], nd); break; } else { counters->ReuseCounter++; setTaskSimPrrUsed(task,freePRR); setTaskSimReused(task,YES); Dequeue(ReadyQ); } #if DEBUG_PRINT fprintf(stderr,"Using PRR MATH%d for task [%d]\n",freePRR,task); #endif LoadProcessor(pes->HWPE->pe + freePRR, nd); break; case CustomHW: case CustomHWnSW: default: fprintf(stderr, "ERROR [RunTask] Unsupported mode check your DFG file .. Exiting\n"); return EXIT_FAILURE; } return EXIT_SUCCESS; }