[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