OpenRTM / OpenRTM-aist

OpenRTM-aist: RT-Middleware and OMG RTC implementation in C++ implemented by AIST
https://openrtm.org/
Other
19 stars 12 forks source link

Managerのshutdown時にRTCのデストラクタが呼ばれない #1098

Open Naoki-Hiraoka opened 1 year ago

Naoki-Hiraoka commented 1 year ago

Describe the bug Managerのshutdown時にRTCのデストラクタが呼ばれません

To Reproduce

git clone https://github.com/tork-a/openrtm_aist-release -b release/melodic/openrtm_aist/1.1.2-7
# examples/SeqIO/SeqIn.cppを編集し、デストラクタにプリント文を入れる 
catkin build openrtm_aist
omniNames -start 15005 -datadir /tmp
rosrun openrtm_aist SeqInComp -o "corba.nameservers:localhost:15005" -o "naming.formats:%n.rtc"
# ここでpress Ctrl-C すると、デストラクタに入れたプリント文が表示されることが期待されるが、実際には表示されない

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

n-kawauchi commented 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系のメンテナンスは予定しておりません。 私が分かる範囲でコメントさせて頂きました。

Naoki-Hiraoka commented 1 year ago

ご確認くださりありがとうございます。 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のデストラクタに入れたプリント文が表示されないことが確認できました。