[openrtm-users 00038] RtcRingBuffer::get_new_list()のデッドロック

1 つの投稿 / 0 new
root
オフライン
Last seen: 15時間 34分 前
登録日: 2009-06-23 14:31
[openrtm-users 00038] RtcRingBuffer::get_new_list()のデッドロック

稲村@IHIです。

バグ報告です。

InPortで、getNewList()メソッドを使うと、デッドロックします。
getNewList()メソッドは、RtcRingBufferのget_new_list()メソッド
を呼び出していますが、ここで、同じミューテックスを2重にロックしていました。

inline std::vector get_new_list()
{
ACE_Guard guard(m_Mutex); // <= ここでロック
std::vector data;
int len(new_data_len()); // <= この中でもロック
data.resize(len);
 …
}

そこで、ロックを行なわないプライベートメソッドを用意し、
get_new_list()、new_data_len()から呼び出すように修正しました。

inline std::vector get_new_list()
{
ACE_Guard guard(m_Mutex); // <= ここでロック

std::vector data;
int len(new_data_len_no_guard()); // <= ロックしない
data.resize(len);
 …
}

inline int new_data_len()
{
ACE_Guard guard(m_Mutex); // <= ここでロック
return new_data_len_no_guard(); // <= ロックしない
}

private:
inline int new_data_len_no_guard()
{
int cnt(0);
for (int i(m_Newest);
m_Buffer[i].is_new() && cnt < m_Length;
++cnt, --i < 0 ? (i = m_Length - 1) : 0)
{;}
return cnt;
}

未定義

ダウンロード

最新バージョン : 2.0.1-RELESE

統計

Webサイト統計
ユーザ数:2195
プロジェクト統計
RTコンポーネント307
RTミドルウエア35
ツール22
文書・仕様書2

Choreonoid

モーションエディタ/シミュレータ

OpenHRP3

動力学シミュレータ

OpenRTP

統合開発プラットフォーム

産総研RTC集

産総研が提供するRTC集

TORK

東京オープンソースロボティクス協会

DAQ-Middleware

ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク