[openrtm-users 00567] Re: [openrtm-users 00560] RTコンポーネントの動的リンクについて

takashi suehiro t.suehiro @ aist.go.jp
2008年 8月 1日 (金) 00:27:41 JST


産総研 末廣です。
大事なことを1つ忘れていました。

コンポーネントのポート情報を取得するために、そのポート1つだけを指定した
コネクタを作ってダミーで接続を行っているのですが、
その後、それをdisconnectするとエラーが発生してそのコンポーネントが死にます。
これに関して、栗原さんに相談をして以下のような回答をもらっています。
私は、OpenRTM-0.4.2にその修正を加えた環境でやっています。
今後の新しいバージョンでは直ってくると思いますが、
今は手作業で修正する必要があります。

> 栗原です。
>
>  DataOutPortに対するdisconnect()での問題についてデバッグ致しましたので
>  報告させて頂きます。
>  OpenRTMのバージョンは、OpenRTM-aist-0.4.2にです。
>
>  <問題点>
>
>   まず、セグメントエラーになっている箇所ですが、PublisherFactory.cppの
>   destroy()メソッドのpublisher->release();のところでした。
>
>   おそらく、ダミーコネクターでは対になるポートが無いためconnect()時に
>   Publisher(New,Flush,Periodicのいずれか)が生成されずNULLになっている
>   と考えられます。
>   # ConnectorProfileのpropertiesにPublisherのタイプを指定しても
>   # subscribeInterfaces()にて、DataOutPortに対するConsumerが無い場合、
>   # Publisherは生成されないようになっています。
>
>   この状態で、disconnect()が呼ばれるとunsubscribeInterfaces()内で
>   Publisherのdestory()を行っておりますので、NULLオブジェクトに対し
>   release()を呼び、そこでセグメントエラーとなります。
>
>   DataInPortに対してdisconnect()を呼んでもエラーにならないのは、
>   DataOutPortにだけしかPublisherは生成されないため、DataInPortの
>   unsubscribeInterfaces()では、PublisherFactory::destroy()が呼ばれ
>   ないためです。
>
>   それと、Python版ではエラーとならない点は、Python版ではdestroy()メソッ
>   ドにて、publisherがNoneかどうかを判定し、Noneではない場合にrelease()
>   を行うように実装されているためです。
>
>  <回避策>
>   回避策の一つとしまして、PublisherFactory::destroy()にて、引数で渡さ
>   れるpublisherがNULLかどうかを判定し、NULLではない場合にrelease()と
>   deleteを行うようにするのが考えられます。
>   一応、こちらでは、destroy()にてpublisherのチェックを行い、NULLの場合
>   はreturnするようにしましたところ、セグメントエラーはでなくなりました。
>

-- 
from suehiro.t @ gmail
返信は、t.suehiro @ aist.go.jpにお願いします。




openrtm-users メーリングリストの案内