[Interest] QNetwork problem in threaded application (repost from development).

Benjamin Zeller zeller.benjamin at web.de
Mon Sep 9 15:18:26 CEST 2013


Hello,

i'm currently stress-testing a application at work and came across this
problem.
The application accepts connections and pushes the created sockets
to a worker thread (moveToThread), the worker thread then handles the
rest.
But sometimes when the socket was already closed in the thread i
get a SEGFAULT. It seems something in the mainthread tries to access
the socket engine.

After debugging it i saw that in the backtrace
QCoreApplication::sendEvent is used, instead of postEvent.




Backtrace Mainloop (stops in qabstractsocket.cpp line 741):

     if (readSocketNotifierStateSet && socketEngine &&
-->        readSocketNotifierState !=
socketEngine->isReadNotificationEnabled()) {
         socketEngine->setReadNotificationEnabled(readSocketNotifierState);
         readSocketNotifierStateSet = false;
     }
     return true;



In the Thread backtrace you can see the thread is closed
------------------------ Backtrace Thread ------------------------------
Thread 17 (Thread 0x7f8fc0df3700 (LWP 5101)):
#0  0x00007f8fe0d397fd in QLocalePrivate::plus (this=0x7f8f9c010260) at 
tools/qlocale_p.h:228
No locals.
#1  0x00007f8fe0d363a0 in QLocalePrivate::unsLongLongToString 
(this=0x7f8f9c010260, l=15, precision=-1, base=10, width=-1, flags=0) at 
tools/qlocale.cpp:3036
No locals.
#2  0x00007f8fe0ddc0af in QTextStreamPrivate::putNumber 
(this=0x7f8f9c0140e0, number=15, negative=false) at io/qtextstream.cpp:2220
         flags = 0
         dd = 0x7f8f9c010260
         result = {static null = {<No data fields>}, d = 0x7f8fe0f5bd60 
<QArrayData::shared_null>}
         numberFlags = {i = 0}
         base = 10
#3  0x00007f8fe0ddc5f0 in QTextStream::operator<< (this=0x7f8f9c012420, 
i=15) at io/qtextstream.cpp:2296
         d = 0x7f8f9c0140e0
         __PRETTY_FUNCTION__ = "QTextStream& QTextStream::operator<<(int)"
#4  0x00007f8fe17463e3 in QDebug::operator<< (this=0x7f8fc0df1cd0, t=15) 
at /opt/Qt/5.1.1/include/QtCore/qdebug.h:107
No locals.
#5  0x00007f8fe17564f3 in Tufao::tDebug () at 
/home/zbenjamin/workspace.work/tufao/src/threadedhttprequestdispatcher.cpp:284
         t = 0xae1440
         __PRETTY_FUNCTION__ = "QDebug Tufao::tDebug()"
#6  0x00007f8fe175c819 in Tufao::WorkerThreadControl::onRequestClosed 
(this=0x7f8fc0df2d50) at 
/home/zbenjamin/workspace.work/tufao/src/priv/workerthreadcontrol.cpp:46
No locals.
#7  0x00007f8fe175c5bd in 
QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, 
void, void (Tufao::WorkerThreadControl::*)()>::call(void 
(Tufao::WorkerThreadControl::*)(), Tufao::WorkerThreadControl*, void**) 
(f=(void (Tufao::WorkerThreadControl::*)(Tufao::WorkerThreadControl * 
const)) 0x7f8fe175c800 <Tufao::WorkerThreadControl::onRequestClosed()>, 
o=0x7f8fc0df2d50, arg=0x7f8fc0df1f30) at 
/opt/Qt/5.1.1/include/QtCore/qobjectdefs_impl.h:508
No locals.
#8  0x00007f8fe175c550 in QtPrivate::FunctionPointer<void 
(Tufao::WorkerThreadControl::*)()>::call<QtPrivate::List<>, void>(void 
(Tufao::WorkerThreadControl::*)(), Tufao::WorkerThreadControl*, void**) 
(f=(void (Tufao::WorkerThreadControl::*)(Tufao::WorkerThreadControl * 
const)) 0x7f8fe175c800 <Tufao::WorkerThreadControl::onRequestClosed()>, 
o=0x7f8fc0df2d50, arg=0x7f8fc0df1f30) at 
/opt/Qt/5.1.1/include/QtCore/qobjectdefs_impl.h:527
No locals.
#9  0x00007f8fe175c4bd in QtPrivate::QSlotObject<void 
(Tufao::WorkerThreadControl::*)(), QtPrivate::List<>, void>::impl(int, 
QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) (which=1, 
this_=0x7f8f9c0132c0, r=0x7f8fc0df2d50, a=0x7f8fc0df1f30, ret=0x0) at 
/opt/Qt/5.1.1/include/QtCore/qobject_impl.h:147
No locals.
#10 0x00007f8fe0ecc69b in QtPrivate::QSlotObjectBase::call 
(this=0x7f8f9c0132c0, r=0x7f8fc0df2d50, a=0x7f8fc0df1f30) at 
../../include/QtCore/../../src/corelib/kernel/qobject_impl.h:130
No locals.
#11 0x00007f8fe0ec9a02 in QMetaObject::activate (sender=0xc48dd0, 
signalOffset=3, local_signal_index=3, argv=0x0) at kernel/qobject.cpp:3471
         obj = {d = 0x7f8f9c0132c0}
         receiverInSameThread = true
         sw = {receiver = 0x7f8fc0df2d50, previousSender = 0x0, 
currentSender = {sender = 0xc48dd0, signal = 6, ref = 1}, switched = true}
         callFunction = 0x7f8f9c0132c0
         receiver = 0x7f8fc0df2d50
         method_relative = 0
         c = 0x7f8f9c011680
         last = 0x7f8f9c011680
         locker = {val = 140255935355400}
         connectionLists = {connectionLists = 0x1144920}
         list = 0xeeb188
         signal_index = 6
         empty_argv = {0x0}
         currentThreadId = 0x7f8fc0df3700
         __PRETTY_FUNCTION__ = "static void 
QMetaObject::activate(QObject*, int, int, void**)"
#12 0x00007f8fe0ec934c in QMetaObject::activate (sender=0xc48dd0, 
m=0x7f8fe197e4a0 <Tufao::HttpServerRequest::staticMetaObject>, 
local_signal_index=3, argv=0x0) at kernel/qobject.cpp:3354
No locals.
#13 0x00007f8fe175d6c9 in Tufao::HttpServerRequest::close 
(this=0xc48dd0) at 
/home/zbenjamin/workspace.work/tufao-build/src/moc_httpserverrequest.cpp:193
No locals.
#14 0x00007f8fe175d39c in Tufao::HttpServerRequest::qt_static_metacall 
(_o=0xc48dd0, _c=QMetaObject::InvokeMetaMethod, _id=3, 
_a=0x7f8fc0df2120) at 
/home/zbenjamin/workspace.work/tufao-build/src/moc_httpserverrequest.cpp:93
         _t = 0xc48dd0
#15 0x00007f8fe0ec9afb in QMetaObject::activate (sender=0x11010b0, 
signalOffset=7, local_signal_index=2, argv=0x0) at kernel/qobject.cpp:3479
         receiverInSameThread = true
         sw = {receiver = 0xc48dd0, previousSender = 0x0, currentSender 
= {sender = 0x11010b0, signal = 9, ref = 1}, switched = true}
         callFunction = 0x7f8fe175d310 
<Tufao::HttpServerRequest::qt_static_metacall(QObject*, 
QMetaObject::Call, int, void**)>
         receiver = 0xc48dd0
         method_relative = 3
         c = 0xdefea0
         last = 0xe338e0
         locker = {val = 140255935355448}
         connectionLists = {connectionLists = 0x113e4e0}
         list = 0xbf3858
         signal_index = 9
         empty_argv = {0x0}
         currentThreadId = 0x7f8fc0df3700
         __PRETTY_FUNCTION__ = "static void 
QMetaObject::activate(QObject*, int, int, void**)"
#16 0x00007f8fe0ec934c in QMetaObject::activate (sender=0x11010b0, 
m=0x7f8fe16cd1e0 <QAbstractSocket::staticMetaObject>, 
local_signal_index=2, argv=0x0) at kernel/qobject.cpp:3354
No locals.
#17 0x00007f8fe142276d in QAbstractSocket::disconnected (this=0x11010b0) 
at .moc/debug-shared/moc_qabstractsocket.cpp:366
No locals.
#18 0x00007f8fe1421c42 in QAbstractSocket::disconnectFromHost 
(this=0x11010b0) at socket/qabstractsocket.cpp:2700
         d = 0xd30ab0
         previousState = QAbstractSocket::ClosingState
#19 0x00007f8fe141cce7 in QAbstractSocketPrivate::canReadNotification 
(this=0xd30ab0) at socket/qabstractsocket.cpp:701
         q = 0x11010b0
         rsncrollback = {varRef = @0xd30b88, oldValue = true}
         newBytes = 0
         hasData = false
#20 0x00007f8fe1420b8a in QAbstractSocket::waitForBytesWritten 
(this=0x11010b0, msecs=30000) at socket/qabstractsocket.cpp:2181
         readyToRead = true
         readyToWrite = true
         d = 0xd30ab0
         __PRETTY_FUNCTION__ = "virtual bool 
QAbstractSocket::waitForBytesWritten(int)"
         stopWatch = {t1 = 10161, t2 = 636117446}
#21 0x00007f8fe173b359 in Tufao::HttpFileServer::serveFile 
(fileName=..., request=..., response=...) at 
/home/zbenjamin/workspace.work/tufao/src/httpfileserver.cpp:243
         fileInfo = {d_ptr = {d = 0x7f8f9c012920}}
         file = {<QFileDevice> = {<QIODevice> = {<QObject> = 
{_vptr.QObject = 0x7f8fe133fc50 <vtable for QFile+16>, static 
staticMetaObject = {d = {superdata = 0x0, stringdata = 0x7f8fe1001520 
<qt_meta_stringdata_QObject>, data = 0x7f8fe1001640 
<qt_meta_data_QObject>, static_metacall = 0x7f8fe0ecbff4 
<QObject::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, 
relatedMetaObjects = 0x0, extradata = 0x0}}, d_ptr = {d = 
0x7f8f9c010cb0}, static staticQtMetaObject = {d = {superdata = 0x0, 
stringdata = 0x7f8fe104e220 <qt_meta_stringdata_Qt>, data = 
0x7f8fe1057c00 <qt_meta_data_Qt>, static_metacall = 0x0, 
relatedMetaObjects = 0x0, extradata = 0x0}}}, static staticMetaObject = 
{d = {superdata = 0x7f8fe133df20 <QObject::staticMetaObject>, stringdata 
= 0x7f8fe1061e40 <qt_meta_stringdata_QIODevice>, data = 0x7f8fe1061f40 
<qt_meta_data_QIODevice>, static_metacall = 0x7f8fe0f4f7a0 
<QIODevice::qt_static_metacall(QObject*, QMetaObject::Call, int, 
void**)>, relatedMetaObjects = 0x0, extradata = 0x0}}}, static 
staticMetaObject = {d = {superdata = 0x7f8fe133ff00 
<QIODevice::staticMetaObject>, stringdata = 0x7f8fe1061d40 
<qt_meta_stringdata_QFileDevice>, data = 0x7f8fe1061d80 
<qt_meta_data_QFileDevice>, static_metacall = 0x7f8fe0f4f6b4 
<QFileDevice::qt_static_metacall(QObject*, QMetaObject::Call, int, 
void**)>, relatedMetaObjects = 0x0, extradata = 0x0}}}, static 
staticMetaObject = {d = {superdata = 0x7f8fe133fd80 
<QFileDevice::staticMetaObject>, stringdata = 0x7f8fe1061c60 
<qt_meta_stringdata_QFile>, data = 0x7f8fe1061c80 <qt_meta_data_QFile>, 
static_metacall = 0x7f8fe0f4f5c8 <QFile::qt_static_metacall(QObject*, 
QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x0, extradata = 
0x0}}}
         ranges = {{p = {static shared_null = {ref = {atomic = {_q_value 
= -1}}, alloc = 0, begin = 0, end = 0, array = {0x0}}, d = 
0x7f8fe0f5e950 <QListData::shared_null>}, d = 0x7f8fe0f5e950 
<QListData::shared_null>}}
         __PRETTY_FUNCTION__ = "static void 
Tufao::HttpFileServer::serveFile(const QString&, 
Tufao::HttpServerRequest&, Tufao::HttpServerResponse&)"
#22 0x00007f8fe173d445 in Tufao::HttpFileServer::handleRequest 
(request=..., response=..., rootDir=...) at 
/home/zbenjamin/workspace.work/tufao/src/httpfileserver.cpp:373
         fileName = {static null = {<No data fields>}, d = 0x7f8f9c00fbf0}
#23 0x00007f8fe173c7b3 in Tufao::HttpFileServer::__lambda1::operator() 
(__closure=0x7f8f9c003530, request=..., response=...) at 
/home/zbenjamin/workspace.work/tufao/src/httpfileserver.cpp:347
         dir = {static null = {<No data fields>}, d = 0xae18a0}
#24 0x00007f8fe173ca0d in 
std::_Function_handler<bool(Tufao::HttpServerRequest&, 
Tufao::HttpServerResponse&), Tufao::HttpFileServer::handler(const 
QString&)::__lambda1>::_M_invoke(const std::_Any_data &, 
Tufao::HttpServerRequest &, Tufao::HttpServerResponse &) (__functor=..., 
__args#0=..., __args#1=...) at /usr/include/c++/4.8.1/functional:2057
No locals.
#25 0x00007f8fe173f64f in std::function<bool (Tufao::HttpServerRequest&, 
Tufao::HttpServerResponse&)>::operator()(Tufao::HttpServerRequest&, 
Tufao::HttpServerResponse&) const (this=0x7f8f9c0034a8, __args#0=..., 
__args#1=...) at /usr/include/c++/4.8.1/functional:2468
No locals.
#26 0x00007f8fe173e6e4 in Tufao::HttpServerRequestRouter::handleRequest 
(this=0x7f8f9c0013b0, request=..., response=...) at 
/home/zbenjamin/workspace.work/tufao/src/httpserverrequestrouter.cpp:96
         args = {<QList<QString>> = {{p = {static shared_null = {ref = 
{atomic = {_q_value = -1}}, alloc = 0, begin = 0, end = 0, array = 
{0x0}}, d = 0x7f8fe0f5e950 <QListData::shared_null>}, d = 0x7f8fe0f5e950 
<QListData::shared_null>}}, <No data fields>}
         backup = {d = {data = {c = 0 '\000', uc = 0 '\000', s = 0, sc = 
0 '\000', us = 0, i = 0, u = 0, l = 0, ul = 0, b = false, d = 0, f = 0, 
real = 0, ll = 0, ull = 0, o = 0x0, ptr = 0x0, shared = 0x0}, type = 0, 
is_shared = 0, is_null = 1}}
         match = {d = {d = 0x7f8f9c015860}}
         mapping = @0x7f8f9c003498: {path = {d = {d = 0x7f8f9c003240}}, 
method = {d = 0x7f8fe0f5bd60 <QArrayData::shared_null>}, handler = 
{<std::_Maybe_unary_or_binary_function<bool, Tufao::HttpServerRequest&, 
Tufao::HttpServerResponse&>> = 
{<std::binary_function<Tufao::HttpServerRequest&, 
Tufao::HttpServerResponse&, bool>> = {<No data fields>}, <No data 
fields>}, <std::_Function_base> = {static _M_max_size = 16, static 
_M_max_align = 8, _M_functor = {_M_unused = {_M_object = 0x7f8f9c003530, 
_M_const_object = 0x7f8f9c003530, _M_function_pointer = 0x7f8f9c003530, 
_M_member_pointer = (void 
(std::_Undefined_class::*)(std::_Undefined_class * const)) 
0x7f8f9c003530}, _M_pod_data = 
"05\000\234\217\177\000\000\000\000\000\000\000\000\000"}, _M_manager = 
0x7f8fe173ca16 
<std::_Function_base::_Base_manager<Tufao::HttpFileServer::handler(const 
QString&)::__lambda1>::_M_manager(std::_Any_data &, const std::_Any_data 
&, std::_Manager_operation)>}, _M_invoker = 0x7f8fe173c9be 
<std::_Function_handler<bool(Tufao::HttpServerRequest&, 
Tufao::HttpServerResponse&), Tufao::HttpFileServer::handler(const 
QString&)::__lambda1>::_M_invoke(const std::_Any_data &, 
Tufao::HttpServerRequest &, Tufao::HttpServerResponse &)>}}
         __for_range = @0x7f8f9c0013e0: {d = 0x7f8f9c003450}
         __for_begin = 0x7f8f9c003498
         __for_end = 0x7f8f9c0034f8
         path = {static null = {<No data fields>}, d = 0xde41c0}
#27 0x00007f8fe175bb87 in Tufao::WorkerThread::run (this=0xae1440) at 
/home/zbenjamin/workspace.work/tufao/src/priv/workerthread.cpp:117
         request = {wp = {d = 0x1151eb0, value = 0xc48dd0}}
         response = {wp = {d = 0x1064240, value = 0xe9e8a0}}
         handled = true
         customData = 0x7f8f9c0029a0
         handler = 0x7f8f9c0013c0
         controller = {<QObject> = {_vptr.QObject = 0x7f8fe197ec90 
<vtable for Tufao::WorkerThreadControl+16>, static staticMetaObject = {d 
= {superdata = 0x0, stringdata = 0x7f8fe1001520 
<qt_meta_stringdata_QObject>, data = 0x7f8fe1001640 
<qt_meta_data_QObject>, static_metacall = 0x7f8fe0ecbff4 
<QObject::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, 
relatedMetaObjects = 0x0, extradata = 0x0}}, d_ptr = {d = 
0x7f8f9c0033d0}, static staticQtMetaObject = {d = {superdata = 0x0, 
stringdata = 0x7f8fe104e220 <qt_meta_stringdata_Qt>, data = 
0x7f8fe1057c00 <qt_meta_data_Qt>, static_metacall = 0x0, 
relatedMetaObjects = 0x0, extradata = 0x0}}}, static staticMetaObject = 
{d = {superdata = 0x7f8fe133df20 <QObject::staticMetaObject>, stringdata 
= 0x7f8fe1765be0 <qt_meta_stringdata_Tufao__WorkerThreadControl>, data = 
0x7f8fe1765cc0 <qt_meta_data_Tufao__WorkerThreadControl>, 
static_metacall = 0x7f8fe175e550 
<Tufao::WorkerThreadControl::qt_static_metacall(QObject*, 
QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x0, extradata = 
0x0}}}
         __PRETTY_FUNCTION__ = "virtual void Tufao::WorkerThread::run()"
#28 0x00007f8fe0c99cec in QThreadPrivate::start (arg=0xae1440) at 
thread/qthread_unix.cpp:345
         __clframe = {__cancel_routine = 0x7f8fe0c99d80 
<QThreadPrivate::finish(void*)>, __cancel_arg = 0xae1440, __do_it = 1, 
__cancel_type = 0}
         thr = 0xae1440
         data = 0xae1600
         objectName = {static null = {<No data fields>}, d = 
0x7f8fe0f5bd60 <QArrayData::shared_null>}
#29 0x00007f8fe09e20a2 in start_thread () from /usr/lib/libpthread.so.0
No symbol table info available.
#30 0x00007f8fdfef7a2d in clone () from /usr/lib/libc.so.6
No symbol table info available.



In the main backtrace the receiver is accessed, but it belongs to 
another thread:

------------------------------------ Backtrace MAIN -------------------

Thread 1 (Thread 0x7f8fe1b5c740 (LWP 5077)):
#0  0x00007f8fe1002050 in typeinfo name for QObjectPrivate () from 
/opt/Qt/5.1.1/lib/libQt5Core.so.5
No symbol table info available.
#1  0x00007f8fe141cf33 in QAbstractSocketPrivate::canReadNotification 
(this=0xd30ab0) at socket/qabstractsocket.cpp:741
         q = 0x11010b0
         rsncrollback = {varRef = @0xd30b88, oldValue = false}
         newBytes = 76
         hasData = true
#2  0x00007f8fe1422e66 in QAbstractSocketPrivate::readNotification 
(this=0xd30ab0) at socket/qabstractsocket_p.h:77
No locals.
#3  0x00007f8fe140ece5 in QAbstractSocketEngine::readNotification 
(this=0x15a25d0) at socket/qabstractsocketengine.cpp:156
         receiver = 0xd30b80
#4  0x00007f8fe142b294 in QReadNotifier::event (this=0x15a25f0, 
e=0x7fff2d1ecce0) at socket/qnativesocketengine.cpp:1147
No locals.
#5  0x00007f8fe0e8a18c in QCoreApplicationPrivate::notify_helper 
(this=0xad7ae0, receiver=0x15a25f0, event=0x7fff2d1ecce0) at 
kernel/qcoreapplication.cpp:984
No locals.
#6  0x00007f8fe0e89e4e in QCoreApplication::notify (this=0x7fff2d1ed070, 
receiver=0x15a25f0, event=0x7fff2d1ecce0) at kernel/qcoreapplication.cpp:929
         d = 0xad7ae0
         __PRETTY_FUNCTION__ = "virtual bool 
QCoreApplication::notify(QObject*, QEvent*)"
#7  0x00007f8fe0e89d56 in QCoreApplication::notifyInternal 
(this=0x7fff2d1ed070, receiver=0x15a25f0, event=0x7fff2d1ecce0) at 
kernel/qcoreapplication.cpp:867
         threadData = 0xad7ba0
         loopLevelCounter = {threadData = 0xad7ba0}
         result = false
         cbdata = {0x15a25f0, 0x7fff2d1ecce0, 0x7fff2d1ecc6f}
         d = 0xf67e80
#8  0x00007f8fe0e8d8bb in QCoreApplication::sendEvent 
(receiver=0x15a25f0, event=0x7fff2d1ecce0) at 
../../include/QtCore/../../src/corelib/kernel/qcoreapplication.h:232
No locals.
#9  0x00007f8fe0ef94b0 in socketNotifierSourceDispatch (source=0xada340) 
at kernel/qeventdispatcher_glib.cpp:109
         p = 0x15a24e0
         i = 54
         event = {_vptr.QEvent = 0x7f8fe133ddf0 <vtable for QEvent+16>, 
static staticMetaObject = {d = {superdata = 0x0, stringdata = 
0x7f8fe10649a0 <qt_meta_stringdata_QEvent>, data = 0x7f8fe1066320 
<qt_meta_data_QEvent>, static_metacall = 0x0, relatedMetaObjects = 0x0, 
extradata = 0x0}}, d = 0x0, t = 50, posted = 0, spont = 0, m_accept = 1, 
reserved = 33}
         src = 0xada340
#10 0x00007f8fdeb6cd96 in g_main_context_dispatch () from 
/usr/lib/libglib-2.0.so.0
No symbol table info available.
#11 0x00007f8fdeb6d0e8 in ?? () from /usr/lib/libglib-2.0.so.0
No symbol table info available.
#12 0x00007f8fdeb6d18c in g_main_context_iteration () from 
/usr/lib/libglib-2.0.so.0
No symbol table info available.
#13 0x00007f8fe0efa163 in QEventDispatcherGlib::processEvents 
(this=0xad8df0, flags=...) at kernel/qeventdispatcher_glib.cpp:426
         d = 0xad8e10
         canWait = true
         savedFlags = {i = 0}
         result = false
#14 0x00007f8fe0e86ab6 in QEventLoop::processEvents 
(this=0x7fff2d1ecf80, flags=...) at kernel/qeventloop.cpp:136
         d = 0xb081b0
#15 0x00007f8fe0e86d99 in QEventLoop::exec (this=0x7fff2d1ecf80, 
flags=...) at kernel/qeventloop.cpp:212
         locker = {val = 11369632}
         __PRETTY_FUNCTION__ = "int 
QEventLoop::exec(QEventLoop::ProcessEventsFlags)"
         ref = {d = 0xb081b0, locker = @0x7fff2d1ecf00, exceptionCaught 
= true}
         app = 0x7fff2d1ed070
         d = 0xb081b0
#16 0x00007f8fe0e8a432 in QCoreApplication::exec () at 
kernel/qcoreapplication.cpp:1120
         threadData = 0xad7ba0
         __PRETTY_FUNCTION__ = "static int QCoreApplication::exec()"
         eventLoop = {<QObject> = {_vptr.QObject = 0x7f8fe1341670 
<vtable for QEventLoop+16>, static staticMetaObject = {d = {superdata = 
0x0, stringdata = 0x7f8fe1001520 <qt_meta_stringdata_QObject>, data = 
0x7f8fe1001640 <qt_meta_data_QObject>, static_metacall = 0x7f8fe0ecbff4 
<QObject::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, 
relatedMetaObjects = 0x0, extradata = 0x0}}, d_ptr = {d = 0xb081b0}, 
static staticQtMetaObject = {d = {superdata = 0x0, stringdata = 
0x7f8fe104e220 <qt_meta_stringdata_Qt>, data = 0x7f8fe1057c00 
<qt_meta_data_Qt>, static_metacall = 0x0, relatedMetaObjects = 0x0, 
extradata = 0x0}}}, static staticMetaObject = {d = {superdata = 
0x7f8fe133df20 <QObject::staticMetaObject>, stringdata = 0x7f8fe10644a0 
<qt_meta_stringdata_QEventLoop>, data = 0x7f8fe1064500 
<qt_meta_data_QEventLoop>, static_metacall = 0x7f8fe0f52aa0 
<QEventLoop::qt_static_metacall(QObject*, QMetaObject::Call, int, 
void**)>, relatedMetaObjects = 0x0, extradata = 0x0}}}
         returnCode = 32655
#17 0x00000000004036a4 in main (argc=1, argv=0x7fff2d1ed1e8) at 
../../../src/server/main.cpp:85
         a = {<QObject> = {_vptr.QObject = 0x7f8fe1341750 <vtable for 
QCoreApplication+16>, static staticMetaObject = {d = {superdata = 0x0, 
stringdata = 0x7f8fe1001520 <qt_meta_stringdata_QObject>, data = 
0x7f8fe1001640 <qt_meta_data_QObject>, static_metacall = 0x7f8fe0ecbff4 
<QObject::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, 
relatedMetaObjects = 0x0, extradata = 0x0}}, d_ptr = {d = 0xad7ae0}, 
static staticQtMetaObject = {d = {superdata = 0x0, stringdata = 
0x7f8fe104e220 <qt_meta_stringdata_Qt>, data = 0x7f8fe1057c00 
<qt_meta_data_Qt>, static_metacall = 0x0, relatedMetaObjects = 0x0, 
extradata = 0x0}}}, static staticMetaObject = {d = {superdata = 
0x7f8fe133df20 <QObject::staticMetaObject>, stringdata = 0x7f8fe1064620 
<qt_meta_stringdata_QCoreApplication>, data = 0x7f8fe1064840 
<qt_meta_data_QCoreApplication>, static_metacall = 0x7f8fe0f52bf8 
<QCoreApplication::qt_static_metacall(QObject*, QMetaObject::Call, int, 
void**)>, relatedMetaObjects = 0x0, extradata = 0x0}}, static self = 
0x7fff2d1ed070}
         server = {<QObject> = {_vptr.QObject = 0x7f8fe197f190 <vtable 
for Tufao::HttpServer+16>, static staticMetaObject = {d = {superdata = 
0x0, stringdata = 0x7f8fe1001520 <qt_meta_stringdata_QObject>, data = 
0x7f8fe1001640 <qt_meta_data_QObject>, static_metacall = 0x7f8fe0ecbff4 
<QObject::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, 
relatedMetaObjects = 0x0, extradata = 0x0}}, d_ptr = {d = 0xadb6e0}, 
static staticQtMetaObject = {d = {superdata = 0x0, stringdata = 
0x7f8fe104e220 <qt_meta_stringdata_Qt>, data = 0x7f8fe1057c00 
<qt_meta_data_Qt>, static_metacall = 0x0, relatedMetaObjects = 0x0, 
extradata = 0x0}}}, static staticMetaObject = {d = {superdata = 
0x7f8fe133df20 <QObject::staticMetaObject>, stringdata = 0x7f8fe1764b80 
<qt_meta_stringdata_Tufao__HttpServer>, data = 0x7f8fe1764d80 
<qt_meta_data_Tufao__HttpServer>, static_metacall = 0x7f8fe175d06e 
<Tufao::HttpServer::qt_static_metacall(QObject*, QMetaObject::Call, int, 
void**)>, relatedMetaObjects = 0x0, extradata = 0x0}}, priv = 0xadb760}
         pServer = {<Tufao::ThreadedHttpRequestDispatcher> = {<QObject> 
= {_vptr.QObject = 0x7f8fe197ea50 <vtable for 
Tufao::ThreadedHttpPluginServer+16>, static staticMetaObject = {d = 
{superdata = 0x0, stringdata = 0x7f8fe1001520 
<qt_meta_stringdata_QObject>, data = 0x7f8fe1001640 
<qt_meta_data_QObject>, static_metacall = 0x7f8fe0ecbff4 
<QObject::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, 
relatedMetaObjects = 0x0, extradata = 0x0}}, d_ptr = {d = 0xadc1f0}, 
static staticQtMetaObject = {d = {superdata = 0x0, stringdata = 
0x7f8fe104e220 <qt_meta_stringdata_Qt>, data = 0x7f8fe1057c00 
<qt_meta_data_Qt>, static_metacall = 0x0, relatedMetaObjects = 0x0, 
extradata = 0x0}}}, <Tufao::AbstractHttpServerRequestHandler> = 
{_vptr.AbstractHttpServerRequestHandler = 0x7f8fe197ead0 <vtable for 
Tufao::ThreadedHttpPluginServer+144>}, static staticMetaObject = {d = 
{superdata = 0x7f8fe133df20 <QObject::staticMetaObject>, stringdata = 
0x7f8fe1765fa0 
<qt_meta_stringdata_Tufao__ThreadedHttpRequestDispatcher>, data = 
0x7f8fe1766100 <qt_meta_data_Tufao__ThreadedHttpRequestDispatcher>, 
static_metacall = 0x7f8fe175ea76 
<Tufao::ThreadedHttpRequestDispatcher::qt_static_metacall(QObject*, 
QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x0, extradata = 
0x0}}, priv = 0xadbaa0}, static staticMetaObject = {d = {superdata = 
0x7f8fe197e7a0 <Tufao::ThreadedHttpRequestDispatcher::staticMetaObject>, 
stringdata = 0x7f8fe1765ec0 
<qt_meta_stringdata_Tufao__ThreadedHttpPluginServer>, data = 
0x7f8fe1765f40 <qt_meta_data_Tufao__ThreadedHttpPluginServer>, 
static_metacall = 0x7f8fe175e912 
<Tufao::ThreadedHttpPluginServer::qt_static_metacall(QObject*, 
QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x0, extradata = 
0x0}}}


------------------------------------------------------------------------------

Thats where the problem might be:


static gboolean socketNotifierSourceDispatch(GSource *source, 
GSourceFunc, gpointer)
{
     QEvent event(QEvent::SockAct);

     GSocketNotifierSource *src = reinterpret_cast<GSocketNotifierSource 
*>(source);
     for (int i = 0; i < src->pollfds.count(); ++i) {
         GPollFDWithQSocketNotifier *p = src->pollfds.at(i);

         if ((p->pollfd.revents & p->pollfd.events) != 0)
             QCoreApplication::sendEvent(p->socketNotifier, &event);
     }

     return true; // ??? don't remove, right?
}

sendEvent is used, but the receiver is in another thread, shouldn't it
use postEvent or better shouldn't the threads eventloop do this stuff?
As a note: the threads eventloop is not running when the crash occurs,
maybe thats related to it somehow? Is the QObject only moved competely
to the thread when its eventloop was started?

I'm on Linux, Qt 5.1.1 gcc




More information about the Interest mailing list