<html><head></head><body><div>It certainly looks as though the thread exit code in omniORBpy should check _Py_IsFinalizing(), for versions that have that. That won't help you if you are stuck on Python 3.6, though.</div><div><br></div><div>The interesting question is why these threads are exiting during Python's finalization, and why it has changed since omniORBpy 4.2. I suspect the change may actually not be one that is unique to omniORBpy 4.3, but rather a change that was made in 4.2.5:</div><div><br></div><div><a href="https://sourceforge.net/p/omniorb/svn/6539/">https://sourceforge.net/p/omniorb/svn/6539/</a></div><div><br></div><div>Do you call orb.destroy() before exit?</div><div><br></div><div>Duncan.</div><div><br></div><div><br></div><div>On Mon, 2022-05-23 at 14:26 +0200, Michael Teske via omniORB-list wrote:</div><blockquote type="cite" style="margin:0 0 0 .8ex; border-left:2px #729fcf solid;padding-left:1ex"><div>Hi,<br></div><div><br></div><div>I think I found it in <a href="https://docs.python.org/3/c-api/init.html">https://docs.python.org/3/c-api/init.html</a> :<br></div><div><br></div><div>"void PyEval_RestoreThread(PyThreadState *tstate)<br></div><div>     Part of the Stable ABI.<br></div><div><br></div><div>     Acquire the global interpreter lock (if it has been created) and set the thread state to tstate, which must not be <br></div><div>NULL. If the lock has been created, the current thread must not have acquired it, otherwise deadlock ensues.<br></div><div><br></div><div>     Note<br></div><div><br></div><div>     Calling this function from a thread when the runtime is finalizing will terminate the thread, even if the thread <br></div><div>was not created by Python. You can use _Py_IsFinalizing() or sys.is_finalizing() to check if the interpreter is in <br></div><div>process of being finalized before calling this function to avoid unwanted termination."<br></div><div><br></div><div>Unfortunately _Py_IsFinalizing() is not available on python 3.6, which I'm currently stuck with.<br></div><div>Is there a way to wait for all omniOrbPy threads before exiting (in the python script)? Maybe this would fix the <br></div><div>problem, too.<br></div><div><br></div><div>Regards,<br></div><div>   Michael<br></div><div><br></div><div>Am 12/05/2022 um 13:59 schrieb Michael Teske via omniORB-list:<br></div><blockquote type="cite" style="margin:0 0 0 .8ex; border-left:2px #729fcf solid;padding-left:1ex"><div>Hi,<br></div><div><br></div><div>since upgrading from 4.2.4, I sometimes get aborts on python shutdown.<br></div><div>Must be a race condition somewhere as it does not happen reliably.<br></div><div><br></div><div><br></div><div>Thread 1 (Thread 0x7f6949e7b700 (LWP 2933428) (Exiting)):<br></div><div>#0  0x00007f69ca7bc37f in raise () from /usr/lib64/libc.so.6<br></div><div>#1  0x00007f69ca7a6db5 in abort () from /usr/lib64/libc.so.6<br></div><div>#2  0x00007f69c75207ba in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib64/libstdc++.so.6<br></div><div>--Type <RET> for more, q to quit, c to continue without paging--<br></div><div>#3  0x00007f69c751e53c in __cxxabiv1::__terminate(void (*)()) () from /usr/lib64/libstdc++.so.6<br></div><div>#4  0x00007f69c751e597 in std::terminate() () from /usr/lib64/libstdc++.so.6<br></div><div>#5  0x00007f69c751df0a in __gxx_personality_v0 () from /usr/lib64/libstdc++.so.6<br></div><div>#6  0x00007f69c7280bf8 in _Unwind_ForcedUnwind_Phase2 () from /usr/lib64/libgcc_s.so.1<br></div><div>#7  0x00007f69c7281240 in _Unwind_ForcedUnwind () from /usr/lib64/libgcc_s.so.1<br></div><div>#8  0x00007f69cb2e5556 in __pthread_unwind () from /usr/lib64/libpthread.so.0<br></div><div>#9  0x00007f69cb2dd40b in pthread_exit () from /usr/lib64/libpthread.so.0<br></div><div>#10 0x00007f69cb55c3fd in PyThread_exit_thread () from /usr/lib64/libpython3.6m.so.1.0<br></div><div>#11 0x00007f69cb5ed322 in PyEval_RestoreThread () from /usr/lib64/libpython3.6m.so.1.0<br></div><div>#12 0x00007f69c7e68ece in omnipyThreadCache::threadExit (cn=0x7f6938004de0) at pyThreadCache.cc:234<br></div><div>#13 0x00007f69c7e690eb in omnipyThreadData::~omnipyThreadData (this=0x7f6938005710, __in_chrg=<optimized out>) at <br></div><div>pyThreadCache.cc:78<br></div><div>#14 omnipyThreadData::~omnipyThreadData (this=0x7f6938005710, __in_chrg=<optimized out>) at pyThreadCache.cc:79<br></div><div>#15 0x00007f69c781fc98 in omni_thread::~omni_thread (this=0x7f694c002710, __in_chrg=<optimized out>) at posix.cc:536<br></div><div>#16 0x00007f69c7af6c94 in omniAsyncWorker::~omniAsyncWorker (this=0x7f694c002710, __in_chrg=<optimized out>) at <br></div><div>invoker.cc:109<br></div><div>#17 omniAsyncWorker::~omniAsyncWorker (this=0x7f694c002710, __in_chrg=<optimized out>) at invoker.cc:117<br></div><div>#18 0x00007f69c78205df in omni_thread::exit (return_value=return_value@entry=0x0) at posix.cc:774<br></div><div>#19 0x00007f69c7820724 in omni_thread_wrapper (ptr=0x7f694c002710) at posix.cc:460<br></div><div>#20 0x00007f69cb2dc17a in start_thread () from /usr/lib64/libpthread.so.0<br></div><div>#21 0x00007f69ca881dc3 in clone () from /usr/lib64/libc.so.6<br></div><div><br></div><div>there are several such threads and<br></div><div>the main thread is here:<br></div><div><br></div><div>Thread 5 (Thread 0x7f69cc13ab80 (LWP 2933363)):<br></div><div>#0  0x00007f69cb2e274a in pthread_cond_timedwait@@GLIBC_2.3.2 () from /usr/lib64/libpthread.so.0<br></div><div>#1  0x00007f69cb5ed0a4 in take_gil () from /usr/lib64/libpython3.6m.so.1.0<br></div><div>#2  0x00007f69cb5ed2dd in PyEval_RestoreThread () from /usr/lib64/libpython3.6m.so.1.0<br></div><div>#3  0x00007f69c7e3eb06 in omniPy::InterpreterUnlocker::~InterpreterUnlocker (this=<synthetic pointer>, <br></div><div>__in_chrg=<optimized out>) at ./omnipy.h:404<br></div><div>#4  pyObjRef_dealloc (self=0x7f699f0d1ee8) at pyObjectRef.cc:604<br></div><div>#5  0x00007f69cb5deb2c in dict_dealloc () from /usr/lib64/libpython3.6m.so.1.0<br></div><div>#6  0x00007f69cb67b351 in subtype_dealloc () from /usr/lib64/libpython3.6m.so.1.0<br></div><div>#7  0x00007f69cb5deb87 in dict_dealloc () from /usr/lib64/libpython3.6m.so.1.0<br></div><div>#8  0x00007f69cb5dafcf in free_keys_object () from /usr/lib64/libpython3.6m.so.1.0<br></div><div>#9  0x00007f69cb6aa806 in type_clear () from /usr/lib64/libpython3.6m.so.1.0<br></div><div>#10 0x00007f69cb66c276 in collect () from /usr/lib64/libpython3.6m.so.1.0<br></div><div>#11 0x00007f69cb6e424b in _PyGC_CollectNoFail () from /usr/lib64/libpython3.6m.so.1.0<br></div><div>#12 0x00007f69cb6fe169 in PyImport_Cleanup () from /usr/lib64/libpython3.6m.so.1.0<br></div><div>#13 0x00007f69cb701772 in Py_FinalizeEx () from /usr/lib64/libpython3.6m.so.1.0<br></div><div>#14 0x00007f69cb702544 in Py_Main () from /usr/lib64/libpython3.6m.so.1.0<br></div><div>#15 0x000055e0d2a45b96 in main ()<br></div><div><br></div><div>When I set ORBtraceLevel=40 I see this:<br></div><div><br></div><div>omniORB: (9) 2022-05-12 13:44:38.662928: ORB shutdown is complete.<br></div><div>omniORB: (9) 2022-05-12 13:44:38.662932: Shut down AsyncInvoker...<br></div><div>omniORB: (9) 2022-05-12 13:44:38.662937: Shut down dedicated thread queue.<br></div><div>omniORB: (9) 2022-05-12 13:44:38.662942: AsyncInvoker shut down.<br></div><div>omniORB: (9) 2022-05-12 13:44:38.662955: Deleting Python state for thread id 140552133670656 (thread exit)<br></div><div>omniORB: (3) 2022-05-12 13:44:39.149144: Scan for idle connections (1652355879,149046000)<br></div><div>omniORB: (3) 2022-05-12 13:44:39.149201: Scavenger reduce idle count for strand 0x558342c168e0 to 23<br></div><div>omniORB: (3) 2022-05-12 13:44:39.149211: Scavenger reduce idle count for strand 0x558342d11100 to 23<br></div><div>omniORB: (3) 2022-05-12 13:44:39.149216: Scavenger reduce idle count for strand 0x5583424957f0 to 23<br></div><div>omniORB: (3) 2022-05-12 13:44:39.149221: Scavenger reduce idle count for strand 0x558342920020 to 23<br></div><div>omniORB: (3) 2022-05-12 13:44:39.149226: Scavenger reduce idle count for strand 0x558342ada5e0 to 23<br></div><div>omniORB: (3) 2022-05-12 13:44:39.149233: Scan for idle connections done (1652355879,149046000).<br></div><div>omniORB: (0) 2022-05-12 13:44:39.661452: Destroy ORB...<br></div><div>omniORB: (1) 2022-05-12 13:44:39.661536: Remove Python state for thread id 140552643036928 from cache (shutdown)<br></div><div>omniORB: (1) 2022-05-12 13:44:39.661570: Remove Python state for thread id 140552617858816 from cache (shutdown)<br></div><div>omniORB: (1) 2022-05-12 13:44:39.661582: Remove Python state for thread id 140552626251520 from cache (shutdown)<br></div><div>omniORB: (1) 2022-05-12 13:44:39.661585: Remove Python state for thread id 140553558406912 from cache (shutdown)<br></div><div>omniORB: (1) 2022-05-12 13:44:39.661590: Remove Python state for thread id 140552634644224 from cache (shutdown)<br></div><div>omniORB: (1) 2022-05-12 13:44:39.661711: Python thread state scavenger exit.<br></div><div>omniORB: (0) 2022-05-12 13:44:39.661818: Terminate strand scavenger.<br></div><div>omniORB: (0) 2022-05-12 13:44:39.661838: Close remaining strands.<br></div><div>omniORB: (0) 2022-05-12 13:44:39.661844: Shutdown close connection to giop:tcp:[::1]:15001<br></div><div>omniORB: (3) 2022-05-12 13:44:39.661885: Scan for idle connections (1652355884,149246000)<br></div><div>omniORB: (0) 2022-05-12 13:44:39.661910: Client connection giop:tcp:[::1]:15001 refcount (forced) = 0<br></div><div>omniORB: (0) 2022-05-12 13:44:39.661915: Client close connection to giop:tcp:[::1]:15001<br></div><div>omniORB: (0) 2022-05-12 13:44:39.661921: Shutdown close connection to giop:tcp:10.49.64.73:15001<br></div><div>omniORB: (0) 2022-05-12 13:44:39.661925: sendCloseConnection: to giop:tcp:10.49.64.73:15001 12 bytes<br></div><div>omniORB: (0) 2022-05-12 13:44:39.661928:<br></div><div>4749 4f50 0102 0105 0000 0000           GIOP........<br></div><div>omniORB: (0) 2022-05-12 13:44:39.661971: Client connection giop:tcp:10.49.64.73:15001 refcount (forced) = 0<br></div><div>omniORB: (0) 2022-05-12 13:44:39.661976: Client close connection to giop:tcp:10.49.64.73:15001<br></div><div>omniORB: (0) 2022-05-12 13:44:39.661980: Shutdown close connection to giop:tcp:10.49.64.73:34493<br></div><div>omniORB: (0) 2022-05-12 13:44:39.661983: sendCloseConnection: to giop:tcp:10.49.64.73:34493 12 bytes<br></div><div>omniORB: (0) 2022-05-12 13:44:39.661985:<br></div><div>4749 4f50 0102 0105 0000 0000           GIOP........<br></div><div>omniORB: (0) 2022-05-12 13:44:39.662016: Client connection giop:tcp:10.49.64.73:34493 refcount (forced) = 0<br></div><div>omniORB: (0) 2022-05-12 13:44:39.662020: Client close connection to giop:tcp:10.49.64.73:34493<br></div><div>omniORB: (0) 2022-05-12 13:44:39.662024: Shutdown close connection to giop:tcp:10.49.64.73:48261<br></div><div>omniORB: (0) 2022-05-12 13:44:39.662027: sendCloseConnection: to giop:tcp:10.49.64.73:48261 12 bytes<br></div><div>omniORB: (0) 2022-05-12 13:44:39.662029:<br></div><div>4749 4f50 0102 0105 0000 0000           GIOP........<br></div><div>omniORB: (0) 2022-05-12 13:44:39.662059: Client connection giop:tcp:10.49.64.73:48261 refcount (forced) = 0<br></div><div>omniORB: (0) 2022-05-12 13:44:39.662067: Client close connection to giop:tcp:10.49.64.73:48261<br></div><div>omniORB: (0) 2022-05-12 13:44:39.662071: Shutdown close connection to giop:tcp:10.49.64.73:39675<br></div><div>omniORB: (0) 2022-05-12 13:44:39.662074: sendCloseConnection: to giop:tcp:10.49.64.73:39675 12 bytes<br></div><div>omniORB: (0) 2022-05-12 13:44:39.662077:<br></div><div>4749 4f50 0102 0105 0000 0000           GIOP........<br></div><div>omniORB: (0) 2022-05-12 13:44:39.662109: Client connection giop:tcp:10.49.64.73:39675 refcount (forced) = 0<br></div><div>omniORB: (0) 2022-05-12 13:44:39.662114: Client close connection to giop:tcp:10.49.64.73:39675<br></div><div>omniORB: (0) 2022-05-12 13:44:39.662147: 0 remaining bidir ropes deleted.<br></div><div>omniORB: (0) 2022-05-12 13:44:39.662157: 5 remaining ropes deleted.<br></div><div>omniORB: (0) 2022-05-12 13:44:39.662172: Clear endPoint options.<br></div><div>omniORB: (3) 2022-05-12 13:44:39.662184: Scan for idle connections done (1652355884,149246000).<br></div><div>omniORB: (0) 2022-05-12 13:44:39.662215: Wait for 7 invoker threads to finish.<br></div><div>omniORB: (3) 2022-05-12 13:44:39.662235: AsyncInvoker: thread id 3 finished immediate general task.<br></div><div>omniORB: (3) 2022-05-12 13:44:39.662264: AsyncInvoker: thread id 3 released from general tasks. Total general threads = 1.<br></div><div>omniORB: (3) 2022-05-12 13:44:39.662274: AsyncInvoker: thread id 3 has exited. Total threads = 6.<br></div><div>omniORB: (2) 2022-05-12 13:44:39.662281: AsyncInvoker: thread id 2 released from general tasks. Total general threads = 0.<br></div><div>omniORB: (2) 2022-05-12 13:44:39.662298: AsyncInvoker: thread id 2 has exited. Total threads = 5.<br></div><div>omniORB: (7) 2022-05-12 13:44:39.662309: AsyncInvoker: thread id 7 released from server tasks. Total server threads = 4.<br></div><div>omniORB: (8) 2022-05-12 13:44:39.662324: AsyncInvoker: thread id 8 released from server tasks. Total server threads = 3.<br></div><div>omniORB: (7) 2022-05-12 13:44:39.662330: AsyncInvoker: thread id 7 has exited. Total threads = 4.<br></div><div>omniORB: (8) 2022-05-12 13:44:39.662336: AsyncInvoker: thread id 8 has exited. Total threads = 3.<br></div><div>omniORB: (7) 2022-05-12 13:44:39.662360: Deleting Python state for thread id 140552626251520 (thread exit)<br></div><div>omniORB: (8) 2022-05-12 13:44:39.662362: Deleting Python state for thread id 140552617858816 (thread exit)<br></div><div>omniORB: (5) 2022-05-12 13:44:39.662393: AsyncInvoker: thread id 5 released from server tasks. Total server threads = 1.<br></div><div>omniORB: (5) 2022-05-12 13:44:39.662432: AsyncInvoker: thread id 5 has exited. Total threads = 2.<br></div><div>omniORB: (5) 2022-05-12 13:44:39.662447: Deleting Python state for thread id 140552643036928 (thread exit)<br></div><div>omniORB: (4) 2022-05-12 13:44:39.662371: AsyncInvoker: thread id 4 released from server tasks. Total server threads = 2.<br></div><div>omniORB: (4) 2022-05-12 13:44:39.662505: AsyncInvoker: thread id 4 has exited. Total threads = 1.<br></div><div>omniORB: (4) 2022-05-12 13:44:39.662551: Deleting Python state for thread id 140553558406912 (thread exit)<br></div><div>omniORB: (6) 2022-05-12 13:44:39.662561: AsyncInvoker: thread id 6 released from server tasks. Total server threads = 0.<br></div><div>omniORB: (6) 2022-05-12 13:44:39.662586: AsyncInvoker: thread id 6 has exited. Total threads = 0.<br></div><div>omniORB: (6) 2022-05-12 13:44:39.662601: Deleting Python state for thread id 140552634644224 (thread exit)<br></div><div>omniORB: (0) 2022-05-12 13:44:39.662625: Invoker threads finished.<br></div><div>omniORB: (0) 2022-05-12 13:44:39.662640: AsyncInvoker: deleted.<br></div><div>omniORB: (0) 2022-05-12 13:44:39.662654: ORB destroyed.<br></div><div>omniORB: (0) 2022-05-12 13:44:39.662792: No more references to the ORB -- deleted.<br></div><div>omniORB: (0) 2022-05-12 13:44:39.743916: ObjRef(IDL:fundamental/Server:1.0) -- deleted.<br></div><div>terminate called without an active exception<br></div><div><br></div><div>It's not critical because it's on exit anyway, but annoying enough to ask for help here. Is it maybe because there <br></div><div>somehow are object references after ORB destruction which may be throw exceptions (similar to <br></div><div><a href="https://stackoverflow.com/questions/59082973/terminate-called-without-an-active-exception-after-pthread-cancel">https://stackoverflow.com/questions/59082973/terminate-called-without-an-active-exception-after-pthread-cancel</a> although <br></div><div>no cancel involved?)<br></div><div><br></div><div>I'll do some more tests to find out what exactly changed. The python code was changed as well so maybe it's just <br></div><div>coincidence that this happened after the update...<br></div><div><br></div><div>Greetings,<br></div><div>   Michael<br></div><div><br></div><div>_______________________________________________<br></div><div>omniORB-list mailing list<br></div><div><a href="mailto:omniORB-list@omniorb-support.com">omniORB-list@omniorb-support.com</a><br></div><div><a href="https://www.omniorb-support.com/mailman/listinfo/omniorb-list">https://www.omniorb-support.com/mailman/listinfo/omniorb-list</a><br></div></blockquote><div><br></div><div><br></div><div>_______________________________________________<br></div><div>omniORB-list mailing list<br></div><div><a href="mailto:omniORB-list@omniorb-support.com">omniORB-list@omniorb-support.com</a><br></div><div><a href="https://www.omniorb-support.com/mailman/listinfo/omniorb-list">https://www.omniorb-support.com/mailman/listinfo/omniorb-list</a><br></div></blockquote><div><br></div><div><span><pre>-- <br></pre><pre> -- Duncan Grisby --
  -- duncan@grisby.org --
   -- http://www.grisby.org --

</pre></span></div></body></html>