Deskflowの最新版がOpenBSDで動かなくなっていたので、直しているところです。排他制御を行う必要が生じたらしく、std::scoped_lock lock{m_mutex}がいくつか追加されているのですが、どうもロックのかかった状態でさらにロックしようとしてabort trapで落ちます。OpenBSD(server)からWindows(client)にキーボード/マウス操作が移った瞬間に。
二重ロックの検出は #define CheckLock(x) {if (m_mutex.try_lock()) m_mutex.unlock(); else __asm__ volatile("int3");} した上で、std::scoped_lock lock{m_mutex};の前にCheckLock(0)を呼ぶとして、gdbの操作が厄介です。というのも、キーボード/マウス操作の対象がWindows側に切り替わるタイミングでgdbに落ちるため、Ctrl-Alt-BackspaceでX.orgを落とす以外何もできなくなります。これについては、tmux→gdb→deskflowの順に動かし、breakpoint trapでgdbに落ちたら一旦X.orgを落とす→X.orgを再起動→tmux aでgdbセッションに復帰、という手順でbacktraceは取れます。Xを一旦落としているので、その後の動作は継続できませんけど。
実はこの方法を見つける前に、何か例外を吐いているのではなかろうかということで try { std::scoped_lock{m_mutex}; } catch(...) { /*適当な処理*/ } を試していたものの、全然問題を見つけ出せずかなり悩んでいました。これ、分かる人はすぐ分かると思いますがstd::scoped_lock{m_mutex}の範囲がtry{}の中だけに限定されてしまうのでコメントアウトしているのと変わりません。いくら頑張っても、流石に「無」をデバッグするのは…(←一回言ってみたかった)。57.2kg(24:00)