[openrtm-users 02748] Re: バッファまわりの改善要望

Masayuki Shimizu masayuki.shimizu @ aist.go.jp
2013年 1月 8日 (火) 14:47:24 JST


安藤様

清水です。
ご返答ありがとうございます。

init()の引数をconstにした場合、プロバイダがバッファ作成者に
バッファの情報を伝えるにはどうするのでしょうか?
# 「バッファ作成者」はシングルバッファモードかマルチバッファモードかで
# 違うものになっていたと思います。
# 現行の1.1.0では、シングルバッファモードだとバッファタイプは固定なので、
# マルチバッファモードにして使用しています。

今の1.1.0の実装では、publishInterface()でのbuffer_typeの指定は、
バッファ作成者に渡らなかったはずです。
バッファが作成された後にpublishInterface()が呼ばれていると思います。

仕方ないので、私はinit()内でbuffer_typeを指定するようにしました。
実際の実装は以下です。

void InPortArtShmProvider::init(coil::Properties& prop)
{
    (void)prop.setProperty(std::string("dataport.inport.buffer_type"), 
                           std::string("artshm_buffer"));
}

Providerのinit()後にバッファを作成すれば、buffer_typeの情報が
バッファ作成者に渡るので、自作バッファを使用することができます。

以上、ご検討の程よろしくお願いいたします。

清水
--- On Mon, 2013/1/7, Ando Noriaki <n-ando @ aist.go.jp> wrote:

> 清水先生
> 
> 安藤です
> 
> ご提案ありがとうございます。
> おっしゃるような初期化順序でも問題なさそうですね。
> 精査して実装に取り込みたいと思います。
> 
> また、init() の引数がconstでない理由はInPortProviderに関する情報を
> 相手に伝えるためかな、と思ったのですが、以下のドキュメントを読む限り
> 別途Providerの情報を伝える手段があるのでconstでもいいような気がします。
> http://svn.openrtm.org/OpenRTM-aist/tags/RELEASE_1_1_0/OpenRTM-aist/src/lib/rtm/InPortProvider.h
> 
> これについても調べて修正します。とりあえずチケット発行しました。
> ありがとうございました。
> 
> 
> 2013年1月4日 17:43 Masayuki Shimizu <masayuki.shimizu @ aist.go.jp>:
> > OpenRTM-aist開発チームの皆さま
> >
> > 静岡大の清水です。
> >
> > バッファやコネクタまわりに関しての改善・検討要望です。
> > 過日のSI2012で発表した、共有メモリベースの
> > データ通信機能を実装する際に問題となった点です。
> > ご検討頂ければ幸いです。
> >
> > 【問題点】
> > 現行のコネクタの実装(InPortPushConnectorを例とします)では、
> > 以下の手順で初期化(コンストラクタ内で)がされています。
> >
> > (1) バッファ生成
> > (2) プロバイダの初期化(InPortProvider::init()のコール)
> >
> > 一般に、プロバイダ(コンシューマも)は特定のバッファとの組み合わせでしか
> > 動作しない場合も考えられると思います。
> > すなわち、プロバイダがどのバッファを生成するかを制御できる必要があります。
> >
> > どのバッファを生成するかは、ConnectorProfileにbuffer_typeを設定することで
> > 制御できますが、もしユーザが間違ったbuffer_typeを指定した場合、
> > あるいは何も指定しなかった場合は、プロバイダに適合したバッファが生成されません。
> >
> > 【対応策】
> > この問題は、バッファの生成とプロバイダの初期化の順序を入れ替えることで
> > 回避できます。私が実際に変更したコードは以下です。
> >
> > ・オリジナル(一部のみ抜粋)
> > InPortPushConnector(ConnectorInfo info, InPortProvider *provider)
> > {
> >   m_buffer = createBuffer(info);
> >   m_buffer->init(info.properties.getNode("buffer"));
> >   m_provider->init(info.properties);
> >   m_provider->setBuffer(m_buffer);
> >   m_provider->setListener(info, &m_listeners);
> > }
> >
> > ・変更後
> > InPortPushConnector(ConnectorInfo info, InPortProvider *provider)
> > {
> >   m_provider->init(info.properties); //<= バッファ生成前にプロバイダのinit()をする
> >   m_buffer = createBuffer(info);
> >   m_buffer->init(info.properties.getNode("buffer"));
> >   m_provider->setBuffer(m_buffer);
> >   m_provider->setListener(info, &m_listeners);
> > }
> >
> > 以上のように変更し、自作プロバイダのinit()内でbuffer_typeプロパティを
> > 追加(または上書き)すれば、プロバイダがバッファの種類を完全に制御できます。
> >
> > ところで、プロバイダのinit()の引数がconst指定になっていないのは、
> > プロバイダがConnectorProfileの情報(コピー)を書き変えても良いということだと、
> > 私は判断しましたが、それで問題ないですよね。
> > もし書き換えを許可しないなら、const指定とする必要があります。
> >
> > 以上、よろしくご検討をお願いいたします。
> >
> > 清水
> > --------------------
> > Masayuki Shimizu
> > Assistant Professor
> > Dept. of Mechanical Engineering, Shizuoka Univ.
> > 3-5-1, Johoku, Naka-ku, Hamamatsu 432-8561, JAPAN
> > TEL/FAX: +81-53-478-1061
> > Email: tmsimiz @ ipc.shizuoka.ac.jp
> > _______________________________________________
> > openrtm-users mailing list
> > openrtm-users @ openrtm.org
> > http://www.openrtm.org/mailman/listinfo/openrtm-users
> 


More information about the openrtm-users mailing list