Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-127008

QThread::terminate() vs. normal exit race

    XMLWordPrintable

Details

    • Bug
    • Resolution: Fixed
    • P3: Somewhat important
    • 6.8.0 Beta2, 6.9.0 FF
    • 5.15.17, 6.2.12, 6.5.6, 6.6.3, 6.7.2, 6.8.0 Beta1
    • Core: Threads
    • None
    • Linux/X11
    • 3
    • 01d4be4a8 (dev), 894837577 (6.8)
    • Foundation Sprint 111, Foundation Sprint 112

    Description

      The following test fails, because the thread cancellation pseudo-exception is delivered via a close() in ~QThreadPipe(), causing std::terminate() to be called.

       

          struct Thread : QThread {
              void run() override { terminate(); }
          };
      
          Thread t;
          t.start();
          t.wait();
      

      Backtrace w/o glib:

      Thread 2 (Thread 0x7fffe6934700 (LWP 1559591)):
      #0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
      #1  0x00007fffec9e8859 in __GI_abort () at abort.c:79
      #2  0x00007fffed3f8c3d in __gnu_cxx::__verbose_terminate_handler () at ../../../../gcc/libstdc++-v3/libsupc++/vterminate.cc:95
      #3  0x00007fffed40a44a in __cxxabiv1::__terminate (handler=<optimized out>) at ../../../../gcc/libstdc++-v3/libsupc++/eh_terminate.cc:48
      #4  0x00007fffed3f87e9 in std::terminate () at ../../../../gcc/libstdc++-v3/libsupc++/eh_terminate.cc:58
      #5  0x00007fffed3f8708 in __cxxabiv1::__gxx_personality_v0 (version=<error reading variable: dwarf2_find_location_expression: Corrupted DWARF expression.>, actions=<error reading variable: dwarf2_find_location_expression: Corrupted DWARF expression.>, exception_class=<error reading variable: dwarf2_find_location_expression: Corrupted DWARF expression.>, ue_header=<error reading variable: dwarf2_find_location_expression: Corrupted DWARF expression.>, context=<error reading variable: dwarf2_find_location_expression: Corrupted DWARF expression.>) at ../../../../gcc/libstdc++-v3/libsupc++/eh_personality.cc:677
      #6  0x00007fffecbdac30 in _Unwind_ForcedUnwind_Phase2 (exc=0x7fffe6934d70, context=0x7fffe6933590, frames_p=0x7fffe6933498) at ../../../gcc/libgcc/unwind.inc:183
      #7  0x00007fffecbdb310 in _Unwind_ForcedUnwind (exc=0x7fffe6934d70, stop=stop@entry=0x7fffed5d1dd0 <unwind_stop>, stop_argument=<optimized out>) at ../../../gcc/libgcc/unwind.inc:218
      #8  0x00007fffed5d1f66 in __GI___pthread_unwind (buf=<optimized out>) at unwind.c:121
      #9  0x00007fffed5d2099 in __pthread_enable_asynccancel () at ../sysdeps/unix/sysv/linux/x86_64/cancellation.S:70
      #10 0x00007fffed5d244d in __close (fd=4) at ../sysdeps/unix/sysv/linux/close.c:27
      #11 0x00007ffff1acd63a in QThreadPipe::~QThreadPipe (this=0x51200000ffd4, __in_chrg=<optimized out>) at /home/marc/Qt/qtbase-submit/src/corelib/kernel/qeventdispatcher_unix.cpp:58
      #12 0x00007ffff1aced60 in QEventDispatcherUNIXPrivate::~QEventDispatcherUNIXPrivate (this=0x51200000ff40, __in_chrg=<optimized out>) at /home/marc/Qt/qtbase-submit/src/corelib/kernel/qeventdispatcher_unix.cpp:183
      #13 0x00007ffff1aceece in QEventDispatcherUNIXPrivate::~QEventDispatcherUNIXPrivate (this=0x51200000ff40, __in_chrg=<optimized out>) at /home/marc/Qt/qtbase-submit/src/corelib/kernel/qeventdispatcher_unix.cpp:183
      #14 0x00007ffff12806e5 in QScopedPointerDeleter<QObjectData>::cleanup (pointer=0x51200000ff40) at /home/marc/Qt/qtbase-submit/src/corelib/tools/qscopedpointer.h:24
      #15 0x00007ffff1270672 in QScopedPointer<QObjectData, QScopedPointerDeleter<QObjectData> >::~QScopedPointer (this=0x502000001018, __in_chrg=<optimized out>) at /home/marc/Qt/qtbase-submit/src/corelib/tools/qscopedpointer.h:81
      #16 0x00007ffff121f29d in QObject::~QObject (this=0x502000001010, __in_chrg=<optimized out>) at /home/marc/Qt/qtbase-submit/src/corelib/kernel/qobject.cpp:1147
      #17 0x00007ffff0f55639 in QAbstractEventDispatcher::~QAbstractEventDispatcher (this=0x502000001010, __in_chrg=<optimized out>) at /home/marc/Qt/qtbase-submit/src/corelib/kernel/qabstracteventdispatcher.cpp:177
      #18 0x00007ffff0f59031 in QAbstractEventDispatcherV2::~QAbstractEventDispatcherV2 (this=0x502000001010, __in_chrg=<optimized out>) at /home/marc/Qt/qtbase-submit/src/corelib/kernel/qabstracteventdispatcher.cpp:658
      #19 0x00007ffff1ad0da3 in QEventDispatcherUNIX::~QEventDispatcherUNIX (this=0x502000001010, __in_chrg=<optimized out>) at /home/marc/Qt/qtbase-submit/src/corelib/kernel/qeventdispatcher_unix.cpp:268
      #20 0x00007ffff1ad0dc6 in QEventDispatcherUNIX::~QEventDispatcherUNIX (this=0x502000001010, __in_chrg=<optimized out>) at /home/marc/Qt/qtbase-submit/src/corelib/kernel/qeventdispatcher_unix.cpp:268
      #21 0x00007ffff1ac4260 in operator() (__closure=0x7fffe5734520) at /home/marc/Qt/qtbase-submit/src/corelib/thread/qthread_unix.cpp:363
      #22 0x00007ffff1acb2b7 in (anonymous namespace)::terminate_on_exception<QThreadPrivate::finish(void*)::<lambda()> >(struct {...} &&) (t=...) at /home/marc/Qt/qtbase-submit/src/corelib/thread/qthread_unix.cpp:261
      #23 0x00007ffff1ac4bca in QThreadPrivate::finish (arg=0xf0758b4ce86d8b4c) at /home/marc/Qt/qtbase-submit/src/corelib/thread/qthread_unix.cpp:342
      #24 0x00007ffff1ac106c in operator() (__closure=0x7fffe6934650) at /home/marc/Qt/qtbase-submit/src/corelib/thread/qthread_unix.cpp:291
      #25 0x00007ffff1acae62 in QScopeGuard<QThreadPrivate::start(void*)::<lambda()> >::~QScopeGuard(void) (this=0x7fffe6934650, __in_chrg=<optimized out>) at /home/marc/Qt/qtbase-submit/src/corelib/tools/qscopeguard.h:41
      #26 0x00007fffeca0d2bf in __GI___call_tls_dtors () at cxa_thread_atexit_impl.c:155
      #27 0x00007fffed5c7617 in start_thread (arg=<optimized out>) at pthread_create.c:485
      #28 0x00007fffecae5353 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
      

      But it also doesn't work with glib.

      Attachments

        For Gerrit Dashboard: QTBUG-127008
        # Subject Branch Project Status CR V

        Activity

          People

            mmutz Marc Mutz
            mmutz Marc Mutz
            Vladimir Minenko Vladimir Minenko
            Alex Blasche Alex Blasche
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Gerrit Reviews

                There are no open Gerrit changes