[openrtm-users 03455] RingBuffer.py のバグ

takashi suehiro suehiro @ is.uec.ac.jp
2017年 11月 22日 (水) 18:33:30 JST


電通大 末廣です。

OpenRTM-aist-Pythonで、入出力ポートをblockモードで接続しても
ブロック時のデータが一つ消える現象を追いかけていてバグを発見しました。

writeメソッドの以下の部分です。
---------------------------------
        elif not overwrite and timedwrite:     # "block" mode

          if sec < 0:
            sec = self._wtimeout.sec()
            nsec = self._wtimeout.usec() * 1000

          # true: signaled, false: timeout
          if not self._full_cond.wait(sec + (nsec/1000000000.0)):
            self._full_cond.release()
            return OpenRTM_aist.BufferStatus.TIMEOUT
----------------------------------------
コメントに# true: signaled, false: timeoutと書かれていますが、
これが誤りで、waitは常にNoneを返します。
このためtimeoutでなくてもデータを書かずに抜けてしまいます。
またwait(0.0)はブロックしません。
ブロックさせるには、wait()またはwait(None)でなくてはなりません。
したがって、たとえば以下のように書きなおす必要があります。
-------------------------------------
        elif not overwrite and timedwrite:     # "block" mode

          if sec < 0:
            sec = self._wtimeout.sec()
            nsec = self._wtimeout.usec() * 1000

          wait_time = sec + (nsec/1000000000.0)
          if wait_time == 0.0 :
            wait_time = None
          # true: signaled, false: timeout <= wrong! it always returns None
          tmp=self._full_cond.wait(wait_time)
          if self.full():
            self._full_cond.release()
            return OpenRTM_aist.BufferStatus.TIMEOUT
-----------------------------------------
waitを抜けたあとに、self.full()でtimeoutだったのかどうかを確認しています。

同様な誤りがreadメソッドの方にもあるので、要修正です。

C++版も同様なロジックだったと思うのですが、
waitの戻り値がどうなのか、正しく動いているかについては確認していません。

確認、修正をよろしくお願いいたします。


-- 
Takashi Suehiro, Professor, Intelligent Systems Lab.,
Department of Informatics,
Graduate School of Informatics and Engineering,
the University of Electro-Communications
Tel: +81-424-43-5655 Fax: +81-424-43-5682
E-mail: suehiro @ is.uec.ac.jp
1-5-1 Chofugaoka, Chofu, Tokyo 1828585, Japan

from suehiro.t @ gmail
返信は、suehiro @ is.uec.ac.jpにお願いします。
2016.4.1から所属が変わりました.


More information about the openrtm-users mailing list