Esempio n. 1
0
void SafeManager::run()
{
    WAIT_SEMAPHOR();
    ThreadAction local_action = action;
    std::vector<int> local_modIds = modIds;
    std::vector<int> local_conIds = conIds;
    std::vector<int> local_resIds = resIds;
    POST_SEMAPHOR();

    switch(local_action){
    case MRUN:{
            std::vector<double> waitVec;
            for (unsigned int i=0; i<local_modIds.size(); i++)
            {
                Executable * exec = Manager::getExecutableById(local_modIds[i]);
                if (exec)
                {
                    waitVec.push_back(exec->getPostExecWait());
                }
            }
            double minWait=*std::min_element(waitVec.begin(), waitVec.end());
            for (unsigned int i=0; i<local_modIds.size(); i++)
            {
                Executable * exec = Manager::getExecutableById(local_modIds[i]);
                if (exec)
                {
                    exec->setPostExecWait(exec->getPostExecWait() - minWait);
                }
                Manager::run(local_modIds[i], true);
            }

            /*
            for(unsigned int i=0; i<local_modIds.size(); i++)
                Manager::waitingModuleRun(local_modIds[i]);

            for(unsigned int i=0; i<local_conIds.size(); i++)
            {
                if(Manager::connected(local_conIds[i]))
                {
                    if(eventReceiver) eventReceiver->onConConnect(local_conIds[i]);
                }
                else
                {
                    if(eventReceiver) eventReceiver->onConDisconnect(local_conIds[i]);
                }
                refreshPortStatus(local_conIds[i]);
            }
            for(unsigned int i=0; i<local_resIds.size(); i++)
            {
                if(Manager::exist(local_resIds[i]))
                {
                    if(eventReceiver) eventReceiver->onResAvailable(local_resIds[i]);
                }
                else
                {
                    if(eventReceiver) eventReceiver->onResUnAvailable(local_resIds[i]);
                }
            }*/
            break;
        }
    case MSTOP:{
            std::vector<double> waitVec;
            for (unsigned int i=0; i<local_modIds.size(); i++)
            {
                Executable * exec = Manager::getExecutableById(local_modIds[i]);
                if (exec)
                {
                    waitVec.push_back(exec->getPostStopWait());
                }
            }
            double minWait=*std::min_element(waitVec.begin(), waitVec.end());
            for (unsigned int i=0; i<local_modIds.size(); i++)
            {
                Executable * exec = Manager::getExecutableById(local_modIds[i]);
                if (exec)
                {
                    exec->setPostStopWait(exec->getPostStopWait() - minWait);
                }
                Manager::stop(local_modIds[i], true);
            }
            /*for(unsigned int i=0; i<local_modIds.size(); i++)
                Manager::waitingModuleStop(local_modIds[i]);

            for(unsigned int i=0; i<local_conIds.size(); i++)
            {
                if(Manager::connected(local_conIds[i]))
                {
                    if(eventReceiver) eventReceiver->onConConnect(local_conIds[i]);
                }
                else
                {
                    if(eventReceiver) eventReceiver->onConDisconnect(local_conIds[i]);
                }
                refreshPortStatus(local_conIds[i]);
            }
            for(unsigned int i=0; i<local_resIds.size(); i++)
            {
                if(Manager::exist(local_resIds[i]))
                {
                    if(eventReceiver) eventReceiver->onResAvailable(local_resIds[i]);
                }
                else
                {
                    if(eventReceiver) eventReceiver->onResUnAvailable(local_resIds[i]);
                }
            }*/
            break;
        }
    case MKILL:{
            for(unsigned int i=0; i<local_modIds.size(); i++)
                Manager::kill(local_modIds[i], true);
            /*for(unsigned int i=0; i<local_modIds.size(); i++)
                Manager::waitingModuleKill(local_modIds[i]);

            for(unsigned int i=0; i<local_conIds.size(); i++)
            {
                if(Manager::connected(local_conIds[i]))
                {
                    if(eventReceiver) eventReceiver->onConConnect(local_conIds[i]);
                }
                else
                {
                    if(eventReceiver) eventReceiver->onConDisconnect(local_conIds[i]);
                }
                refreshPortStatus(local_conIds[i]);
            }
            for(unsigned int i=0; i<local_resIds.size(); i++)
            {
                if(Manager::exist(local_resIds[i]))
                {
                    if(eventReceiver) eventReceiver->onResAvailable(local_resIds[i]);
                }
                else
                {
                    if(eventReceiver) eventReceiver->onResUnAvailable(local_resIds[i]);
                }
            }*/
            break;
        }
    case MCONNECT:{
            for(unsigned int i=0; i<local_conIds.size(); i++)
            {
                if(Manager::connect(local_conIds[i]))
                {
                    if(eventReceiver) eventReceiver->onConConnect(local_conIds[i]);
                }
                else
                {
                    if(eventReceiver) eventReceiver->onConDisconnect(local_conIds[i]);
                }
                refreshPortStatus(local_conIds[i]);
            }
            break;
        }
    case MDISCONNECT:{
            for(unsigned int i=0; i<local_conIds.size(); i++)
            {
                if(Manager::disconnect(local_conIds[i]))
                {
                    if(eventReceiver) eventReceiver->onConDisconnect(local_conIds[i]);
                }
                else
                {
                    if(eventReceiver) eventReceiver->onConConnect(local_conIds[i]);
                }
                refreshPortStatus(local_conIds[i]);
            }
            break;
        }

    case MREFRESH:{
            busyAction = true;

            for(unsigned int i=0; i<local_modIds.size(); i++)
            {
                if(Manager::running(local_modIds[i]))
                {
                    if(eventReceiver) eventReceiver->onModStart(local_modIds[i]);
                }
                else //if(Manager::suspended(local_modIds[i]))
                {
                    if(eventReceiver) eventReceiver->onModStop(local_modIds[i]);
                }
            }

            for(unsigned int i=0; i<local_conIds.size(); i++)
            {
                if(Manager::connected(local_conIds[i]))
                {
                    if(eventReceiver) eventReceiver->onConConnect(local_conIds[i]);
                }
                else
                {
                    if(eventReceiver) eventReceiver->onConDisconnect(local_conIds[i]);
                }
                refreshPortStatus(local_conIds[i]);
            }

            for(unsigned int i=0; i<local_resIds.size(); i++)
            {
                if(Manager::exist(local_resIds[i]))
                {
                    if(eventReceiver) eventReceiver->onResAvailable(local_resIds[i]);
                }
                else
                {
                    if(eventReceiver) eventReceiver->onResUnAvailable(local_resIds[i]);
                }
            }
            busyAction = false;
            break;
        }

    case MREFRESH_CNN:{
            for(unsigned int i=0; i<local_conIds.size(); i++)
            {
                if(Manager::connected(local_conIds[i]))
                {
                    if(eventReceiver) eventReceiver->onConConnect(local_conIds[i]);
                }
                else
                {
                    if(eventReceiver) eventReceiver->onConDisconnect(local_conIds[i]);
                }
                refreshPortStatus(local_conIds[i]);
            }
            break;
        }

    case MATTACHSTDOUT:{
            for(unsigned int i=0; i<local_modIds.size(); i++)
                Manager::attachStdout(local_modIds[i]);
            break;
        }

    case MDETACHSTDOUT:{
            for(unsigned int i=0; i<local_modIds.size(); i++)
                Manager::detachStdout(local_modIds[i]);
            break;
        }

    case MLOADBALANCE:{
                busyAction = true;
                Manager::loadBalance();
                if(eventReceiver) eventReceiver->onLoadBalance();
                busyAction = false;
            break;
        }


    default:
        break;
    };

    if(eventReceiver)
        eventReceiver->onError();
}