操作
バグ #2327
完了RingBuffer関連の問題
開始日:
2012/01/16
期日:
進捗率:
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);
|
| これで、昨日の昼から走らせていますが、数秒で止まってしまう場合
| があったり数十分で止まってしまったありする場合があるのに比べて、
| いまだ走っていますので、つじつまがあう点を考えても、問題は解決
| したものと思います。
ga さんがほぼ12年前に更新
- 進捗率 を 80 から 100 に変更
1. write()メソッドの問題修正
- m_rtimeoutをm_wtimeoutに修正
- block modeにおいて、m_full.mutex.wait()からの復帰がnotify()によるものか、タイムアウトによるものなのかにかかわらず"return ReturnCode.TIMEOUT;"となっていたため、"full()"にて確認したうえで "return ReturnCode.TIMEOUT;"するように修正。
- m_rtimeoutをm_wtimeoutに修正
- block modeにおいて、m_full.mutex.wait()からの復帰がnotify()によるものか、タイムアウトによるものなのかにかかわらず"return ReturnCode.TIMEOUT;"となっていたため、"full()"にて確認したうえで "return ReturnCode.TIMEOUT;"するように修正。
- advanceRptr(1)の直前でfull()をコールするように変更。
- advanceWptr(1)の直前でempty()をコールするように変更。
上記の変更は、 r684 にて対応しました。
操作