Project

General

Profile

バグ #2327

RingBuffer関連の問題

Added by Anonymous almost 12 years ago. Updated over 10 years ago.

Status:
終了
Priority:
通常
Assignee:
Target version:
-
Start date:
01/16/2012
Due date:
% Done:

100%

Estimated time:

Description

KEK仲吉さん安さんから指摘。

とりあえずの対処として read()の前に InPortに対し isEmpty()を
行っていました。この件を安さんが調査し次のような問題を見つけ
られましたので報告致します(以下、安さんからのメールの抜粋)。

| RingBuffer.hのwriteメソッドで、
| 従来は
|
| if (empty_)
| {
|    Guard eguard(m_empty.mutex);
|    m_empty.cond.signal();
| }
| advanceWptr(1);
|
| となっていました。
| これだと、readでバッファがなく待っていた状態で、writeが入り、
| cond.signalでシグナルを出しますが、 advanceWptr(1)をする前に、
| シグナルを出しているため、writeのバッファポインタがインクリ
| メントされる前に、readがwake upする可能性が出てきてしまいます。
| そこで、下記のように変更しました。
|
| if (empty_)
| {
|     Guard eguard(m_empty.mutex);
|     advanceWptr(1);
|     m_empty.cond.signal();
| } else
|     advanceWptr(1);
|
| これで、昨日の昼から走らせていますが、数秒で止まってしまう場合
| があったり数十分で止まってしまったありする場合があるのに比べて、
| いまだ走っていますので、つじつまがあう点を考えても、問題は解決
| したものと思います。

Related issues

Related to OpenRTM-aist (C++) - バグ #1426: 1.0.0のRingBuffer関連の問題終了2010-04-22

Associated revisions

Revision 641 (diff)
Added by fsi-katami almost 12 years ago

RingBuffer\'s bug was fixed. refs #2327

Revision 684 (diff)
Added by ga almost 11 years ago

The bugs of RingBuffer class have been fixed. refs #2327

History

#1 Updated by Anonymous almost 12 years ago

  • Status changed from 新規 to 解決
  • Assignee set to Anonymous

#2 Updated by ga almost 11 years ago

  • Assignee changed from Anonymous to ga
  • % Done changed from 0 to 80

#3 Updated by ga almost 11 years ago

  • % Done changed from 80 to 100
1. write()メソッドの問題修正
  • m_rtimeoutをm_wtimeoutに修正
  • block modeにおいて、m_full.mutex.wait()からの復帰がnotify()によるものか、タイムアウトによるものなのかにかかわらず"return ReturnCode.TIMEOUT;"となっていたため、"full()"にて確認したうえで "return ReturnCode.TIMEOUT;"するように修正。
2. read()メソッドの問題修正
  • m_rtimeoutをm_wtimeoutに修正
  • block modeにおいて、m_full.mutex.wait()からの復帰がnotify()によるものか、タイムアウトによるものなのかにかかわらず"return ReturnCode.TIMEOUT;"となっていたため、"full()"にて確認したうえで "return ReturnCode.TIMEOUT;"するように修正。
3. 本チケットに関する実装の見直し
  • advanceRptr(1)の直前でfull()をコールするように変更。
  • advanceWptr(1)の直前でempty()をコールするように変更。

上記の変更は、 r684 にて対応しました。

#4 Updated by n-ando over 10 years ago

  • Status changed from 解決 to 終了

Also available in: Atom PDF