Back Midas Rome Roody Rootana
  Midas DAQ System  Not logged in ELOG logo
Entry  16 Sep 2024, Marius Köppel, Bug Report, Crash using ODB watch test_fe.cpp
    Reply  16 Sep 2024, Stefan Ritt, Bug Report, Crash using ODB watch 
       Reply  16 Sep 2024, Marius Koeppel, Bug Report, Crash using ODB watch 
          Reply  16 Sep 2024, Stefan Ritt, Bug Report, Crash using ODB watch 
             Reply  16 Sep 2024, Marius Koeppel, Bug Report, Crash using ODB watch 
                Reply  16 Sep 2024, Mark Grimes, Bug Report, Crash using ODB watch 
       Reply  17 Sep 2024, Konstantin Olchanski, Bug Report, Crash using ODB watch 
          Reply  18 Sep 2024, Marius Koeppel, Bug Report, Crash using ODB watch 
             Reply  20 Sep 2024, Stefan Ritt, Bug Report, Crash using ODB watch 
Message ID: 2852     Entry time: 18 Sep 2024     In reply to: 2851     Reply to this: 2853
Author: Marius Koeppel 
Topic: Bug Report 
Subject: Crash using ODB watch 
I created a PR to fix this issue https://bitbucket.org/tmidas/midas/pull-requests/42.
The crash happened since the change in commit 3ad98c5 always got the ODB via XML.
However, the creation from XML should only be used when a user wants to read fast (and when we are on a remote machine) so I added the flag use_from_xml to explicitly specify this.


> > {
> > odb new_settings("/Equipment/Test FE/Settings");
> > new_settings.watch(watch); // <-- here I am getting a segmentation fault
> > }
> 
> this code has a bug. "watch" is attached to object "new_settings" that is deleted
> after the closing curly bracket.

> I would say Stefan's odb API should not allow you to write code like this. an API defect.

As pointed out in the thread this feature is explicitly supported by odbxx.cxx:

void odb::watch(std::function<void(midas::odb &)> f) {
      if (m_hKey == 0 || m_hKey == -1)
         mthrow("watch() called for ODB key \"" + m_name +
                "\" which is not connected to ODB");

      // create a deep copy of current object in case it
      // goes out of scope
      midas::odb* ow = new midas::odb(*this);

      ow->m_watch_callback = f;
      db_watch(s_hDB, m_hKey, midas::odb::watch_callback, ow);

      // put object into watchlist
      g_watchlist.push_back(ow);
}

Also in the old way (see for example https://bitbucket.org/tmidas/midas/src/191d13f98626fae533cbca17b00df7ee361edf16/examples/crfe/crfe.cxx#lines-126) it was possible to create a watch in a scope without the user taking care that the "object" does not go out of scope.
I think this feature should be supported by the framework.

Best,
Marius
ELOG V3.1.4-2e1708b5