[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 メーリングリストの案内