プロジェクト

全般

プロフィール

機能 #3393

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

n-ando8年以上前に追加. 6年以上前に更新.

ステータス:
担当
優先度:
通常
担当者:
対象バージョン:
開始日:
2015/12/11
期日:
進捗率:

100%

予定工数:

説明

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

関係しているリビジョン

リビジョン 794 (差分)
win-ei約8年前に追加

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

リビジョン 1033 (差分)
t-katami が6年以上前に追加

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

リビジョン 1034 (差分)
t-katami が6年以上前に追加

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

履歴

#1 katami が6年以上前に更新

  • ステータス新規 から 担当 に変更
  • 担当者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型を返すやり方を調査する必要あり。
    • そもそも 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 katami が6年以上前に更新

  • 進捗率0 から 100 に変更

他の形式にエクスポート: Atom PDF