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();
}
Esempio n. 2
0
bool Manager::prepare(bool silent)
{
    knowledge.reasolveDependency(strAppName.c_str(), bAutoDependancy, silent);

    clearExecutables();
    connections.clear();
    modules.clear();
    resources.clear();
    connections = knowledge.getSelConnection();
    modules = knowledge.getSelModules();
    resources = knowledge.getSelResources();

    /**
     *  we need to initialize a module with a local broker if the
     *  host property is set to "localhost".
     *
     * TODO: Resources should also be added to the relevant executable. up to now
     *  all of them will be handled by manager.
     */

    ModulePIterator itr;
    int id = 0;
    for(itr=modules.begin(); itr!=modules.end(); itr++)
    {
        Broker* broker = createBroker(*itr);
        Executable* exe = new Executable(broker, (MEvent*)this, bWithWatchDog);
        exe->setID(id++);
        exe->setCommand((*itr)->getName());
        exe->setParam((*itr)->getParam());
        exe->setHost((*itr)->getHost());
        exe->setStdio((*itr)->getStdio());
        exe->setWorkDir((*itr)->getWorkDir());        
        exe->setPostExecWait((*itr)->getPostExecWait());
        string env = string("YARP_PORT_PREFIX=") +
                        string((*itr)->getPrefix());
        exe->setEnv(env.c_str());

        /**
         * Adding connections to their owners
         * TODO: check whether this is still needed or not
         */

        //CnnIterator cnn;
        //for(cnn=connections.begin(); cnn!=connections.end(); cnn++)
        //    if((*cnn).owner() == (*itr))
        //        exe->addConnection(*cnn);

        /**
         * Adding resources to their owners
         */
        for(unsigned int i=0; i<resources.size(); i++)
        {
            ResYarpPort* res = dynamic_cast<ResYarpPort*>(resources[i]);
            if(res && (res->owner() == (*itr)))
                exe->addResource(*res);
        }

        runnables.push_back(exe);
    }

    return true;
}