DataInPort.h

説明を見る。
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

OpenRTMに対してWed May 21 05:17:25 2008に生成されました。  doxygen 1.5.3