[openrtm-commit:02580] r2983 - trunk/OpenRTM-aist/src/lib/rtm

openrtm @ openrtm.org openrtm @ openrtm.org
2017年 4月 16日 (日) 17:37:49 JST


Author: n-ando
Date: 2017-04-16 17:37:48 +0900 (Sun, 16 Apr 2017)
New Revision: 2983

Modified:
   trunk/OpenRTM-aist/src/lib/rtm/ManagerServant.cpp
   trunk/OpenRTM-aist/src/lib/rtm/ManagerServant.h
Log:
[incompat,newfunc] A new operation implemented to the ManagerServant. refs #3273

Modified: trunk/OpenRTM-aist/src/lib/rtm/ManagerServant.cpp
===================================================================
--- trunk/OpenRTM-aist/src/lib/rtm/ManagerServant.cpp	2017-04-14 09:31:34 UTC (rev 2982)
+++ trunk/OpenRTM-aist/src/lib/rtm/ManagerServant.cpp	2017-04-16 08:37:48 UTC (rev 2983)
@@ -17,6 +17,8 @@
  *
  */
 #include <coil/Process.h>
+#include <coil/Properties.h>
+#include <coil/stringutil.h>
 #include <rtm/Manager.h>
 #include <rtm/ManagerServant.h>
 #include <rtm/NVUtil.h>
@@ -44,12 +46,13 @@
         RTC_WARN(("Manager CORBA servant creation failed."));
         return;
       }
-    RTC_WARN(("Manager CORBA servant was successfully created."));
+    RTC_INFO(("Named manager reference (INS) was successfully created."));
 
     if (coil::toBool(config["manager.is_master"], "YES", "NO", true))
       { // this is master manager
         RTC_TRACE(("This manager is master."));
         m_isMaster = true;
+        RTC_INFO(("Master manager servant was successfully created."));
         return;
       }
     else
@@ -61,16 +64,16 @@
             owner = findManager(config["corba.master_manager"].c_str());
             if (CORBA::is_nil(owner))
               {
-                RTC_INFO(("Master manager not found"));
+                RTC_WARN(("Master manager not found"));
                 return;
               }
-            if (!createINSManager())
-              {
-                RTC_WARN(("Manager CORBA servant creation failed."));
-                return;
-              }
+            RTC_INFO(("Master manager found: %s",
+                      config["corba.master_manager"].c_str()));
+            RTC_INFO(("Adding this manager to this manager."))
             add_master_manager(owner);
+            RTC_INFO(("Register this manager to master manager."))
             owner->add_slave_manager(m_objref.in());
+            RTC_INFO(("Slave manager servant was successfully created."));
             return;
           }
         catch (...)
@@ -321,101 +324,56 @@
   RTC::RTObject_ptr ManagerServant::create_component(const char* module_name)
   {
     RTC_TRACE(("create_component(%s)", module_name));
-    
-    std::string arg(module_name);
-    std::string::size_type pos0(arg.find("&manager="));
-    std::string::size_type pos1(arg.find("?manager="));
-
-    if (pos0 == std::string::npos && pos1 == std::string::npos)
+    RTC_TRACE(("This manager is master: %s", m_isMaster ? "YES" : "NO"));
+    std::string create_arg(module_name);
+    if (create_arg.empty()) // invalid arg
       {
-        if (false) //is_master())
-          {
-            RTC_ERROR(("Master manager cannot create component: %s",
-                       module_name));
-            return RTC::RTObject::_nil();
-          }
-        // create on this manager
-        RTC::RTObject_impl* rtc = m_mgr.createComponent(module_name);
-        if (rtc == NULL)
-          {
-            return RTC::RTObject::_nil();
-          }
-        return RTC::RTObject::_duplicate(rtc->getObjRef());
-      }
-    // create other manager
-
-    // extract manager's location
-    std::string::size_type pos;
-    pos = (pos0 != std::string::npos) ? pos0 : pos1;
-    
-    std::string::size_type endpos;
-    endpos = arg.find('&', pos + 1);
-    std::string mgrstr(arg.substr(pos + 1, endpos - 1 - pos));
-    RTC_VERBOSE(("Manager arg: %s", mgrstr.c_str()));
-    coil::vstring mgrvstr(coil::split(mgrstr, ":"));
-    if (mgrvstr.size() != 2)
-      {
-        RTC_WARN(("Invalid manager name: %s", mgrstr.c_str()));
         return RTC::RTObject::_nil();
       }
-    std::string::size_type eqpos(mgrstr.find("="));
-    if (eqpos == std::string::npos)
-      {
-        RTC_WARN(("Invalid argument: %s", module_name));
-        return RTC::RTObject::_nil();
-      }
-    mgrstr.erase(0, eqpos + 1);
-    RTC_DEBUG(("Manager is %s", mgrstr.c_str()))
 
-    // find manager
-    RTM::Manager_var mgrobj = findManager(mgrstr.c_str());
-    if (CORBA::is_nil(mgrobj))
-      {
-        std::string cmd("rtcd -p ");
-        cmd += mgrvstr[1]; // port number
+    RTC::RTObject_var rtobj;
+    // create component by address
+    rtobj = createComponentByAddress(create_arg);
+    if (!CORBA::is_nil(rtobj)) { return rtobj._retn(); }
 
-        RTC_DEBUG(("Invoking command: %s.", cmd.c_str()));
-        int ret(coil::launch_shell(cmd.c_str()));
-        if (ret == -1)
-          {
-            RTC_DEBUG(("%s: failed", cmd.c_str()));
-            return RTC::RTObject::_nil();
-          }
+    // create component by manager's name
+    rtobj = createComponentByManagerName(create_arg);
+    if (!CORBA::is_nil(rtobj)) { return rtobj._retn(); }
 
-        // find manager
-        coil::usleep(10000);
-        int count(0);
-        while (CORBA::is_nil(mgrobj))
+    // === Master ===
+    // The aster manager never hosts RT-Components and it request to
+    // create to slave components.
+    if (m_isMaster)
+      {
+        Guard guard(m_slaveMutex);
+        for (size_t i(0); i < m_slaves.length(); ++i)
           {
-            mgrobj = findManager(mgrstr.c_str());
-            ++count;
-            if (count > 1000) { break; }
-            coil::usleep(10000);
+            try
+              {
+                RTC::RTObject_var rtobj;
+                rtobj = m_slaves[i]->create_component(create_arg.c_str());
+                RTC_DEBUG(("Component created %s",  create_arg.c_str()));
+                if (!CORBA::is_nil(rtobj)) { return rtobj._retn(); }
+              }
+            catch (CORBA::SystemException& e)
+              {
+                RTC_DEBUG(("Exception was caught while creating component."));
+              }
           }
+        return RTC::RTObject::_nil();
       }
 
-    if (CORBA::is_nil(mgrobj))
-      {
-        RTC_WARN(("Manager cannot be found."));
-        return RTC::RTObject::_nil();
-      }
-    
+    // === Slave ===
     // create component on the manager    
-    arg.erase(pos + 1, endpos - pos);
-    RTC_DEBUG(("Creating component on %s",  mgrstr.c_str()));
-    RTC_DEBUG(("arg: %s", arg.c_str()));
-    try
+    RTC_DEBUG(("Creating component on this manager"));
+    RTC_DEBUG(("arg: %s", create_arg.c_str()));
+    RTC::RTObject_impl* rtc = m_mgr.createComponent(create_arg.c_str());
+    if (rtc != NULL)
       {
-        RTC::RTObject_var rtobj;
-        rtobj = mgrobj->create_component(arg.c_str());
-        RTC_DEBUG(("Component created %s",  arg.c_str()));
-        return rtobj._retn();
+        return RTC::RTObject::_duplicate(rtc->getObjRef());
       }
-    catch (CORBA::SystemException& e)
-      {
-        RTC_DEBUG(("Exception was caught while creating component."));
-        return RTC::RTObject::_nil();
-      }
+
+    // no RTObject created.
     return RTC::RTObject::_nil();
   }
   
@@ -470,6 +428,7 @@
       }
 
     // get slaves' component references
+    Guard guard(m_slaveMutex);
     RTC_DEBUG(("%d slave managers exists.", m_slaves.length()));
     for (int i(0), len(m_slaves.length()); i < len; ++i)
       {
@@ -745,20 +704,40 @@
     return RTC::RTC_OK;
   }
   
-  
-  
+  /*!
+   * @if jp
+   * @brief プロセスのコピーを生成する
+   * @else
+   * @brief The copy of the process is generated.
+   * @endif
+   */
   RTC::ReturnCode_t ManagerServant::fork()
   {
     //    m_mgr.fork();
+    
     return ::RTC::RTC_OK;
   }
-  
+
+  /*!
+   * @if jp
+   * @brief shutdownする
+   * @else
+   * @brief This method shutdowns RTC.
+   * @endif
+   */
   RTC::ReturnCode_t ManagerServant::shutdown()
   {
     m_mgr.terminate();
     return ::RTC::RTC_OK;
   }
-  
+
+  /*!
+   * @if jp
+   * @brief 再起動する。
+   * @else
+   * @brief This method restarts RTC.
+   * @endif
+   */
   RTC::ReturnCode_t ManagerServant::restart()
   {
     //    m_mgr.restart();
@@ -768,10 +747,10 @@
   /*!
    * @if jp
    * @brief 指定名のRTCオブジェクトリファレンスを取得
-     * @else
-     * @brief Obtain specific RTObject reference by name
-     * @endig
-     */
+   * @else
+   * @brief Obtain specific RTObject reference by name
+   * @endig
+   */
   RTC::RTCList* ManagerServant::get_components_by_name(const char* name)
   {
     RTC_TRACE(("get_components_by_name()"));
@@ -819,18 +798,40 @@
       }
     return crtcs._retn();
   }
-  
+
+  /*!
+   * @if jp
+   * @brief RTCのリファレンスを取得する。
+   * @else
+   * @brief Get the reference of RTC.
+   * @endif
+   */
   CORBA::Object_ptr ManagerServant::get_service(const char* name)
   {
     return ::CORBA::Object::_nil();
   }
-  
+
+  //======================================================================
+  // Local functions
+  /*!
+   * @if jp
+   * @brief Managerのリファレンスを取得する。
+   * @else
+   * @brief Get the reference of Manager. 
+   * @endif
+   */  
   RTM::Manager_ptr ManagerServant::getObjRef() const
   {
     return m_objref;
   }
 
-
+  /*!
+   * @if jp
+   * @brief INSManagerの生成
+   * @else
+   * @brief Generate INSManager. 
+   * @endif
+   */
   bool ManagerServant::createINSManager()
   {
     try
@@ -847,7 +848,9 @@
 
         // Create readable object ID
         coil::Properties config(m_mgr.getConfig());
-        PortableServer::ObjectId_var id; 
+        PortableServer::ObjectId_var id;
+        RTC_DEBUG(("Creating named manager: %s",
+                   config["manager.name"].c_str()));
 #ifndef ORB_IS_RTORB
         id = PortableServer::string_to_ObjectId(config["manager.name"].c_str());
 #else // ORB_IS_RTORB
@@ -856,6 +859,7 @@
 #endif // ORB_IS_RTORB
 
         // Object activation
+        RTC_DEBUG(("Activating manager with id(%s)", config["manager.name"]));
         poa->activate_object_with_id(id.in(), this);
         CORBA::Object_var mgrobj = poa->id_to_reference(id);
 
@@ -876,11 +880,16 @@
     return true;
   }
 
-
-
-  RTM::Manager_ptr ManagerServant::findManager(const char* host_port)
+  /*!
+   * @if jp
+   * @brief Managerのリファレンスを検索する。
+   * @else
+   * @brief Find the reference of Manager. 
+   * @endif
+   */
+  RTM::Manager_ptr ManagerServant::findManager(const std::string& host_port)
   {
-    RTC_TRACE(("findManager(host_port = %s)", host_port));
+    RTC_TRACE(("findManager(host_port = %s)", host_port.c_str()));
     try
       {
         coil::Properties config(m_mgr.getConfig());
@@ -929,6 +938,272 @@
     return RTM::Manager::_nil();
   }
 
+  /*!
+   * @if jp
+   * @brief 指定名のマネージャを取得
+   * @else
+   * @brief Obtain Manager's reference by name
+   * @endif
+   */
+  RTM::Manager_ptr ManagerServant::findManagerByName(const std::string mgr_name)
+  {
+    RTC_TRACE(("findManagerByName(%s)", mgr_name.c_str()));
+
+    coil::Properties prop = m_mgr.getConfig();
+    if (mgr_name == prop["manager.instance_name"])
+      {
+        return RTM::Manager::_duplicate(getObjRef());
+      }
+    if (m_isMaster)
+      {
+        Guard guard(m_slaveMutex);
+        return findManagerFromList(mgr_name, m_slaves);
+      }
+    Guard guard(m_masterMutex);
+    return findManagerFromList(mgr_name, m_masters);
+  }
   
+  /*!
+   * @if jp
+   * @brief マネージャのリストから指定名を持つマネージャを取得
+   * @else
+   * @brief Obtain Manager's reference by name
+   * @endif
+   */
+  RTM::Manager_ptr ManagerServant::findManagerFromList(const std::string name,
+                                                       RTM::ManagerList& mlist)
+  {
+    for (CORBA::ULong i(0); i < mlist.length(); ++i)
+      {
+        try
+          {
+            if (CORBA::is_nil(mlist[i])) { continue; }
+            RTM::NVList_var nvlist = mlist[i]->get_configuration();
+            if (NVUtil::isStringValue(nvlist.in(),
+                                      "manager.instance_name",
+                                      name.c_str()))
+              {
+                return RTM::Manager::_duplicate(mlist[i]); // end condition
+              }
+            RTM::ManagerList_var slist = mlist[i]->get_slave_managers();
+            if (slist->length() == 0) { continue; }
+            RTM::Manager_var mgr = findManagerFromList(name, slist.inout());
+            if (CORBA::is_nil(mgr)) { continue; }
+            return mgr._retn(); // backtrack
+          }
+        catch (...)
+          {
+            RTC_ERROR(("A slave manager thrown exception."));
+            mlist[i] = RTM::Manager::_nil();
+            CORBA_SeqUtil::erase(mlist, i);
+            --i; // list length is shortened
+            RTC_ERROR(("This slave manager is removed from slave list."));
+          }
+      }
+    return RTM::Manager::_nil();
+  }
 
+  /*!
+   * @if jp
+   * @brief 指定のマネージャでRTCを起動する
+   * @else
+   * @brief Launch RTC on specified manager
+   * @endif
+   */
+  RTC::RTObject_ptr
+  ManagerServant::createComponentByManagerName(const std::string create_arg)
+  {
+    RTC_TRACE(("createComponentByManagerName(%s)",create_arg.c_str()));
+    coil::mapstring param = coil::urlparam2map(create_arg);
+    for (coil::mapstring::iterator it(param.begin()); it != param.end(); ++it)
+      {
+        RTC_DEBUG(("create_arg[%s] = %s",
+                   it->first.c_str(), it->second.c_str()));
+      }
+
+    std::string mgrstr = param["manager_name"];
+    if (mgrstr.empty())
+      {
+        RTC_WARN(("No manager_name found: %s", mgrstr.c_str()));
+        return RTC::RTObject::_nil();
+      }
+
+    // detect languange
+    std::string lang = param["language"];
+    if (lang.empty()) { lang = "C++"; }
+    RTC_INFO(("Specified manager's language: %s", lang));
+
+    RTM::Manager_var mgrobj = findManagerByName(mgrstr);
+    if (CORBA::is_nil(mgrobj))
+      {
+        RTC_INFO(("Manager: %s not found.", mgrstr.c_str()));
+        RTC_INFO(("Creating new manager named %s", mgrstr.c_str()));
+
+        std::string rtcd_cmd_key("manager.modules.");
+        rtcd_cmd_key += lang + "manager_cmd";
+        coil::Properties& prop = m_mgr.getConfig();
+        std::string rtcd_cmd = prop[rtcd_cmd_key];
+
+        if (rtcd_cmd.empty())
+          {
+            RTC_WARN(("rtcd command name not found. Default rtcd is used"));
+            rtcd_cmd = "rtcd";
+          }
+        rtcd_cmd += " -o manager.is_master:NO";
+        rtcd_cmd += " -o manager.corba_servant:YES";
+        rtcd_cmd += " -o corba.master_manager:" + prop["corba.master_manager"];
+        rtcd_cmd += " -o manager.name:" + prop["manger.name"];
+        rtcd_cmd += " -o manager.instance_name:" + mgrstr;
+
+        RTC_DEBUG(("Invoking command: %s.", rtcd_cmd.c_str()));
+        int ret(coil::launch_shell(rtcd_cmd.c_str()));
+        if (ret == -1)
+          {
+            RTC_DEBUG(("%s: failed", rtcd_cmd.c_str()));
+            return RTC::RTObject::_nil();
+          }
+        coil::sleep(0.01);
+        for (size_t i(0); i < 1000; ++i)
+          {
+            RTC_DEBUG(("Detecting new slave manager (%s).", mgrstr.c_str()))
+            mgrobj = findManagerByName(mgrstr);
+            if (!CORBA::is_nil(mgrobj))
+              {
+                RTC_INFO(("New slave manager (%s) launched.", mgrstr.c_str()));
+                break;
+              }
+            RTC_DEBUG(("Waiting for slave manager started."));
+            coil::sleep(0.01);
+          }
+
+        if (CORBA::is_nil(mgrobj))
+          {
+            RTC_ERROR(("Launch failed: manager (%s)", mgrstr.c_str()));
+            return RTC::RTObject::_nil();
+          }
+        RTC_DEBUG(("Creating component on %s",  mgrstr.c_str()));
+        RTC_DEBUG(("arg: %s", create_arg.c_str()));
+        try
+          {
+            return mgrobj->create_component(create_arg.c_str());
+          }
+        catch (CORBA::SystemException& e)
+          {
+            RTC_ERROR(("Exception was caught while creating component."));
+            return RTC::RTObject::_nil();
+          }
+        catch (...)
+          {
+            RTC_ERROR(("Unknown non-CORBA exception cought."));
+            return RTC::RTObject::_nil();
+          }
+      }
+    return RTC::RTObject::_nil();
+  }
+  
+  /*
+   * @if jp
+   * @brief 指定アドレスのマネージャでRTCを起動する
+   * @else
+   * @brief Launch a RTC on the specified IP/Port address manager
+   * @endif
+   */
+  RTC::RTObject_ptr
+  ManagerServant::createComponentByAddress(const std::string create_arg)
+  {
+    RTC_TRACE(("createComponentByAddress(%s)",create_arg.c_str()));
+    coil::mapstring param = coil::urlparam2map(create_arg);
+    for (coil::mapstring::iterator it(param.begin()); it != param.end(); ++it)
+      {
+        RTC_DEBUG(("create_arg[%s] = %s",
+                   it->first.c_str(), it->second.c_str()));
+      }
+
+    std::string mgrstr = param["manager_name"];
+    if (mgrstr.empty())
+      {
+        RTC_WARN(("No manager_name found: %s", mgrstr.c_str()));
+        return RTC::RTObject::_nil();
+      }
+    
+    coil::vstring mgrvstr = coil::split(mgrstr, ":", true);
+    if (mgrvstr.size() != 2)
+      {
+        RTC_WARN(("Invalid manager name: %s", mgrstr.c_str()));
+        return RTC::RTObject::_nil();
+      }
+
+    // detect languange
+    std::string lang = param["language"];
+    if (lang.empty()) { lang = "C++"; }
+    RTC_INFO(("Specified manager's language: %s", lang));
+
+    // find manager
+    RTM::Manager_var mgrobj = findManager(mgrstr);
+
+    if (CORBA::is_nil(mgrobj))
+      {
+        RTC_INFO(("Manager: %s not found.", mgrstr.c_str()));
+        RTC_INFO(("Creating new manager named %s", mgrstr.c_str()));
+
+        std::string rtcd_cmd_key("manager.modules.");
+        rtcd_cmd_key += lang + "manager_cmd";
+        coil::Properties& prop = m_mgr.getConfig();
+        std::string rtcd_cmd = prop[rtcd_cmd_key];
+
+        if (rtcd_cmd.empty())
+          {
+            RTC_WARN(("rtcd command name not found. Default rtcd is used."));
+            rtcd_cmd = "rtcd";
+          }
+        rtcd_cmd += " -o corba.master_manager:" + mgrstr;
+        rtcd_cmd += " -d ";
+
+        RTC_DEBUG(("Invoking command: %s.", rtcd_cmd.c_str()));
+        int ret(coil::launch_shell(rtcd_cmd.c_str()));
+        if (ret == -1)
+          {
+            RTC_DEBUG(("%s: failed", rtcd_cmd.c_str()));
+            return RTC::RTObject::_nil();
+          }
+
+        coil::sleep(0.01);
+        for (size_t i(0); i < 1000; ++i)
+          {
+            RTC_DEBUG(("Detecting new slave manager (%s).", mgrstr.c_str()))
+            mgrobj = findManagerByName(mgrstr);
+            if (!CORBA::is_nil(mgrobj))
+              {
+                RTC_INFO(("New slave manager (%s) launched.", mgrstr.c_str()));
+                break;
+              }
+            RTC_DEBUG(("Waiting for slave manager started."));
+            coil::sleep(0.01);
+          }
+
+        if (CORBA::is_nil(mgrobj))
+          {
+            RTC_ERROR(("Launch failed: manager (%s)", mgrstr.c_str()));
+            return RTC::RTObject::_nil();
+          }
+
+        RTC_DEBUG(("Creating component on %s",  mgrstr.c_str()));
+        RTC_DEBUG(("arg: %s", create_arg.c_str()));
+        try
+          {
+            return mgrobj->create_component(create_arg.c_str());
+          }
+        catch (CORBA::SystemException& e)
+          {
+            RTC_ERROR(("Exception was caught while creating component."));
+            return RTC::RTObject::_nil();
+          }
+        catch (...)
+          {
+            RTC_ERROR(("Unknown non-CORBA exception cought."));
+            return RTC::RTObject::_nil();
+          }
+      }
+    return RTC::RTObject::_nil();
+  }
 };

Modified: trunk/OpenRTM-aist/src/lib/rtm/ManagerServant.h
===================================================================
--- trunk/OpenRTM-aist/src/lib/rtm/ManagerServant.h	2017-04-14 09:31:34 UTC (rev 2982)
+++ trunk/OpenRTM-aist/src/lib/rtm/ManagerServant.h	2017-04-16 08:37:48 UTC (rev 2983)
@@ -588,8 +588,108 @@
      * @return Manager reference
      * @endif
      */
-    RTM::Manager_ptr findManager(const char* host_port);
+    RTM::Manager_ptr findManager(const std::string& host_port);
 
+    /*!
+      * @if jp
+      * @brief 指定名のマネージャを取得
+      *
+      * マネージャがマスターの場合は登録されているスレーブマネージャか
+      * ら検索する。マネージャがスレーブの場合は登録されているマスター
+      * マネージャからスレーブマネージャを検索する
+      *
+      * @param manager_name マネージャ名
+      * @return マネージャの参照
+      *
+      * @else
+      * @brief Obtain Manager's reference by name
+      *
+      * If this is master manager, find it from the registered slave managers.
+      * If this is slave manager, request it to its master manager.
+      *
+      * @param manager_name Manager's name
+      * @return Manager's object reference 
+      * @endif
+      */
+    RTM::Manager_ptr findManagerByName(const std::string mgr_name);
+
+    /*!
+      * @if jp
+      * @brief マネージャのリストから指定名を持つマネージャを取得
+      *
+      * 引数に与えられたマネージャに対して、指定されたマネージャ名を持
+      * つマネージャの参照を返すとともに、もしなければ、再帰的にスレー
+      * ブマネージャを探索して、指定された名称を持つマネージャの参照を
+      * 返す。この関数はクラス内から呼ぶための内部関数である。引数に与
+      * えるマネージャリストは必要に応じてMutexで保護すること。
+      *
+      * @param manager_name マネージャ名
+      * @param mlist マネージャのリスト
+      * @return マネージャの参照
+      *
+      * @else
+      * @brief Obtain Manager's reference by name
+      *
+      * This function search a specified name manager from the given
+      * manager list. And if it is not found, this function also
+      * search from its slave managers recursively. This function is
+      * internal function. The given manager list must be guarded by
+      * mutex.
+      *
+      * @param manager_name Manager's name
+      * @param mlist Manager list
+      * @return Manager's object reference 
+      * @endif
+      */
+    RTM::Manager_ptr findManagerFromList(const std::string name,
+                                         RTM::ManagerList& mlist);
+
+    /*!
+     * @if jp
+     * @brief 指定のマネージャでRTCを起動する
+     *
+     * comp&manager_name=mgr のようにRTC名&manager_name=マネージャ名と
+     * 指定する
+     *
+     * @param module_name 起動するRTC、マネージャ名
+     * @return 生成されたRTCのオブジェクト参照
+     *
+     * @else
+     *
+     * @brief Launch RTC on specified manager
+     *
+     * Manager is specified with "manager_name" key such as
+     * "comp&manager_name=mgr" in the RTC launch parameter.
+     *
+     * @param module_name Given parameter to create RTC
+     * @return created RTObject object reference
+     *
+     * @endif
+     */
+    RTC::RTObject_ptr
+    createComponentByManagerName(const std::string module_name);
+
+    /*
+     * @if jp
+     * @brief 指定アドレスのマネージャでRTCを起動する
+     *
+     * comp&manager_address=localhost:2810 のようにRTC名
+     * &manager_address=マネージャのホスト名、ポート番号を指定する
+     *
+     * @param module_name 起動するRTC、マネージャのホストアドレス
+     * @return 生成されたRTCのオブジェクト参照
+     *
+     * @else
+     * @brief Launch a RTC on the specified IP/Port address manager
+     *
+     * @param module_name Given parameter to create RTC
+     * @return created RTObject object reference
+     *
+     * @endif
+     */
+    RTC::RTObject_ptr
+    createComponentByAddress(const std::string module_name);
+
   private:
     typedef coil::Guard<coil::Mutex> Guard;
     /*!



openrtm-commit メーリングリストの案内