操作
機能 #3393
未完了⑨ サービスポートのダイレクト接続機能
開始日:
2015/12/11
期日:
進捗率:
100%
予定工数:
説明
同一プロセス内のデータポート接続において、required i/fがprovided i/fを呼び出すのに、オブジェクトリファレンス経由ではなく、マーシャリングをバイパスしサーバントを直接呼ぶようにする機能を実装すること。
katami さんが7年以上前に更新
- ステータス を 新規 から 担当 に変更
- 担当者 を win-ei にセット
- 対象バージョン を RELEASE_1_2_0 にセット
メモ¶
CorbaConsumerクラスの_ptr()の実装で例外が発生。¶
- python版を参考(#3408)にさせていただき、 reference_to_servant関数でサーバントが取得できたときにサーバントを返すように実装しました。
public OBJECT_TYPE _ptr() { if(this.m_sev != null){ return this.m_sev; } if(this.m_var != null){ try{ ORB orb = ORBUtil.getOrb(); Object obj = orb.resolve_initial_references("RootPOA"); POA poa = POAHelper.narrow(obj); if (poa == null) { return this.m_var; } m_sev = (OBJECT_TYPE)(poa.reference_to_servant((Object)m_var)); if(m_sev != null){ return this.m_sev; } } catch(Exception ex){ return this.m_var; } } return this.m_var; }
- CorbaConsumerクラスの_ptr()関数でサーバントを返す際に、サーバントをスタブにキャストできず、例外が発生します。
例えばInPortCorbaCdrProvider(サーバント)をInPortCdr(スタブ)にキャストできない という旨の例外。
サーバント(スケルトン)とスタブが継承しているインターフェイスはInPortCdrOperations。
- 以下の対応を検討
- CorbaConsumer< OpenRTM.InPortCdr > は CorbaConsumer< OpenRTM.InPortCdrOperations > でも大丈夫か?
org.omg.CORBA.Object, org.omg.CORBA.portable.IDLEntityのメソッドを使用しているかどうかを調査する必要あり。
→インパクトが大きい。OpenRTMだけでなく、サンプルの変更も必要。さらにRTCBuilderが出力する雛形の変更も必要になる。
→_ptr()._is_equivalent(var) を使っている。 - CorbaConsumer で以下の関数を準備してはどうか?
- boolean hasServant()
サーバントを取得できるかどうかを返す関数。 - InPortCdrPOA getServant()
サーバントを取得する関数
POA型を返すやり方を調査する必要あり。
- boolean hasServant()
- そもそも Helper で準備されていないのか?
→Helperではできないようです。 - _ptr()から戻ってきたところでキャスストするのはどうか?
OpenRTM.PortStatus ret = _ptr().put(output_stream.getByteArray());
↓OpenRTM.PortStatus ret = ((OpenRTM.InPortCdrOperations)_ptr()).put(output_stream.getByteArray());
- CorbaConsumer< OpenRTM.InPortCdr > は CorbaConsumer< OpenRTM.InPortCdrOperations > でも大丈夫か?
- 実装
上記のようにキャストする実装としました。
_ptr()._is_equivalent(var) に関しては CorbaConsumer に _ptr(boolean ref) を準備して、_ptr(true)._is_equivalent(var) としました。public OBJECT_TYPE _ptr(boolean ref) { if(ref) { return this.m_var; } return this._ptr(); }
サーバントが直接呼び出されるような場合は、キャストが必要ですので、ご注意ください。
実装¶
ユーザが実装する際に、明示的なキャストをするのを忘れた場合、例外が発生することがあるので、実装をしない方向で進める。idlコンパイラのオプションを調査してみる(2017/9/4 のミーティング)
idlコンパイル(idlj)のオプションで、サーバントを使用する(ショートカット)機能がないか、調査しましたが、ありませんでした。
修正をロールバックしました。
操作