<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">Hi all,<div class="">I have developed a theory meanwhile why we have these crashes on disconnecting that I would like to discuss with you.</div><div class=""><br class=""></div><div class="">I think the problem is, that the representation of devices (INDI::Telescope, …) and properties (INDI::Properties) are used in a multithreaded manner in KStars, but do not provide thread safety on their own.</div><div class=""><br class=""></div><div class="">For each device, there are two  threads that might come into conflict:</div><div class="">1. The KStars main thread accessing and modifying device properties (in fact I think it could even be more of them)</div><div class="">2.  BaseClientPrivate::listenINDI() that has a socket connection to the INDI server and communicates with the device driver inside the INDI server.</div><div class=""><br class=""></div><div class="">Both can modify the same data object in parallel. It could for example happen, that listenINDI() receives „removeProperty“ commands and removes properties in parallel to the KStars main thread that retrieves a Property object that is just in progress to be deleted. </div><div class=""><br class=""></div><div class="">As long as deleting the property comes before or after the KStars access, everything is fine. The problem is that the sequence is the following:</div><div class="">1. KStars main thread obtains a property object</div><div class="">2. listenINDI() receives a removeProperty command and deletes it</div><div class="">3. KStars wants to read data from the property object and experiences a SEGV exception, since the object does not exist any more.</div><div class=""><br class=""></div><div class="">To resolve this, I think two or three of us should stick their heads together and discuss how this can be resolved.</div><div class=""><br class=""></div><div class="">Does that make sense?</div><div class=""><br class=""></div><div class="">Cheers</div><div class="">Wolfgang</div><div class=""><br class=""><div class="">
<meta charset="UTF-8" class=""><div dir="auto" style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div dir="auto" style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">—</div><div style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">Wolfgang Reissenberger<br class=""><br class=""></div><div style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><a href="http://www.sterne-jaeger.de" class="">www.sterne-jaeger.de</a><br class="">TSA-120 + FSQ-85 | Avalon Linear + M-zero | ASI 1600mm pro + 6200mm pro</div></div></div></div>
</div>
<div><br class=""><blockquote type="cite" class=""><div class="">Am 10.09.2021 um 13:22 schrieb Wolfgang Reissenberger <<a href="mailto:sterne-jaeger@openfuture.de" class="">sterne-jaeger@openfuture.de</a>>:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html; charset=us-ascii" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">Just one thought, but I have to admit I do not really understand the INDI client manager.<div class=""><br class=""></div><div class="">Since there are several threads requesting things from the client manager - could it be that not all threads are aware of a disconnect and consequently try to access elements or properties, that have already been destroyed? I have for example the thread in mind of EKOS that regularly requests the current mount position, but it may be others as well...<br class=""><div class=""><br class=""><blockquote type="cite" class=""><div class="">Am 10.09.2021 um 03:44 schrieb Hy Murveit <<a href="mailto:murveit@gmail.com" class="">murveit@gmail.com</a>>:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Jasem,<div class="">FWIW, I was able to get it to crash several times by connecting/disconnecting.<div class="">Ping me if you want to video</div><div class="">Hy</div></div></div><br class=""><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Sep 9, 2021 at 6:32 PM Hy Murveit <<a href="mailto:murveit@gmail.com" class="">murveit@gmail.com</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class=""><div class="">Using the latest HEAD, 2e36eb8322d8f8490c0419f64f86e1152127fb94 including "check for nullptr..." I got this segv </div><div class="">by starting ekos, and disconnecting right away (repeated 3 times), on my RPi4 running ubuntu 21.04.</div><div class=""><br class=""></div><div class="">Hy</div><div class=""><br class=""></div>(gdb) bt<br class="">#0  0x0000aaaaab4a1508 in INDI::BaseDevice::getDeviceName() const ()<br class="">#1  0x0000aaaaaae795fc in operator() (__closure=0xffffb40bef30)<br class="">    at /home/hy/Projects/kstars/kstars/indi/clientmanager.cpp:111<br class="">#2  QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, ClientManager::newProperty(INDI::Property*)::<lambda()> >::call (arg=<optimized out>, f=...)<br class="">    at /usr/include/aarch64-linux-gnu/qt5/QtCore/qobjectdefs_impl.h:146<br class="">#3  QtPrivate::Functor<ClientManager::newProperty(INDI::Property*)::<lambda()>, 0>::call<QtPrivate::List<>, void> (arg=<optimized out>, f=...)<br class="">    at /usr/include/aarch64-linux-gnu/qt5/QtCore/qobjectdefs_impl.h:256<br class="">#4  QtPrivate::QFunctorSlotObject<ClientManager::newProperty(INDI::Property*)::<lambda()>, 0, QtPrivate::List<>, void>::impl(int, QtPrivate::QSlotObjectBase *, QObject *, void **, bool *)<br class="">    (which=1, this_=0xffffb40bef20, r=<optimized out>, a=<optimized out>, ret=<optimized out>) at /usr/include/aarch64-linux-gnu/qt5/QtCore/qobjectdefs_impl.h:443<br class="">#5  0x0000fffff52ef6d4 in QObject::event(QEvent*) ()<br class="">    at /lib/aarch64-linux-gnu/libQt5Core.so.5<br class="">#6  0x0000fffff5d369b0 in QApplicationPrivate::notify_helper(QObject*, QEvent*) ()<br class="">    at /lib/aarch64-linux-gnu/libQt5Widgets.so.5<br class="">#7  0x0000fffff52bdb60 in QCoreApplication::notifyInternal2(QObject*, QEvent*) ()<br class="">    at /lib/aarch64-linux-gnu/libQt5Core.so.5<br class="">#8  0x0000fffff52c0f48 in QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) () at /lib/aarch64-linux-gnu/libQt5Core.so.5<br class="">#9  0x0000fffff531e9e8 in  () at /lib/aarch64-linux-gnu/libQt5Core.so.5<br class="">#10 0x0000fffff4257578 in g_main_context_dispatch ()<br class="">    at /lib/aarch64-linux-gnu/libglib-2.0.so.0<br class="">#11 0x0000fffff42ad188 in  () at /lib/aarch64-linux-gnu/libglib-2.0.so.0<br class="">#12 0x0000fffff4254ac4 in g_main_context_iteration ()<br class="">    at /lib/aarch64-linux-gnu/libglib-2.0.so.0<br class="">#13 0x0000fffff531de94 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib/aarch64-linux-gnu/libQt5Core.so.5<br class="">#14 0x0000fffff52bc04c in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) ()<br class="">    at /lib/aarch64-linux-gnu/libQt5Core.so.5<br class="">#15 0x0000fffff52c514c in QCoreApplication::exec() ()<br class="">    at /lib/aarch64-linux-gnu/libQt5Core.so.5<br class="">#16 0x0000aaaaaab927cc in main(int, char**) (argc=<optimized out>, argv=<optimized out>)<br class="">    at /home/hy/Projects/kstars/kstars/main.cpp:393<br class="">(gdb) <br class=""><br class=""><div class=""><br class=""></div></div><br class=""><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Sep 9, 2021 at 10:48 AM Hy Murveit <<a href="mailto:murveit@gmail.com" target="_blank" class="">murveit@gmail.com</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="">I just got another segv, and it happened when I clicked "Disconnect" trying to disconnect indi.<div class="">Here's the backtrace:</div><div class=""><br class=""></div><div class="">(gdb) bt<br class="">#0  0x0000aaaaaae8af88 in INDI_E::syncSwitch() (this=0xaaaab3f2ebc0) at /home/hy/Projects/kstars/kstars/indi/indielement.cpp:209<br class="">#1  0x0000aaaaaae84968 in INDI_D::updateSwitchGUI(_ISwitchVectorProperty*) (this=<optimized out>, svp=<optimized out>)<br class="">    at /home/hy/Projects/kstars/kstars/indi/indidevice.cpp:188<br class="">#2  0x0000fffff52ef6d4 in QObject::event(QEvent*) () at /lib/aarch64-linux-gnu/libQt5Core.so.5<br class="">#3  0x0000fffff5d369b0 in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /lib/aarch64-linux-gnu/libQt5Widgets.so.5<br class="">#4  0x0000fffff52bdb60 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /lib/aarch64-linux-gnu/libQt5Core.so.5<br class="">#5  0x0000fffff52c0f48 in QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) ()<br class="">    at /lib/aarch64-linux-gnu/libQt5Core.so.5<br class="">#6  0x0000fffff531e9e8 in  () at /lib/aarch64-linux-gnu/libQt5Core.so.5<br class="">#7  0x0000fffff4257578 in g_main_context_dispatch () at /lib/aarch64-linux-gnu/libglib-2.0.so.0<br class="">#8  0x0000fffff42ad188 in  () at /lib/aarch64-linux-gnu/libglib-2.0.so.0<br class="">#9  0x0000fffff4254ac4 in g_main_context_iteration () at /lib/aarch64-linux-gnu/libglib-2.0.so.0<br class="">#10 0x0000fffff531de94 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) ()<br class="">    at /lib/aarch64-linux-gnu/libQt5Core.so.5<br class="">#11 0x0000fffff52bc04c in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib/aarch64-linux-gnu/libQt5Core.so.5<br class="">#12 0x0000fffff52c514c in QCoreApplication::exec() () at /lib/aarch64-linux-gnu/libQt5Core.so.5<br class="">#13 0x0000aaaaaab927cc in main(int, char**) (argc=<optimized out>, argv=<optimized out>)<br class="">    at /home/hy/Projects/kstars/kstars/main.cpp:393<br class="">(gdb) <br class=""><br class=""></div><div class="">I was running from HEAD through and including "use modern connect" a100fa1664e028460a348303365caf983e06eda3</div><div class=""><br class=""></div><div class="">Hy</div><div class=""><br class=""></div></div><br class=""><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Sep 6, 2021 at 10:45 PM Jasem Mutlaq <<a href="mailto:mutlaqja@ikarustech.com" target="_blank" class="">mutlaqja@ikarustech.com</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hello Hy,<br class="">
<br class="">
I think I submitted a refactor of the INDI Control Panel in KStars<br class="">
that should fix such crash-on-disconnection issues. This commit has<br class="">
the fix: 678c5e360c7651060c65133ed97b074c0b24bc40<br class="">
<br class="">
However, we must thoroughly test KStars now for stability issues.<br class="">
Robert reported crashes on the MacOS client with INDI, so this needs<br class="">
to be investigated. The due date for 3.5.5 was planned for September<br class="">
6th (Yesterday) but I really think we should delay perhaps for a few<br class="">
days until we ensure stability issues are addressed. Hopefully more<br class="">
users would try the beta to report back. Keep using KStars with *real*<br class="">
equipment under real conditions to catch some of these elusive bugs.<br class="">
<br class="">
--<br class="">
Best Regards,<br class="">
Jasem Mutlaq<br class="">
<br class="">
On Tue, Sep 7, 2021 at 1:19 AM Hy Murveit <<a href="mailto:murveit@gmail.com" target="_blank" class="">murveit@gmail.com</a>> wrote:<br class="">
><br class="">
> Thread 1 "kstars" received signal SIGSEGV, Segmentation fault.<br class="">
><br class="">
> 0x0000aaaaaae88bb8 in INDI_E::syncSwitch (this=0xaaaab0179940)<br class="">
>     at /home/hy/Projects/kstars/kstars/indi/indielement.cpp:225<br class="">
> 225                if (sp->svp->p == IP_RO)<br class="">
> (gdb)<br class="">
> (gdb) bt<br class="">
> #0  0x0000aaaaaae88bb8 in INDI_E::syncSwitch() (this=0xaaaab0179940)<br class="">
>     at /home/hy/Projects/kstars/kstars/indi/indielement.cpp:225<br class="">
> #1  0x0000aaaaaae82448 in INDI_D::updateSwitchGUI(_ISwitchVectorProperty*)<br class="">
>     (this=<optimized out>, svp=<optimized out>)<br class="">
>     at /home/hy/Projects/kstars/kstars/indi/indidevice.cpp:186<br class="">
> #2  0x0000fffff52ef6d4 in QObject::event(QEvent*) ()<br class="">
>     at /lib/aarch64-linux-gnu/libQt5Core.so.5<br class="">
> #3  0x0000fffff5d369b0 in QApplicationPrivate::notify_helper(QObject*, QEvent*)<br class="">
>     () at /lib/aarch64-linux-gnu/libQt5Widgets.so.5<br class="">
> #4  0x0000fffff52bdb60 in QCoreApplication::notifyInternal2(QObject*, QEvent*)<br class="">
>     () at /lib/aarch64-linux-gnu/libQt5Core.so.5<br class="">
> #5  0x0000fffff52c0f48 in QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) () at /lib/aarch64-linux-gnu/libQt5Core.so.5<br class="">
> #6  0x0000fffff531e9e8 in  () at /lib/aarch64-linux-gnu/libQt5Core.so.5<br class="">
> #7  0x0000fffff4257578 in g_main_context_dispatch ()<br class="">
>     at /lib/aarch64-linux-gnu/libglib-2.0.so.0<br class="">
> #8  0x0000fffff42ad188 in  () at /lib/aarch64-linux-gnu/libglib-2.0.so.0<br class="">
> #9  0x0000fffff4254ac4 in g_main_context_iteration ()<br class="">
>     at /lib/aarch64-linux-gnu/libglib-2.0.so.0<br class="">
> #10 0x0000fffff531de94 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib/aarch64-linux-gnu/libQt5Core.so.5<br class="">
> #11 0x0000fffff52bc04c in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib/aarch64-linux-gnu/libQt5Core.so.5<br class="">
> #12 0x0000fffff52c514c in QCoreApplication::exec() ()<br class="">
>     at /lib/aarch64-linux-gnu/libQt5Core.so.5<br class="">
> #13 0x0000aaaaaab917cc in main(int, char**)<br class="">
>     (argc=<optimized out>, argv=<optimized out>)<br class="">
>     at /home/hy/Projects/kstars/kstars/main.cpp:39<br class="">
><br class="">
><br class="">
</blockquote></div>
</blockquote></div>
</blockquote></div>
</div></blockquote></div><br class=""></div></div></div></blockquote></div><br class=""></div></body></html>