Open Naoki-Hiraoka opened 1 year ago
Windows10, OpenRTM-aist 2.0.1, SeqIn/SeqOutの接続動作で確認しました。 SeqInのデストラクタに下記コードを追加し、Ctrl-C で終了させる場合、RTSE上でdeactivate後のexitで終了させる場合を確認しました。
SeqIn::~SeqIn()
{
using std::cout;
using std::endl;
cout << "SeqIn::destructor" << endl;
RTC_TRACE(("*** SeqIn::destructor "));
}
rtc.confに下記を追加してログファイルに出力させるようにしました。 logger.enable: YES logger.log_level: PARANOID
deactivate後のexitで終了した場合はコマンドプロンプトにもログファイルにも出力されました。 ログを抜粋します。 Apr 03 06:02:03.488 TRACE: manager: Manager::notifyFinalized() Apr 03 06:02:03.877 VERBOSE: manager: Manager::cleanupComponents() Apr 03 06:02:03.877 VERBOSE: manager: 1 components are marked as finalized. Apr 03 06:02:03.877 TRACE: manager: deleteComponent(RTObject*) Apr 03 06:02:03.877 TRACE: manager: Unbind name: DESKTOP-TNL449P.host_cxt/SeqIn0.rtc Apr 03 06:02:03.877 TRACE: NamingManager: NamingManager::unbindObject(DESKTOP-TNL449P.host_cxt/SeqIn0.rtc) Apr 03 06:02:03.877 TRACE: NamingOnCorba: unbindObject(name = DESKTOP-TNL449P.host_cxt/SeqIn0.rtc) Apr 03 06:02:03.878 TRACE: SeqIn0: *** SeqIn::destructor <--★ Apr 03 06:02:04.478 TRACE: manager: Manager::shutdown() Apr 03 06:02:04.478 TRACE: manager: Manager::shutdownComponents() Apr 03 06:02:04.478 TRACE: manager: Manager::shutdownNaming()
一方、Ctrl-C で終了させた場合は確かにログに出力されませんでした。 rtshellコマンドを使ってRTCの起動から終了までを自動化する場合でも、Ctrl-Cで終了する手順は示しておりません。
OpenRTM-aistの1.1系と最新の2.0系ではManagerのshutdownシーケンスが変更されております。 1.1系のメンテナンスは予定しておりません。 私が分かる範囲でコメントさせて頂きました。
ご確認くださりありがとうございます。 Ctrl-Cで終了する手順及びOpenRTM-aistの1.1系のメンテナンスは予定されていないこと、承知いたしました。
OpenRTM-aist 2.0.1でも、deactivate後のexitで終了した場合はRTCのデストラクタが呼ばれている一方で、Ctrl-Cで終了した場合にはRTCのデストラクタが呼ばれないことから、 このManagerのshutdown時にRTCのデストラクタが呼ばれない現象はOpenRTM-aist 2.0.1でも発生していることが示唆されました。
あたらめてこちらの環境で確認したところ、 OpenRTM-aist 1.1.2でも、pythonインタフェースからRTCをdeactivate()してRTCをexit()した場合は、RTCのデストラクタが呼ばれていることが確認できました。一方で、RTCをexit()せずにmanagerのshutdown()をpythonインタフェースから呼んだ場合には、RTCのデストラクタに入れたプリント文が表示されないことが確認できました。
Describe the bug Managerのshutdown時にRTCのデストラクタが呼ばれません
To Reproduce
Reproducibility 毎回.
Environment
Additional context リンク先のcommitのようにすると直りました。 https://github.com/tork-a/openrtm_aist-release/commit/09e089c9e6c49cc6aef6626d17215930060feafb
RTCは
shutdown()
時にnotifyFinalized
で削除予定と設定され、Managerは1秒おきにタイマーでcleanupComponents
で削除予定と設定されたRTCのデストラクタを呼びます。Managerのshutdown時には、cleanupComponents
のタイマーのタイミングが来る前に終了してしまうので、RTCのデストラクタが呼ばれていないように見えます。ソースコードを軽く見た限りですと、最新版のOpenRTM-aistでもこの現象が発生しそうに見えます。
関連するissue