[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 メーリングリストの案内