[openrtm-users 00756] Java版のPeriodicContextのバグについて

Yuki Suga ysuga @ suou.waseda.jp
2009年 2月 25日 (水) 15:45:56 JST


OpenRTM-aistユーザの皆様:
早稲田の菅です.
お世話になっております.

Java版(ver. 0.4.1)のバグについてお知らせしたくメールを差し上げました.
該当箇所はjp.go.aist.rtm.RTC.executionContextパッケージの
PeriodicExecutionContextクラス内で,
int svc()というメソッドです.

旧コードでは,Thread.sleep(long, int)に対して,

    Thread.sleep(0, (int)tv.getUsec()); (単位はマイクロ秒)

のような呼び出しが行われていますが,これは誤りで,
第1引数,第2引数に正しくは,
ミリ秒(long型),ナノ秒(int型)を入れます.

このせいで,正しい実行周期で実行できないばかりか,
periodic.rateに1.0などを入れると,
桁あふれを起こして実行すらできません.

旧コードと正しいコードを両方乗せます.

//////////////旧コード///////////////////
    /**
     * <p>ExecutionContext用のスレッドの実行関数です。
     * 登録されたコンポーネントの処理を呼び出します。</p>
     */
    public int svc() {
        do {
            TimeValue tv = new TimeValue(0, m_usec); // (s, us)
            for(int intIdx=0;intIdx<m_comps.size();intIdx++ ) {
                m_comps.elementAt(intIdx).invoke();
            }
            while( !m_running ) {
                try {
                    Thread.sleep(0, (int)tv.getUsec());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            if( !m_nowait ) {
                try {
                    Thread.sleep(0, (int)tv.getUsec());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        } while( m_running );
      return 0;
    }

////////////正しいコード////////////////
    /**
     * <p>ExecutionContext用のスレッドの実行関数です。
     * 登録されたコンポーネントの処理を呼び出します。</p>
     */
    public int svc() {
        do {
            TimeValue tv = new TimeValue(0, m_usec); // (s, us)
            long millisec = m_usec / 1000;
            int  nanosec  = (int)((m_usec % 1000) * 1000);
            for(int intIdx=0;intIdx<m_comps.size();intIdx++ ) {
                m_comps.elementAt(intIdx).invoke();
            }
            while( !m_running ) {
                try {
                    Thread.sleep(millisec, nanosec);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            if( !m_nowait ) {
                try {
                    Thread.sleep(millisec, nanosec);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        } while( m_running );
      return 0;
    }


以上です.
訂正されたJarファイルおよびインストーラが早急に公開されることを
希望します

ではでは.

-- 
//////////////////////////////////////////////////
Yuki Suga
Intelligent Machine Laboratory, Waseda Univ.
#59-325 3-4-1 Okubo Shinjuku-ku Tokyo, Japan
E-mail: ysuga @ suou.waseda.jp
URL:   http://www.sugano.mech.waseda.ac.jp/~ysuga
URL:   http://www.ysuga.net
//////////////////////////////////////////////////



openrtm-users メーリングリストの案内