Project

General

Profile

機能 #3393

⑨ サービスポートのダイレクト接続機能

Added by n-ando almost 6 years ago. Updated about 4 years ago.

Status:
担当
Priority:
通常
Assignee:
Start date:
12/11/2015
Due date:
% Done:

100%

Estimated time:

Description

同一プロセス内のデータポート接続において、required i/fがprovided i/fを呼び出すのに、オブジェクトリファレンス経由ではなく、マーシャリングをバイパスしサーバントを直接呼ぶようにする機能を実装すること。

Associated revisions

Revision 794 (diff)
Added by win-ei over 5 years ago

Direct connect functionality with service ports has been implemented. refs #3393

Revision 1033 (diff)
Added by t-katami about 4 years ago

[compat,bugfix,->releng_1_2] Fiexd bugs. refs #3393

Revision 1034 (diff)
Added by t-katami about 4 years ago

[compat,bugfix,->releng_1_2] Canceled the change. refs #3393

History

#1 Updated by katami about 4 years ago

  • Status changed from 新規 to 担当
  • Assignee set to win-ei
  • Target version set to 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型を返すやり方を調査する必要あり。
    • そもそも Helper で準備されていないのか?
      →Helperではできないようです。
    • _ptr()から戻ってきたところでキャスストするのはどうか?
      OpenRTM.PortStatus ret = _ptr().put(output_stream.getByteArray());
      

                  ↓
      OpenRTM.PortStatus ret = ((OpenRTM.InPortCdrOperations)_ptr()).put(output_stream.getByteArray());
      
  • 実装
    上記のようにキャストする実装としました。
    _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)のオプションで、サーバントを使用する(ショートカット)機能がないか、調査しましたが、ありませんでした。

修正をロールバックしました。

#2 Updated by katami about 4 years ago

  • % Done changed from 0 to 100

Also available in: Atom PDF