プロジェクト

全般

プロフィール

バグ #1426

1.0.0のRingBuffer関連の問題

n-ando約14年前に追加. 約14年前に更新.

ステータス:
終了
優先度:
通常
担当者:
-
対象バージョン:
-
開始日:
2010/04/22
期日:
進捗率:

100%

予定工数:

説明

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);
|
| これで、昨日の昼から走らせていますが、数秒で止まってしまう場合
| があったり数十分で止まってしまったありする場合があるのに比べて、
| いまだ走っていますので、つじつまがあう点を考えても、問題は解決
| したものと思います。

関連するチケット

関連している OpenRTM-aist (Java) - バグ #2327: RingBuffer関連の問題終了2012-01-16

履歴

#1 n-ando約14年前に更新

  • ステータス新規 から 終了 に変更
  • 進捗率0 から 100 に変更

修正しました。

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