稲村@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; }
モーションエディタ/シミュレータ
動力学シミュレータ
統合開発プラットフォーム
産総研が提供するRTC集
東京オープンソースロボティクス協会
ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク
稲村@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;
}