00001 // -*- C++ -*- 00020 #ifndef DataInPort_h 00021 #define DataInPort_h 00022 00023 #include <rtm/PortBase.h> 00024 #include <rtm/BufferBase.h> 00025 #include <rtm/InPortCorbaProvider.h> 00026 #include <rtm/OutPortCorbaConsumer.h> 00027 #include <rtm/NVUtil.h> 00028 #include <rtm/InPort.h> 00029 00030 #ifdef RTC_SOCK_DATAPORT 00031 #include <rtm/InPortTcpSockProvider.h> 00032 #endif 00033 00048 namespace RTC 00049 { 00069 class DataInPort 00070 : public virtual PortBase 00071 { 00072 public: 00097 template <class DataType, template <class DataType> class Buffer> 00098 DataInPort(const char* name, InPort<DataType, Buffer>& inport, 00099 Properties& prop) 00100 : PortBase(name) 00101 { 00102 // PortProfile::properties を設定 00103 addProperty("port.port_type", "DataInPort"); 00104 00105 // CORBA InPort Provider 00106 m_providers.push_back(new InPortCorbaProvider<DataType>(inport)); 00107 m_providers.back()->publishInterfaceProfile(m_profile.properties); 00108 00109 // TCP Socket InPort Provider 00110 #ifdef RTC_SOCK_DATAPORT 00111 m_providers.push_back(new InPortTcpSockProvider<DataType>(inport, prop)); 00112 m_providers.back()->publishInterfaceProfile(m_profile.properties); 00113 #endif 00114 00115 // CORBA OutPort Consumer 00116 m_consumers.push_back(new OutPortCorbaConsumer<DataType>(inport)); 00117 00118 // dummy var 00119 m_dummy.push_back(1); 00120 } 00121 00135 virtual ~DataInPort(); 00136 00137 protected: 00163 virtual ReturnCode_t 00164 publishInterfaces(ConnectorProfile& connector_profile); 00165 00193 virtual ReturnCode_t 00194 subscribeInterfaces(const ConnectorProfile& connector_profile); 00195 00217 virtual void 00218 unsubscribeInterfaces(const ConnectorProfile& connector_profile); 00219 00233 struct publish; 00234 00248 struct subscribe; 00249 00263 struct unsubscribe; 00264 00265 private: 00266 /* 00267 * Bug 00268 * 00269 * Fedora5/gcc4.1.1. にて DataInPort の先頭領域のメモリ破壊が 00270 * 起こっている模様。 00271 * (gdbでかなり粘って追ってみたが断念) 00272 * もともともは std::vector<InPortProvider*> m_providers が先頭 00273 * このままだと、 00274 * $vec->_M_impl._M_start: begin() に相当? 00275 * $vec->_M_impl._M_finish: end() に相当? 00276 * においてい _M_start が不可解な位置を指すため、 00277 * m_providers に対して for_each を適用するとSegvで落ちる。 00278 * 00279 * FreeBSD6.0/gcc3.4.4ではこの現象は発生せず。 00280 */ 00281 std::vector<int> m_dummy; 00282 std::vector<InPortProvider*> m_providers; 00283 std::vector<OutPortConsumer*> m_consumers; 00284 }; 00285 }; // namespace RTC 00286 00287 #endif // DataInPort_h