OpenRTM-aist  1.2.1
Manager.h
[詳解]
1 
20 #ifndef RTC_MANAGER_H
21 #define RTC_MANAGER_H
22 
23 #include <rtm/RTC.h>
24 
25 #include <iostream>
26 #include <string>
27 #include <vector>
28 
29 #include <coil/Mutex.h>
30 #include <coil/Guard.h>
31 #include <coil/Task.h>
32 
33 #include <rtm/Factory.h>
34 #include <rtm/ECFactory.h>
35 #include <rtm/ObjectManager.h>
36 #include <rtm/SystemLogger.h>
38 
39 namespace RTM
40 {
41  class ManagerServant;
42 }
43 
44 namespace coil
45 {
46  class Timer;
47 };
48 
49 namespace RTC
50 {
51 // class Properties;
52  class CorbaNaming;
53  class ModuleManager;
54  class NamingManager;
55  class Manager;
57  typedef RTObject_impl RtcBase;
58 
59  typedef void (*ModuleInitProc)(Manager* manager);
60 
81  class Manager
82  {
83  typedef coil::Mutex Mutex;
84  typedef coil::Guard<Mutex> Guard;
85  protected:
99  Manager();
100 
118  Manager(const Manager& manager);
119  // Manager& operator=(const Manager& manager){return manager;};
120 
121  public:
174  static Manager* init(int argc, char** argv);
175 
198  static Manager& instance();
199 
200  //============================================================
201  // Manager
202  //============================================================
203 
217  void terminate();
218 
234  void shutdown();
235 
249  void join();
250 
268  LogStreamBuf& getLogStreamBuf() {return m_logStreamBuf;}
269 
287  std::string& getLogLevel() {return m_config["logger.log_level"];}
288 
306  coil::Properties& getConfig() { return m_config;}
307 
332  void setModuleInitProc(ModuleInitProc proc);
333 
366  bool activateManager();
367 
398  void runManager(bool no_block = false);
399 
400  //============================================================
401  // Module management
402  //============================================================
435  ReturnCode_t load(const std::string& fname, const std::string& initfunc);
436 
456  void unload(const char* fname);
457 
473  void unloadAll();
474 
492  std::vector<coil::Properties> getLoadedModules();
493 
513  std::vector<coil::Properties> getLoadableModules();
514 
515  //============================================================
516  // Component Factory Management
517  //============================================================
544  bool registerFactory(coil::Properties& profile,
545  RtcNewFunc new_func,
546  RtcDeleteFunc delete_func);
547 
565  std::vector<coil::Properties> getFactoryProfiles();
566 
593  bool registerECFactory(const char* name,
594  ECNewFunc new_func,
595  ECDeleteFunc delete_func);
596 
614  std::vector<std::string> getModulesFactories();
615 
616  //============================================================
617  // Component management
618  //============================================================
677  RTObject_impl* createComponent(const char* comp_args);
691  ExecutionContextBase* createContext(const char* ec_args);
692 
711  void cleanupComponent(RTObject_impl* comp);
712 
726  void cleanupComponents();
727 
746  void notifyFinalized(RTObject_impl* comp);
747 
771  bool registerComponent(RTObject_impl* comp);
772 
794  bool unregisterComponent(RTObject_impl* comp);
795 
796 
818  void deleteComponent(RTObject_impl* comp);
819 
842  void deleteComponent(const char* instance_name);
843 
844 
868  RTObject_impl* getComponent(const char* instance_name);
869 
887  std::vector<RTObject_impl*> getComponents();
888 
889 
890  void
891  addManagerActionListener(RTM::ManagerActionListener* listener,
892  bool autoclean = true);
893  void
894  removeManagerActionListener(RTM::ManagerActionListener* listener);
895 
896  void
897  addModuleActionListener(RTM::ModuleActionListener* listener,
898  bool autoclean = true);
899  void
900  removeModuleActionListener(RTM::ModuleActionListener* listener);
901 
902  void
903  addRtcLifecycleActionListener(RTM::RtcLifecycleActionListener* listener,
904  bool autoclean = true);
905  void
906  removeRtcLifecycleActionListener(RTM::RtcLifecycleActionListener* listener);
907 
908  void
909  addNamingActionListener(RTM::NamingActionListener* listener,
910  bool autoclean = true);
911  void
912  removeNamingActionListener(RTM::NamingActionListener* listener);
913 
914  void
915  addLocalServiceActionListener(RTM::LocalServiceActionListener* listener,
916  bool autoclean = true);
917  void
918  removeLocalServiceActionListener(RTM::LocalServiceActionListener* listener);
919 
920 
921  //============================================================
922  // CORBA 関連
923  //============================================================
950  CORBA::ORB_ptr theORB();
951 
988  CORBA::ORB_ptr getORB();
989 
1017  PortableServer::POA_ptr thePOA();
1018 #ifdef ORB_IS_OMNIORB
1019  PortableServer::POA_ptr theShortCutPOA();
1020 #endif
1021 
1057  PortableServer::POA_ptr getPOA();
1058 #ifdef ORB_IS_OMNIORB
1059  PortableServer::POA_ptr getShortCutPOA();
1060 #endif
1061 
1089  PortableServer::POAManager_ptr thePOAManager();
1129  PortableServer::POAManager_ptr getPOAManager();
1144  RTM::ManagerServant& getManagerServant();
1145 
1159  bool initLocalService();
1174  NamingManager* getNaming();
1175 
1176 
1177  //============================================================
1178  // Protected functions
1179  //============================================================
1180  protected:
1181 
1182  //============================================================
1183  // Manager initialize and finalization
1184  //============================================================
1212  void initManager(int argc, char** argv);
1213 
1229  void shutdownManager();
1230 
1247  void shutdownOnNoRtcs();
1248 
1249  //============================================================
1250  // Logger initialize and terminator
1251  //============================================================
1252  void initLogstreamFile();
1253  void initLogstreamPlugins();
1254  void initLogstreamOthers();
1276  bool initLogger();
1277 
1295  void shutdownLogger();
1296 
1297  //============================================================
1298  // ORB initialization and finalization
1299  //============================================================
1317  bool initORB();
1318 
1338  std::string createORBOptions();
1339 
1357  void createORBEndpoints(coil::vstring& endpoints);
1358 
1372  void createORBEndpointOption(std::string& opt, coil::vstring& endpoint);
1373 
1392  void shutdownORB();
1393 
1394  //============================================================
1395  // NamingService initialization and finalization
1396  //============================================================
1428  bool initNaming();
1429 
1445  void shutdownNaming();
1446 
1457  NamingManager& getNamingManager();
1458 
1459  //============================================================
1460  // Component management
1461  //============================================================
1477  void shutdownComponents();
1478 
1479 
1527  bool procComponentArgs(const char* comp_arg,
1528  coil::Properties& comp_id,
1529  coil::Properties& comp_conf);
1570  bool procContextArgs(const char* ec_args,
1571  std::string& ec_id,
1572  coil::Properties& ec_conf);
1573 
1596  void configureComponent(RTObject_impl* comp, const coil::Properties& prop);
1597 
1619  bool initExecContext();
1620 
1636  bool initComposite();
1637 
1659  bool initFactories();
1660 
1661  void initCpuAffinity();
1662 
1677  void initPreConnection();
1692  void initPreActivation();
1707  void initPreCreation();
1720  void invokeInitProc();
1735  void publishPorts(RTObject_impl* comp);
1750  void subscribePorts(RTObject_impl* comp);
1765  PortServiceList_var getPortsOnNameServers(std::string nsname, std::string kind);
1781  void connectDataPorts(PortService_ptr port, PortServiceList_var& target_ports);
1797  void connectServicePorts(PortService_ptr port, PortServiceList_var& target_ports);
1798 
1818  bool initTimer();
1819 
1833  bool initManagerServant();
1834 
1843 
1869  bool mergeProperty(coil::Properties& prop, const char* file_name);
1870 
1919  std::string formatString(const char* naming_format,
1920  coil::Properties& prop);
1921 
1922 
1930  void setEndpointProperty(CORBA::Object_ptr objref);
1931 
1939  void endpointPropertySwitch(const std::string& ipver,
1940  bool& ip, std::vector<int>& ip_list);
1941 
1942 
1943  //============================================================
1944  // protected 変数
1945  //============================================================
1946 
1947  //------------------------------------------------------------
1948  // static var
1949  //------------------------------------------------------------
1957  static Manager* manager;
1958 
1966  static Mutex mutex;
1967 
1968  //------------------------------------------------------------
1969  // CORBA var
1970  //------------------------------------------------------------
1978  CORBA::ORB_var m_pORB;
1979 
1987  PortableServer::POA_var m_pPOA;
1988 #ifdef ORB_IS_OMNIORB
1989  PortableServer::POA_var m_pShortCutPOA;
1990 #endif
1991 
1999  PortableServer::POAManager_var m_pPOAManager;
2000 
2001  //------------------------------------------------------------
2002  // Manager's variable
2003  //------------------------------------------------------------
2012 
2021 
2030 
2039 
2048 
2049  //------------------------------------------------------------
2050  // Logger
2051  //------------------------------------------------------------
2060 
2069 
2077  std::vector<std::filebuf*> m_logfiles;
2078 
2079  //============================================================
2080  // コンポーネントマネージャ
2081  //============================================================
2082  // ObjectManager へ渡す述語クラス
2084  {
2085  InstanceName(RTObject_impl* comp);
2086  InstanceName(const char* name);
2087  InstanceName(const std::string name);
2088  bool operator()(RTObject_impl* comp);
2089  std::string m_name;
2090  };
2091 
2093 
2101  ComponentManager m_compManager;
2102 
2103  //============================================================
2104  // コンポーネントファクトリ
2105  //============================================================
2106  // コンポーネントファクトリへ渡す述語クラス
2108  {
2109  public:
2110  FactoryPredicate(const char* imple_id)
2111  : m_vendor(""), m_category(""), m_impleid(imple_id), m_version("")
2112  {
2113  }
2115  : m_vendor(prop["vendor"]),
2116  m_category(prop["category"]),
2117  m_impleid(prop["implementation_id"]),
2118  m_version(prop["version"])
2119  {
2120  }
2122  : m_vendor(factory->profile()["vendor"]),
2123  m_category(factory->profile()["category"]),
2124  m_impleid(factory->profile()["implementation_id"]),
2125  m_version(factory->profile()["version"])
2126  {
2127  }
2128  bool operator()(FactoryBase* factory)
2129  {
2130  // implementation_id must not be empty
2131  if (m_impleid.empty()) return false;
2132 
2133  const coil::Properties& prop(factory->profile());
2134 
2135  if (m_impleid != prop["implementation_id"])
2136  return false;
2137  if (!m_vendor.empty() && m_vendor != prop["vendor"])
2138  return false;
2139  if (!m_category.empty() && m_category != prop["category"])
2140  return false;
2141  if (!m_version.empty() && m_version != prop["version"])
2142  return false;
2143 
2144  return true;
2145  }
2146  private:
2147  std::string m_vendor;
2148  std::string m_category;
2149  std::string m_impleid;
2150  std::string m_version;
2151  };
2152 
2154  {
2155  coil::Properties& m_prop;
2156  public:
2158  : m_prop(prop)
2159  {
2160  }
2162  {
2163  if (m_prop["implementation_id"] != prop["implementation_id"])
2164  {
2165  return false;
2166  }
2167  if (!m_prop["vendor"].empty() &&
2168  m_prop["vendor"] != prop["vendor"]) { return false; }
2169  if (!m_prop["category"].empty() &&
2170  m_prop["category"] != prop["category"]) { return false; }
2171  if (!m_prop["version"].empty() &&
2172  m_prop["version"] != prop["version"]) { return false; }
2173  return true;
2174  }
2175  };
2176 
2186 
2194  FactoryManager m_factory;
2195 
2196  //============================================================
2197  // ExecutionContextファクトリ
2198  //============================================================
2199  // ECファクトリへ渡す述語クラス
2201  {
2202  ECFactoryPredicate(const char* name) : m_name(name){};
2204  : m_name(factory->name()) {};
2205  bool operator()(ECFactoryBase* factory)
2206  {
2207  return m_name == factory->name();
2208  }
2209  std::string m_name;
2210  };
2211  typedef ObjectManager<const char*,
2212  ECFactoryBase,
2214 
2222  ECFactoryManager m_ecfactory;
2223 
2231  std::vector<ExecutionContextBase*> m_ecs;
2232 
2233  // ファクトリ名をリストアップするためのファンクタ
2235  {
2236  void operator()(FactoryBase* f)
2237  {
2238  modlist.push_back(f->profile().getProperty("implementation_id"));
2239  }
2240  std::vector<std::string> modlist;
2241  };
2242 
2243  //------------------------------------------------------------
2244  // ORB runner
2245  //------------------------------------------------------------
2266  : public coil::Task
2267  {
2268  public:
2282  OrbRunner(CORBA::ORB_ptr orb) : m_pORB(orb)
2283  {
2284  open(0);
2285  };
2286 
2308  virtual int open(void *args)
2309  {
2310  activate();
2311  return 0;
2312  }
2313 
2331  virtual int svc(void)
2332  {
2333  m_pORB->run();
2334 // Manager::instance().shutdown();
2335  return 0;
2336  }
2337 
2359  virtual int close(unsigned long flags)
2360  {
2361  return 0;
2362  }
2363  private:
2364  CORBA::ORB_ptr m_pORB;
2365  };
2374 
2375  //------------------------------------------------------------
2376  // Manager Terminator
2377  //------------------------------------------------------------
2398  : public coil::Task
2399  {
2400  public:
2418  Terminator(Manager* manager, double waittime = 0)
2419  : m_manager(manager), m_waittime(waittime) {};
2420 
2434  void terminate()
2435  {
2436  open(0);
2437  }
2438 
2460  virtual int open(void *args)
2461  {
2462  activate();
2463  return 0;
2464  }
2465 
2483  virtual int svc(void)
2484  {
2485  coil::sleep(m_waittime);
2486  Manager::instance().shutdown();
2487  return 0;
2488  }
2491  };
2492 
2501 
2502  struct Term
2503  {
2504  int waiting;
2505  Mutex mutex;
2506  };
2521 
2522  struct Finalized
2523  {
2524  Mutex mutex;
2525  std::vector<RTObject_impl*> comps;
2526  };
2528 
2530  }; // class Manager
2531 }; // namespace RTC
2532 
2533 #endif // RTC_MANAGER_H
RTObject_impl *(* RtcNewFunc)(Manager *manager)
Definition: Factory.h:33
static Mutex mutex
唯一の Manager へのポインタに対する mutex
Definition: Manager.h:1966
LogStreamBuf & getLogStreamBuf()
ログバッファの取得
Definition: Manager.h:268
void(* ModuleInitProc)(Manager *manager)
Definition: Manager.h:59
Logger rtclog
ロガーストリーム
Definition: Manager.h:2068
std::vector< std::string > modlist
Definition: Manager.h:2240
RTコンポーネント
virtual coil::Properties & profile()
コンポーネントプロファイルの取得
virtual int open(void *args)
ORB 活性化処理
Definition: Manager.h:2308
Term m_terminate
マネージャ終了処理用同期フラグ
Definition: Manager.h:2520
Definition: Manager.h:2200
unsigned int sleep(unsigned int seconds)
指定された秒間は処理を休止する
Definition: Time.h:54
log_streambuf テンプレートクラス
Definition: Logger.h:54
Manager * m_manager
Definition: Manager.h:2489
FactoryManager m_factory
ComponentManager.
Definition: Manager.h:2194
Mutex クラス
Definition: Mutex.h:40
RT component logger class.
void terminate()
終了処理
Definition: Manager.h:2434
Definition: Manager.h:2234
RTM::ManagerServant * m_mgrservant
ManagerServant へのポインタ
Definition: Manager.h:1842
RTC::ReturnCode_t activate(RTC::RTObject_ptr rtc, RTC::UniqueId ec_id=0)
RTCを指定した実行コンテキストでアクティベーションする
ManagerのCORBA化クラス
Definition: ManagerServant.h:63
FactoryPredicate(const char *imple_id)
Definition: Manager.h:2110
coil::TimeValue m_waittime
Definition: Manager.h:2490
ExecutionContext用基底クラス
Definition: ExecutionContextBase.h:369
std::string & getLogLevel()
コンフィグレーションのログレベルの取得
Definition: Manager.h:287
ModuleActionListener クラス
Definition: ManagerActionListener.h:191
RTコンポーネントクラス
Definition: RTObject.h:89
Definition: Manager.h:2083
Manager クラス
Definition: Manager.h:81
int waiting
Definition: Manager.h:2504
ECFactoryPredicate(const char *name)
Definition: Manager.h:2202
coil::Timer * m_timer
Timer Object.
Definition: Manager.h:2047
coil::Guard< coil::Mutex > Guard
Definition: LocalServiceAdmin.h:36
const std::string & getProperty(const std::string &key) const
指定されたキーを持つプロパティを、プロパティリストから探す
NamingManager * m_namingManager
NamingManager へのポインタ
Definition: Manager.h:2038
std::string m_name
Definition: Manager.h:2089
RtcLifecycleActionListener クラス
Definition: ManagerActionListener.h:353
TimeValue クラス
Definition: TimeValue.h:40
LocalServiceActionListener クラス
Definition: ManagerActionListener.h:714
ManagerActionListeners クラス
Definition: ManagerActionListener.h:965
OrbRunner(CORBA::ORB_ptr orb)
コンストラクタ
Definition: Manager.h:2282
virtual int svc(void)
ORB 開始処理
Definition: Manager.h:2331
std::vector< std::string > vstring
Definition: stringutil.h:45
coil::Properties & getConfig()
マネージャコンフィギュレーションの取得
Definition: Manager.h:306
static Manager * manager
唯一の Manager へのポインタ
Definition: Manager.h:1957
ECFactoryBase 抽象クラス
Definition: ECFactory.h:115
std::vector< std::filebuf * > m_logfiles
ログ出力ファイル
Definition: Manager.h:2077
Definition: Manager.h:2502
coil::Properties Properties
Definition: RTC.h:83
std::vector< ExecutionContextBase * > m_ecs
ExecutionContext リスト
Definition: Manager.h:2231
std::string m_name
Definition: Manager.h:2209
Definition: Manager.h:2522
LogStreamBuf m_logStreamBuf
ロガーバッファ
Definition: Manager.h:2059
Finalized m_finalized
Definition: Manager.h:2527
ObjectManager< const coil::Properties, FactoryBase, FactoryPredicate > FactoryManager
コンポーネントファクトリ
Definition: Manager.h:2185
Guard template class.
OrbRunner クラス
Definition: Manager.h:2265
coil::Properties m_config
Manager の configuration を格納する Properties.
Definition: Manager.h:2020
CORBA::ORB_var m_pORB
ORB へのポインタ
Definition: Manager.h:1978
ObjectManager< const char *, ECFactoryBase, ECFactoryPredicate > ECFactoryManager
Definition: Manager.h:2213
Logger クラス
Definition: SystemLogger.h:99
FactoryPredicate(const coil::Properties &prop)
Definition: Manager.h:2114
LocalServiceBase *(* ECNewFunc)()
Definition: LocalServiceAdmin.h:34
Terminator(Manager *manager, double waittime=0)
コンストラクタ
Definition: Manager.h:2418
モジュールマネージャクラス
Definition: ModuleManager.h:74
ECFactoryPredicate(ECFactoryBase *factory)
Definition: Manager.h:2203
ModuleManager * m_module
ModuleManager へのポインタ
Definition: Manager.h:2029
virtual int close(unsigned long flags)
ORB 終了処理
Definition: Manager.h:2359
virtual int open(void *args)
終了処理活性化処理
Definition: Manager.h:2460
Definition: Manager.h:2153
Terminator * m_terminator
ORB 終了用ヘルパークラスへのポインタ
Definition: Manager.h:2500
Timerクラス
Definition: Timer.h:53
プロパティセットを表現するクラス
Definition: Properties.h:101
ExecutionContext Factory class.
Object management class.
std::vector< RTObject_impl * > comps
Definition: Manager.h:2525
FactoryBase 基底クラス
Definition: Factory.h:118
Task クラス
Definition: Task.h:39
component action listener class
FactoryPredicate(FactoryBase *factory)
Definition: Manager.h:2121
ObjectManager< std::string, RTObject_impl, InstanceName > ComponentManager
Definition: Manager.h:2092
void(* RtcDeleteFunc)(RTObject_impl *rtc)
Definition: Factory.h:34
ComponentManager m_compManager
コンポーネントマネージャ
Definition: Manager.h:2101
RTComponent header.
Mutex mutex
Definition: Manager.h:2524
NamingActionListener クラス
Definition: ManagerActionListener.h:556
bool operator()(FactoryBase *factory)
Definition: Manager.h:2128
Mutex mutex
Definition: Manager.h:2505
void(* ECDeleteFunc)(LocalServiceBase *ls)
Definition: LocalServiceAdmin.h:35
bool operator()(coil::Properties &prop)
Definition: Manager.h:2161
PortableServer::POA_var m_pPOA
POA へのポインタ
Definition: Manager.h:1987
Guard テンプレートクラス
Definition: Guard.h:41
Definition: Manager.h:2107
virtual const char * name()=0
生成対象ExecutionContext名称取得用純粋仮想関数
::RTM::ManagerActionListeners m_listeners
Definition: Manager.h:2529
Definition: ManagerActionListener.h:60
ECFactoryManager m_ecfactory
ExecutionContext マネージャ
Definition: Manager.h:2222
NamingServer 管理クラス
Definition: NamingManager.h:627
OrbRunner * m_runner
ORB ヘルパークラスへのポインタ
Definition: Manager.h:2373
bool operator()(ECFactoryBase *factory)
Definition: Manager.h:2205
RT-Middleware.
Definition: ListenerHolder.h:28
ModulePredicate(coil::Properties &prop)
Definition: Manager.h:2157
PortableServer::POAManager_var m_pPOAManager
POAManager へのポインタ
Definition: Manager.h:1999
Terminator クラス
Definition: Manager.h:2397
ModuleInitProc m_initProc
ユーザ初期化関数へのポインタ
Definition: Manager.h:2011
void operator()(FactoryBase *f)
Definition: Manager.h:2236
virtual int svc(void)
ORB,マネージャ終了処理
Definition: Manager.h:2483
RTObject_impl RtcBase
Definition: Manager.h:56
Common Object Interface Layer.
Definition: Affinity.h:28