Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
Naoki-Hiraoka opened this issue Mar 30, 2023 · 2 comments
Open
Labels
bug Something isn't working

Comments

@Naoki-Hiraoka
Copy link

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

  • OS: Ubuntu 18.04
  • OpenRTM-aist Version 1.1.2
  • ROS: melodic

Additional context
リンク先のcommitのようにすると直りました。
tork-a/openrtm_aist-release@09e089c

RTCはshutdown()時にnotifyFinalizedで削除予定と設定され、Managerは1秒おきにタイマーでcleanupComponentsで削除予定と設定されたRTCのデストラクタを呼びます。Managerのshutdown時には、cleanupComponentsのタイマーのタイミングが来る前に終了してしまうので、RTCのデストラクタが呼ばれていないように見えます。

ソースコードを軽く見た限りですと、最新版のOpenRTM-aistでもこの現象が発生しそうに見えます。

関連するissue

@n-kawauchi
Copy link

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
Copy link
Author

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants