操作
機能 #4428
完了n-miyamoto さんがほぼ7年前に更新
- 追加した関数
以下の関数を追加した。
- InPortBase
- getLocalOutPort
- ローカルのピアOutPortを取得
- getLocalOutPort
- InPortConnector
- setOutPort
- データをダイレクトに書き込むためのOutPortのサーバントを設定する
- setOutPort
- OutPort
- read
- データをダイレクトに読み込む
- read
- OutPortBase
- getListeners
- リスナホルダを取得する
- getListeners
- OutPortConnector
- setDirectMode
- ダイレクト接続モードに設定
- directMode
- ダイレクト接続モードかの判定
- setDirectMode
- データ転送時の処理
データ書き込み時のシーケンス図は以下のようになっている。
まずOutPortConnectorのdirectMode関数を呼び出してPull型ダイレクト接続かを確認する。
ダイレクト接続に場合は変数m_directValueにデータを格納し、m_directNewDataをtrueにする。
この部分についてはミューテックスにより排他処理をする。
データ読み込み時のシーケンス図は以下のようになっている。
まずgetDirectData関数を呼び出す。getDirectData関数は、Pull型Direct接続ではない場合は即座にfalseを返す。
Pull型Direct接続の場合はOutPortのread関数を呼び出す。
read関数内では変数m_directValueを変数に格納し、m_directNewDataをfalseにしている。
read関数内はミューテックスにより排他処理をする。
- コネクタ接続時について
コネクタ接続時にOutPortConnectorのsetDirectMode関数を呼び出すことにより、Pull型direct接続であることを設定する必要がある。
OutPortConnector*
OutPortBase::createConnector(const ConnectorProfile& cprof,
coil::Properties& prop,
OutPortProvider* provider)
{
(省略)
if (coil::normalize(prop["interface_type"]) == "direct")
{
connector->setDirectMode();
}
またInPortConnctorにOutPortのサーバントを設定する。
ConnectorInfo profile(cprof.name,
cprof.connector_id,
CORBA_SeqUtil::refToVstring(cprof.ports),
prop);
(省略)
if (coil::normalize(prop["interface_type"]) == "direct")
{
OutPortBase* outport = getLocalOutPort(profile);
if (outport == NULL)
{
RTC_DEBUG(("interface_type is direct, "
"but a peer InPort servant could not be obtained."));
delete connector;
return 0;
}
connector->setOutPort(outport);
}
操作