qeventdispatcher_unix.cpp

Absolute File Name:/home/qt/qt5_coco/qt5/qtbase/src/corelib/kernel/qeventdispatcher_unix.cpp
Switch to Source codePreprocessed file
LineSourceCount
1-
2-
3-
4-
5-
6-
7-
8-
9-
10-
11-
QEventDispatcherUNIXPrivatestatic const char *socketType(QSocketNotifier::QEventDispatcherUNIXPrivate()Type type)
13{-
14 extern Qtswitch (type) {-
15 case
never executed: case QSocketNotifier::Read:
QSocketNotifier
never executed: case QSocketNotifier::Read:
::HANDLE qt_application_thread_idRead:
never executed: case QSocketNotifier::Read:
0
16 return
never executed: return "Read";
"Read"
never executed: return "Read";
never executed: return "Read";
;
never executed: return "Read";
0
17 mainThread = (QThreadcase
never executed: case QSocketNotifier::Write:
never executed: case QSocketNotifier::Write:
QSocketNotifier::currentThreadIdWrite:
never executed: case QSocketNotifier::Write:
0
18 return
never executed: return "Write";
"Write";
never executed: return "Write";
0
19 case
never executed: case QSocketNotifier::Exception:
QSocketNotifier::Exception:
never executed: case QSocketNotifier::Exception:
0
20 return
never executed: return "Exception";
"Exception";
never executed: return "Exception";
0
21 }-
22-
23 do { ((!(false)) ? qt_assert_x("Q_UNREACHABLE()== qt_application_thread_id", "Q_UNREACHABLE was reached",__FILE__,89) : qt_noop()); __builtin_unreachable(); } while (0);-
bool pipefail}
never executed: end of block
25-
26QThreadPipe::QThreadPipe()-
27{-
28 fds[0] = false-1;-
29 thread_pipefds[01] = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);-1;-
30-
31-
32-
33}
never executed: end of block
0
34-
35QThreadPipe::~QThreadPipe()-
36{-
37 if (thread_pipefds
fds[0] >= 0Description
TRUEnever evaluated
FALSEnever evaluated
[0] != ->= 0
fds[0] >= 0Description
TRUEnever evaluated
FALSEnever evaluated
)
0
38 close(fds[0]);
never executed: close(fds[0]);
0
39-
40 if (fds[
fds[1] >= 0Description
TRUEnever evaluated
FALSEnever evaluated
fds[1] >= 0Description
TRUEnever evaluated
FALSEnever evaluated
1] >= 0
fds[1] >= 0Description
TRUEnever evaluated
FALSEnever evaluated
)
0
41 thread_pipeclose(fds
never executed: close(fds[1]);
[1]);
never executed: close(fds[1]);
0
42-
43-
44-
45-
46}
never executed: end of block
0
47bool QThreadPipe::init()-
48{-
49 if ((
(fds[0] = even...CLOEXEC)) >= 0Description
TRUEnever evaluated
FALSEnever evaluated
fds[0
(fds[0] = even...CLOEXEC)) >= 0Description
TRUEnever evaluated
FALSEnever evaluated
(fds[0] = even...CLOEXEC)) >= 0Description
TRUEnever evaluated
FALSEnever evaluated
] = -1eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC)) >= 0
(fds[0] = even...CLOEXEC)) >= 0Description
TRUEnever evaluated
FALSEnever evaluated
)
0
50 return
never executed: return true;
true
never executed: return true;
never executed: return true;
;
never executed: return true;
0
51-
52 elseif (qt_safe_pipe(thread_pipefds, 04000) == -1
qt_safe_pipe(fds, 04000) == -1Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
53 perror("QEventDispatcherUNIXPrivate():"QThreadPipe: Unable to create thread pipe");-
54 pipefail = truereturn
never executed: return false;
never executed: return false;
false;
never executed: return false;
0
55 }-
56-
57-
58 if (pipefail)0
QMessageLogger(__FILE__, 139, __PRETTY_FUNCTION__).fatal("QEventDispatcherUNIXPrivate(): Can not continue without a thread pipe");
sn_highest = -1return
never executed: return true;
never executed: return true;
true;
never executed: return true;
59}-
60-
QEventDispatcherUNIXPrivate::~QEventDispatcherUNIXPrivatepollfd QThreadPipe::prepare() const
62{-
63 closereturn
never executed: return qt_make_pollfd(fds[0], 0x001);
never executed: return qt_make_pollfd(fds[0], 0x001);
qt_make_pollfd(thread_pipefds[0]);
never executed: return qt_make_pollfd(fds[0], 0x001);
0
if (thread_pipe[1] != -1)
never executed: return qt_make_pollfd(fds[0], 0x001);
close(thread_pipe[1]);
never executed: return qt_make_pollfd(fds[0], 0x001);
qDeleteAll(timerList
never executed: return qt_make_pollfd(fds[0], 0x001);
never executed: return qt_make_pollfd(fds[0], 0x001);
], 0x001);
never executed: return qt_make_pollfd(fds[0], 0x001);
64}-
65-
int QEventDispatcherUNIXPrivate::doSelect(QEventLoopvoid QThreadPipe::ProcessEventsFlags flags, timespec *timeout)
{
QEventDispatcherUNIX * const q = q_func();
timerList.updateCurrentTime();
int nsel;
dowakeUp()
67{-
68 int highest = 0;if (!(flags & QEventLoop::ExcludeSocketNotifiers) &&wakeUps.testAndSetAcquire
wakeUps.testAn...tAcquire(0, 1)Description
TRUEnever evaluated
FALSEnever evaluated
(sn_highest >=0, 1)
wakeUps.testAn...tAcquire(0, 1)Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
69-
70 sn_vec[0].select_fds = sn_vec[0].enabled_fds;0
sn_vecif (fds
fds[1] == -1Description
TRUEnever evaluated
FALSEnever evaluated
[1].select_fds = sn_vec[] == -1].enabled_fds;
fds[1] == -1Description
TRUEnever evaluated
FALSEnever evaluated
sn_vec[2].select_fds
fds[1] == -1Description
TRUEnever evaluated
FALSEnever evaluated
) {
71-
72 eventfd_t value = sn_vec[2].enabled_fds1;-
73 highest = sn_highestint ret;-
74 } else {do { int __d0, __d1; __asm__ __volatile__ ("cld; rep; " "stosq" : "=c" (__d0), "ret = D" (__d1) : "a" (0), "0" (sizeof (fd_set) / sizeof (__fd_mask)), "1"eventfd_write(&((&sn_vecfds[0].select_fds)->fds_bits)[0]) : "memory"], value); }
never executed: end of block
while (0ret == -1
ret == -1Description
TRUEnever evaluated
FALSEnever evaluated
&& (*
(*__errno_location ()) == 4Description
TRUEnever evaluated
FALSEnever evaluated
__errno_location ()) == 4
(*__errno_location ()) == 4Description
TRUEnever evaluated
FALSEnever evaluated
);
0
75 do { int __d0, __d1; __asm__ __volatile__ ("cld; repreturn
never executed: return;
;
never executed: return;
0
76 " "stosq" : "=c" (__d0), "}-
77-
78 char c = D" (__d1) : "a" (0), "0" (sizeof (fd_set) / sizeof (__fd_mask)), "1";-
79 qt_safe_write(&((&sn_vecfds[1].select_fds)->fds_bits)[0]) : "memory"], &c, 1);-
80 }
never executed: end of block
0
while}
never executed: end of block
82-
83int QThreadPipe::check(0);-
doconst pollfd &pfd)
84{-
85 int __d0, __d1; __asm__ __volatile__((!(pfd.fd == fds[0])) ? qt_assert("cld; rep; " "stosq" :"pfd.fd "=c" (__d0),== fds[0]"=D" (__d1,__FILE__,192) : "a" (0), "0" (sizeofqt_noop());-
86-
87 char c[16];-
88 const int readyread = pfd.revents & 0x001;-
89-
90 if (fd_setreadyread
readyreadDescription
TRUEnever evaluated
FALSEnever evaluated
) / sizeof{
0
91-
92-
93-
94-
95-
96-
97-
98 if (__fd_mask)), "1"fds[1] == -1
fds[1] == -1Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
99-
100 eventfd_t value;-
101 eventfd_read(&((&sn_vecfds[2].select_fds)->fds_bits)[0]) : "memory"], &value);-
102 }
never executed: end of block
else
0
103-
104 {-
105 while (::
::read(fds[0],...sizeof(c)) > 0Description
TRUEnever evaluated
FALSEnever evaluated
::read(fds[0],...sizeof(c)) > 0Description
TRUEnever evaluated
FALSEnever evaluated
read(fds[0);
::read(fds[0],...sizeof(c)) > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
}
::read(fds[0],...sizeof(c)) > 0Description
TRUEnever evaluated
FALSEnever evaluated
int wakeUpFd = initThreadWakeUp();
::read(fds[0],...sizeof(c)) > 0Description
TRUEnever evaluated
FALSEnever evaluated
highest = qMax(highest
::read(fds[0],...sizeof(c)) > 0Description
TRUEnever evaluated
FALSEnever evaluated
::read(fds[0],...sizeof(c)) > 0Description
TRUEnever evaluated
FALSEnever evaluated
], c, wakeUpFd);
::read(fds[0],...sizeof(c)) > 0Description
TRUEnever evaluated
FALSEnever evaluated
nsel = q->select
::read(fds[0],...sizeof(c)) > 0Description
TRUEnever evaluated
FALSEnever evaluated
::read(fds[0],...sizeof(c)) > 0Description
TRUEnever evaluated
FALSEnever evaluated
sizeof(highest + 1,
::read(fds[0],...sizeof(c)) > 0Description
TRUEnever evaluated
FALSEnever evaluated
&sn_vec[
::read(fds[0],...sizeof(c)) > 0Description
TRUEnever evaluated
FALSEnever evaluated
::read(fds[0],...sizeof(c)) > 0Description
TRUEnever evaluated
FALSEnever evaluated
c)) > 0].select_fds,
::read(fds[0],...sizeof(c)) > 0Description
TRUEnever evaluated
FALSEnever evaluated
&sn_vec[1].select_fds,
::read(fds[0],...sizeof(c)) > 0Description
TRUEnever evaluated
FALSEnever evaluated
&sn_vec[2].select_fds,
::read(fds[0],...sizeof(c)) > 0Description
TRUEnever evaluated
FALSEnever evaluated
timeout);
::read(fds[0],...sizeof(c)) > 0Description
TRUEnever evaluated
FALSEnever evaluated
) {}
never executed: end of block
106 }
never executed: end of block
0
107-
108-
109 while (nsel == -1 && ((*__errno_location ()) == 4 || (*__errno_location ()) == 11));if (!wakeUps.testAndSetRelease
!wakeUps.testA...tRelease(1, 0)Description
TRUEnever evaluated
FALSEnever evaluated
(nsel == -1) {
!wakeUps.testA...tRelease(1, 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
if ((*__errno_location ()) == 9)
!wakeUps.testA...tRelease(1, 0)Description
TRUEnever evaluated
FALSEnever evaluated
!wakeUps.testA...tRelease(1, 0)Description
TRUEnever evaluated
FALSEnever evaluated
, 0)
!wakeUps.testA...tRelease(1, 0)Description
TRUEnever evaluated
FALSEnever evaluated
) {
110-
111 fd_set fdset;-
timeval tm;
tm.tv_sec = tmQMessageLogger(__FILE__, 218, __PRETTY_FUNCTION__).warning("QThreadPipe: internal error, wakeUps.tv_usec = 0l;
fortestAndSetRelease(int type =1, 0; type < 3; ++type){
QSockNotType::List &list = sn_vec[type].list failed!");
112 }
never executed: end of block
0
113 }
never executed: end of block
0
114-
115 return
never executed: return readyread;
readyread
never executed: return readyread;
never executed: return readyread;
;
never executed: return readyread;
0
116}-
117-
118QEventDispatcherUNIXPrivate::QEventDispatcherUNIXPrivate()-
119{-
120 if (list__builtin_expect(!!(threadPipe
__builtin_expe...false), false)Description
TRUEnever evaluated
FALSEnever evaluated
.sizeinit() == 0)
__builtin_expe...false), false)Description
TRUEnever evaluated
FALSEnever evaluated
0
continue;
__builtin_expe...false), false)Description
TRUEnever evaluated
FALSEnever evaluated
for
__builtin_expe...false), false)Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_expe...false), false)Description
TRUEnever evaluated
FALSEnever evaluated
false), false)
__builtin_expe...false), false)Description
TRUEnever evaluated
FALSEnever evaluated
)
121 QMessageLogger
never executed: QMessageLogger(__FILE__, 228, __PRETTY_FUNCTION__).fatal("QEventDispatcherUNIXPrivate(): Can not continue without a thread pipe");
never executed: QMessageLogger(__FILE__, 228, __PRETTY_FUNCTION__).fatal("QEventDispatcherUNIXPrivate(): Can not continue without a thread pipe");
(int i = 0; i < list.size(); ++i) {
never executed: QMessageLogger(__FILE__, 228, __PRETTY_FUNCTION__).fatal("QEventDispatcherUNIXPrivate(): Can not continue without a thread pipe");
0
QSockNot *sn = list[i];
never executed: QMessageLogger(__FILE__, 228, __PRETTY_FUNCTION__).fatal("QEventDispatcherUNIXPrivate(): Can not continue without a thread pipe");
do { int __d0
never executed: QMessageLogger(__FILE__, 228, __PRETTY_FUNCTION__).fatal("QEventDispatcherUNIXPrivate(): Can not continue without a thread pipe");
never executed: QMessageLogger(__FILE__, 228, __PRETTY_FUNCTION__).fatal("QEventDispatcherUNIXPrivate(): Can not continue without a thread pipe");
__FILE__, __d1; __asm__ __volatile__228, __PRETTY_FUNCTION__).fatal("cld; rep; ""QEventDispatcherUNIXPrivate(): "stosq" :Can "=c" (__d0),not "=D" (__d1) :continue "a" (0),without "0" (sizeof (fd_set) / sizeof (__fd_mask)),a "1" (&((&fdset)->fds_bits)[0]) :thread "memory"pipe");
never executed: QMessageLogger(__FILE__, 228, __PRETTY_FUNCTION__).fatal("QEventDispatcherUNIXPrivate(): Can not continue without a thread pipe");
122}
never executed: end of block
0
123-
whileQEventDispatcherUNIXPrivate::~QEventDispatcherUNIXPrivate()
125{-
126-
127 qDeleteAll(0timerList);-
((}
never executed: end of block
129-
130void ) (((&fdset)->fds_bits)[((sn->fd) /QEventDispatcherUNIXPrivate::setSocketNotifierPending(8QSocketNotifier *(intnotifier)-
sizeof{
132 ((!(notifier)) ? qt_assert(__fd_mask)))] |= ((__fd_mask) 1 << ((sn->fd"notifier",__FILE__,239) % (8 *: qt_noop());-
133-
134 if (int) sizeofpendingNotifiers.contains
pendingNotifie...ains(notifier)Description
TRUEnever evaluated
FALSEnever evaluated
(__fd_mask))))));
pendingNotifie...ains(notifier)Description
TRUEnever evaluated
FALSEnever evaluated
0
int ret = -1
pendingNotifie...ains(notifier)Description
TRUEnever evaluated
FALSEnever evaluated
pendingNotifie...ains(notifier)Description
TRUEnever evaluated
FALSEnever evaluated
notifier)
pendingNotifie...ains(notifier)Description
TRUEnever evaluated
FALSEnever evaluated
)
135 return
never executed: return;
never executed: return;
never executed: return;
;
never executed: return;
0
136-
137 dopendingNotifiers << notifier;-
138}
never executed: end of block
0
139-
140int QEventDispatcherUNIXPrivate::activateTimers()-
141{-
142 switch (type)return
never executed: return timerList.activateTimers();
never executed: return timerList.activateTimers();
timerList.activateTimers();
never executed: return timerList.activateTimers();
0
143}-
144-
145void QEventDispatcherUNIXPrivate::markPendingSocketNotifiers()-
146{-
147 case 0for (const pollfd &pfd : ret = selectqAsConst(sn->pollfds)) {-
148 if (pfd.
pfd.fd < 0Description
TRUEnever evaluated
FALSEnever evaluated
pfd.fd < 0Description
TRUEnever evaluated
FALSEnever evaluated
fd + 1, &fdset,< 0
pfd.fd < 0Description
TRUEnever evaluated
FALSEnever evaluated
,|| pfd.revents ==
pfd.revents == 0Description
TRUEnever evaluated
FALSEnever evaluated
0, &tm);
pfd.revents == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
break
pfd.revents == 0Description
TRUEnever evaluated
FALSEnever evaluated
)
149 continue
never executed: continue;
never executed: continue;
never executed: continue;
;
never executed: continue;
0
150-
151 case 1:-
retauto it = selectsocketNotifiers.find(sn->pfd.fd+ 1, 0, &fdset);
152 ((!(it != socketNotifiers.end())) ? qt_assert("it != socketNotifiers.end()",0__FILE__,&tm);-
break;
case 2259) : retqt_noop());
153-
154 const QSocketNotifierSetUNIX &sn_set = select(sn->fd + 1, 0it.value();-
155-
156 static const struct {-
157 QSocketNotifier::Type type;-
158 short flags;-
159 } notifiers[] = {-
160 { QSocketNotifier::Read, 00x001 | 0x010 | 0x008 },-
161 { QSocketNotifier::Write, &fdset0x004 | 0x010 | 0x008 },-
162 { QSocketNotifier::Exception, &tm);-
break;
}0x002 | 0x010 | 0x008 }
163 while (ret == -1 && ((*__errno_location ()) == 4 || (*__errno_location ()) == 11));-
if};
164-
165 for (ret == -1 && (*__errno_location ()) == 9const auto &n : notifiers) {-
166 static const charQSocketNotifier *t[]notifier = sn_set.notifiers[n.type];-
167-
168 if (!notifier
!notifierDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
169 continue;
never executed: continue;
0
170-
171 if (pfd.revents & 0x020
pfd.revents & 0x020Description
TRUEnever evaluated
FALSEnever evaluated
)
{
0
172 "Read", "Write", "Exception" };QMessageLogger(__FILE__, 236279, __PRETTY_FUNCTION__).warning("QSocketNotifier: Invalid socket %d andwith type '%s'%s, disabling...",-
sn->fd,
173 t[it.key(), socketType(n.type]);-
sn->obj));
174 notifier->setEnabled(false);-
}
}
}
} else {
perror("select");
175 }}
never executed: end of block
0
176-
177 int nevents = processThreadWakeUp(nsel);if (! (flags & QEventLoop::ExcludeSocketNotifiers) && nsel > 0 && sn_highest >= 0) {0
for (int i=0; i<3; i++) {
QSockNotType::List &list = sn_vec[i].list;
for(int j = 0; j < listpfd
pfd.revents & n.flagsDescription
TRUEnever evaluated
FALSEnever evaluated
.size(); ++j) {
pfd.revents & n.flagsDescription
TRUEnever evaluated
FALSEnever evaluated
QSockNot *sn = list[j];
pfd.revents & n.flagsDescription
TRUEnever evaluated
FALSEnever evaluated
if (((((&sn_vec[i].select_fds)->fds_bits)[((sn->fd) / (8 * (int) sizeof (__fd_mask)))]
pfd.revents & n.flagsDescription
TRUEnever evaluated
FALSEnever evaluated
pfd.revents & n.flagsDescription
TRUEnever evaluated
FALSEnever evaluated
revents & ((__fd_mask) 1 << ((sn->fd) % (8 * (intn.flags
pfd.revents & n.flagsDescription
TRUEnever evaluated
FALSEnever evaluated
)
178 sizeof (__fd_mask))))) != 0))0
q->setSocketNotifierPending(sn->objnotifier);
never executed: setSocketNotifierPending(notifier);
179 }}
never executed: end of block
0
180 }
never executed: end of block
0
181-
182 return (nevents + q->activateSocketNotifiers());pollfds.clear();-
183}
never executed: end of block
0
184-
185int QEventDispatcherUNIXPrivate::initThreadWakeUpactivateSocketNotifiers()-
{
((void) (((&sn_vec[0].select_fds)->fds_bits)[((thread_pipe[0]) / (8 * (int) sizeof (__fd_mask)))] |= ((__fd_mask) 1 << ((thread_pipe[0]) % (8 * (int) sizeof (__fd_mask))))));
return thread_pipe[0];
}
int QEventDispatcherUNIXPrivate::processThreadWakeUp(int nsel){
187 markPendingSocketNotifiers();-
188-
189 if (nsel > 0 && ((((&sn_vec[0].select_fds)->fds_bits)[((thread_pipe[0]) / (8 * (int) sizeof(__fd_mask)))] & ((__fd_mask) 1 << ((thread_pipe[pendingNotifiers.isEmpty()
pendingNotifiers.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
190 return
never executed: return 0;
never executed: return 0;
never executed: return 0;
0]) % (8 * (;
never executed: return 0;
0
191-
192 int ) sizeof (__fd_mask))))) !=n_activated = 0)) {-
if (thread_pipe[1] == -1) {
eventfd_t value;
193 eventfd_readQEvent event(thread_pipe[0], &valueQEvent::SockAct);-
194-
195 } else0
{
char c[16];while (::read(thread_pipe[0], c, sizeof(c)) > 0) {
}
}
if(!wakeUpspendingNotifiers.testAndSetRelease(1, 0))isEmpty()
!pendingNotifiers.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
) {
196 QMessageLogger(__FILE__, 298, __PRETTY_FUNCTION__).warning("QEventDispatcherUNIX: internal error, wakeUpsQSocketNotifier *notifier = pendingNotifiers.testAndSetReleasetakeFirst();-
197 QCoreApplication::sendEvent(1notifier, 0) failed!"&event);-
198 }-
return 1++n_activated;
199 }
never executed: end of block
0
200-
201 return
never executed: return n_activated;
0n_activated;
never executed: return n_activated;
0
202}-
203-
204QEventDispatcherUNIX::QEventDispatcherUNIX(QObject *parent)-
205 : QAbstractEventDispatcher(*new QEventDispatcherUNIXPrivate, parent)-
206{ }-
207-
208QEventDispatcherUNIX::QEventDispatcherUNIX(QEventDispatcherUNIXPrivate &dd, QObject *parent)-
209 : QAbstractEventDispatcher(dd, parent)-
210{ }-
211-
212QEventDispatcherUNIX::~QEventDispatcherUNIX()-
{
}
int QEventDispatcherUNIX::select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
timespec *timeout){ return qt_safe_select(nfds, readfds, writefds, exceptfds, timeout);}
214-
215-
216-
217-
218void QEventDispatcherUNIX::registerTimer(int timerId, int interval, Qt::TimerType timerType, QObject *obj)-
219{-
220-
221 if (timerId < 1 || interval < 0 || !obj) {-
222 QMessageLogger(__FILE__, 330329, __PRETTY_FUNCTION__).warning("QEventDispatcherUNIX::registerTimer: invalid arguments");-
223 return;-
224 } else if (obj->thread() != thread() || thread() != QThread::currentThread()) {-
225 QMessageLogger(__FILE__, 333332, __PRETTY_FUNCTION__).warning("QEventDispatcherUNIX::registerTimer: timers cannot be started from another thread");-
226 return;-
227 }-
228-
229-
230 QEventDispatcherUNIXPrivate * const d = d_func();-
231 d->timerList.registerTimer(timerId, interval, timerType, obj);-
232}-
233-
234-
235-
236-
237bool QEventDispatcherUNIX::unregisterTimer(int timerId)-
238{-
239-
240 if (timerId < 1) {-
241 QMessageLogger(__FILE__, 349348, __PRETTY_FUNCTION__).warning("QEventDispatcherUNIX::unregisterTimer: invalid argument");-
242 return false;-
243 } else if (thread() != QThread::currentThread()) {-
244 QMessageLogger(__FILE__, 352351, __PRETTY_FUNCTION__).warning("QEventDispatcherUNIX::unregisterTimer: timers cannot be stopped from another thread");-
245 return false;-
246 }-
247-
248-
249 QEventDispatcherUNIXPrivate * const d = d_func();-
250 return d->timerList.unregisterTimer(timerId);-
251}-
252-
253-
254-
255-
256bool QEventDispatcherUNIX::unregisterTimers(QObject *object)-
257{-
258-
259 if (!object) {-
260 QMessageLogger(__FILE__, 368367, __PRETTY_FUNCTION__).warning("QEventDispatcherUNIX::unregisterTimers: invalid argument");-
261 return false;-
262 } else if (object->thread() != thread() || thread() != QThread::currentThread()) {-
263 QMessageLogger(__FILE__, 371370, __PRETTY_FUNCTION__).warning("QEventDispatcherUNIX::unregisterTimers: timers cannot be stopped from another thread");-
264 return false;-
265 }-
266-
267-
268 QEventDispatcherUNIXPrivate * const d = d_func();-
269 return d->timerList.unregisterTimers(object);-
270}-
271-
272QList<QEventDispatcherUNIX::TimerInfo>-
273QEventDispatcherUNIX::registeredTimers(QObject *object) const-
274{-
275 if (!object) {-
276 QMessageLogger(__FILE__, 384383, __PRETTY_FUNCTION__).warning("QEventDispatcherUNIX:registeredTimers: invalid argument");-
277 return QList<TimerInfo>();-
278 }-
279-
280 const QEventDispatcherUNIXPrivate * const d = d_func();-
281 return d->timerList.registeredTimers(object);-
}
QSockNotType::QSockNotType()
{
do { int __d0, __d1; __asm__ __volatile__ ("cld; rep; " "stosq" : "=c" (__d0), "=D" (__d1) : "a" (0), "0" (sizeof (fd_set) / sizeof (__fd_mask)), "1" (&((&select_fds)->fds_bits)[0]) : "memory"); } while (0);
do { int __d0, __d1; __asm__ __volatile__ ("cld; rep; " "stosq" : "=c" (__d0), "=D" (__d1) : "a" (0), "0" (sizeof (fd_set) / sizeof (__fd_mask)), "1" (&((&enabled_fds)->fds_bits)[0]) : "memory"); } while (0);
do { int __d0, __d1; __asm__ __volatile__ ("cld; rep; " "stosq" : "=c" (__d0), "=D" (__d1) : "a" (0), "0" (sizeof (fd_set) / sizeof (__fd_mask)), "1" (&((&pending_fds)->fds_bits)[0]) : "memory"); } while (0);
}
QSockNotType::~QSockNotType()
{
for (int i = 0; i < list.size(); ++i)
delete list[i];}
283-
284-
285-
286-
287-
288void QEventDispatcherUNIX::registerSocketNotifier(QSocketNotifier *notifier)-
289{-
290 ((!(notifier)) ? qt_assert("notifier",__FILE__,414397) : qt_noop());-
291 int sockfd = notifier->socket();-
292 intQSocketNotifier::Type type = notifier->type();-
293-
294 if (sockfd < 00
|| unsigned(sockfd) >= 1024) {
QMessageLogger(__FILE__, 420, __PRETTY_FUNCTION__).warning("QSocketNotifier: Internal error");
return;
} elseif (notifier->thread() != thread()
notifier->thread() != thread()Description
TRUEnever evaluated
FALSEnever evaluated
|| thread() != QThread::currentThread()
thread() != QT...urrentThread()Description
TRUEnever evaluated
FALSEnever evaluated
) {
295 QMessageLogger(__FILE__, 424402, __PRETTY_FUNCTION__).warning("QSocketNotifier: socket notifiers cannot be enabled from another thread");-
296 return;
never executed: return;
0
297 }-
298-
299-
300 QEventDispatcherUNIXPrivate * const d = d_func();-
301 QSockNotType::List &listQSocketNotifierSetUNIX &sn_set = d->sn_vec[type].list;-
fd_set *fds = &d->sn_vecsocketNotifiers[type].enabled_fds;
QSockNot *sn;
sn = new QSockNot;
sn->obj = notifier;
sn->fd =sockfd;
sn->queue = &d->sn_vec];
302-
303 if (sn_set.notifiers
sn_set.notifiers[type]Description
TRUEnever evaluated
FALSEnever evaluated
sn_set.notifiers[type]Description
TRUEnever evaluated
FALSEnever evaluated
[type].pending_fds;
sn_set.notifiers[type]Description
TRUEnever evaluated
FALSEnever evaluated
0
int i;
sn_set.notifiers[type]Description
TRUEnever evaluated
FALSEnever evaluated
for (i = 0; i < list
sn_set.notifiers[type]Description
TRUEnever evaluated
FALSEnever evaluated
sn_set.notifiers[type]Description
TRUEnever evaluated
FALSEnever evaluated
]
sn_set.notifiers[type]Description
TRUEnever evaluated
FALSEnever evaluated
&& sn_set
sn_set.notifie...e] != notifierDescription
TRUEnever evaluated
FALSEnever evaluated
.size(); ++i) {
sn_set.notifie...e] != notifierDescription
TRUEnever evaluated
FALSEnever evaluated
QSockNot *p = list
sn_set.notifie...e] != notifierDescription
TRUEnever evaluated
FALSEnever evaluated
sn_set.notifie...e] != notifierDescription
TRUEnever evaluated
FALSEnever evaluated
notifiers[i];
sn_set.notifie...e] != notifierDescription
TRUEnever evaluated
FALSEnever evaluated
if (p->fd < sockfd)
sn_set.notifie...e] != notifierDescription
TRUEnever evaluated
FALSEnever evaluated
break;
sn_set.notifie...e] != notifierDescription
TRUEnever evaluated
FALSEnever evaluated
if (p->fd == sockfd
sn_set.notifie...e] != notifierDescription
TRUEnever evaluated
FALSEnever evaluated
sn_set.notifie...e] != notifierDescription
TRUEnever evaluated
FALSEnever evaluated
type] != notifier
sn_set.notifie...e] != notifierDescription
TRUEnever evaluated
FALSEnever evaluated
)
304 {0
static const char *t[] = { "Read", "Write", "Exception" };QMessageLogger(__FILE__, 446411, __PRETTY_FUNCTION__).warning("QSocketNotifier"%s: Multiple socket notifiers for"
never executed: QMessageLogger(__FILE__, 411, __PRETTY_FUNCTION__).warning("%s: Multiple socket notifiers for same socket %d and type %s", __PRETTY_FUNCTION__, sockfd, socketType(type));
"same
never executed: QMessageLogger(__FILE__, 411, __PRETTY_FUNCTION__).warning("%s: Multiple socket notifiers for same socket %d and type %s", __PRETTY_FUNCTION__, sockfd, socketType(type));
never executed: QMessageLogger(__FILE__, 411, __PRETTY_FUNCTION__).warning("%s: Multiple socket notifiers for same socket %d and type %s", __PRETTY_FUNCTION__, sockfd, socketType(type));
same socket %d and type %s",
never executed: QMessageLogger(__FILE__, 411, __PRETTY_FUNCTION__).warning("%s: Multiple socket notifiers for same socket %d and type %s", __PRETTY_FUNCTION__, sockfd, socketType(type));
305 __PRETTY_FUNCTION__
never executed: QMessageLogger(__FILE__, 411, __PRETTY_FUNCTION__).warning("%s: Multiple socket notifiers for same socket %d and type %s", __PRETTY_FUNCTION__, sockfd, socketType(type));
never executed: QMessageLogger(__FILE__, 411, __PRETTY_FUNCTION__).warning("%s: Multiple socket notifiers for same socket %d and type %s", __PRETTY_FUNCTION__, sockfd, socketType(type));
, sockfd, t[socketType(type]);
never executed: QMessageLogger(__FILE__, 411, __PRETTY_FUNCTION__).warning("%s: Multiple socket notifiers for same socket %d and type %s", __PRETTY_FUNCTION__, sockfd, socketType(type));
0
}
never executed: QMessageLogger(__FILE__, 411, __PRETTY_FUNCTION__).warning("%s: Multiple socket notifiers for same socket %d and type %s", __PRETTY_FUNCTION__, sockfd, socketType(type));
}
never executed: QMessageLogger(__FILE__, 411, __PRETTY_FUNCTION__).warning("%s: Multiple socket notifiers for same socket %d and type %s", __PRETTY_FUNCTION__, sockfd, socketType(type));
list
never executed: QMessageLogger(__FILE__, 411, __PRETTY_FUNCTION__).warning("%s: Multiple socket notifiers for same socket %d and type %s", __PRETTY_FUNCTION__, sockfd, socketType(type));
never executed: QMessageLogger(__FILE__, 411, __PRETTY_FUNCTION__).warning("%s: Multiple socket notifiers for same socket %d and type %s", __PRETTY_FUNCTION__, sockfd, socketType(type));
));
never executed: QMessageLogger(__FILE__, 411, __PRETTY_FUNCTION__).warning("%s: Multiple socket notifiers for same socket %d and type %s", __PRETTY_FUNCTION__, sockfd, socketType(type));
306-
307 sn_set.insert(i, sn);-
((void) (((fds)->fds_bits)[((sockfd) / (8 * (int) sizeof (__fd_mask)))] |= ((__fd_mask) 1 << ((sockfd) % (8 * (int) sizeof (__fd_mask))))));
d->sn_highestnotifiers[type] = qMax(d->sn_highest, sockfd);notifier;
308}
never executed: end of block
0
309-
310void QEventDispatcherUNIX::unregisterSocketNotifier(QSocketNotifier *notifier)-
311{-
312 ((!(notifier)) ? qt_assert("notifier",__FILE__,458419) : qt_noop());-
313 int sockfd = notifier->socket();-
314 intQSocketNotifier::Type type = notifier->type();-
315-
316 if (sockfd < 00
|| unsigned(sockfd) >= 1024) {
QMessageLogger(__FILE__, 464, __PRETTY_FUNCTION__).warning("QSocketNotifier: Internal error");
return;
} elseif (notifier->thread() != thread()
notifier->thread() != thread()Description
TRUEnever evaluated
FALSEnever evaluated
|| thread() != QThread::currentThread()
thread() != QT...urrentThread()Description
TRUEnever evaluated
FALSEnever evaluated
) {
317 QMessageLogger(__FILE__, 468424, __PRETTY_FUNCTION__).warning("QSocketNotifier: socket notifiersnotifier (fd %d) cannot be disabled from another thread");-
return;
}
QEventDispatcherUNIXPrivate * const d = d_func();
QSockNotType::List &list = d->sn_vec[type].list;
fd_set *fds = &d->sn_vec[type].enabled_fds;
QSockNot *sn = 0;
int i;
for (i = 0; i < list.size(); ++i) {
sn = list[i];
if(sn->obj == notifier && sn->fd == sockfd)
break;
}
if (i == list.size())
return;
((void) (((fds)->fds_bits)[((sockfd) / (8 * (int) sizeof (__fd_mask)))] &= ~((__fd_mask) 1 << ((sockfd) % (8 * (int) sizeof (__fd_mask))))));
((void) (((sn->queue)->fds_bits)[((sockfd) / (8 * (int) sizeof (__fd_mask)))] &= ~((__fd_mask) 1 << ((sockfd) % (8 * (int) sizeof (__fd_mask))))));
d->sn_pending_list.removeAll(sn);
listthread.removeAt(i);
delete sn;
if\n"
318 "(d->sn_highest == sockfd) {-
d->sn_highest = -1;
forNotifier's thread is %s(int i=0; i<3; i++) {
if (!d->sn_vec[i].list.isEmpty())
d->sn_highest = qMax%p), event dispatcher's thread is %s(d->sn_highest,
d->sn_vec[i].list[0]->fd);
}
}
}
void QEventDispatcherUNIX::setSocketNotifierPending%p), current thread is %s(QSocketNotifier *notifier)
{
((!(notifier%p))? qt_assert("notifier",__FILE__",
319 504) : qt_noop());-
intsockfd=,
320 notifier->socket();-
int type =thread() ? notifier->type();
if (sockfd < 0
|| unsigned(sockfd) >= 1024) {
QMessageLogger(__FILE__, 510, __PRETTY_FUNCTION__).warning("QSocketNotifierthread()->metaObject()->className() : Internal error");
return;
}
((!("QThread", notifier->thread() ==thread() &&(),
321 thread() == QThread::currentThread()))? qt_assert("notifier->thread() == thread()->metaObject()->className() &&: "QThread", thread(),-
322 QThread::currentThread() == ? QThread::currentThread()->metaObject()->className() ",__FILE__,513):qt_noop "QThread", QThread::currentThread());-
323 return;
never executed: return;
0
324 }-
325-
326-
327 QEventDispatcherUNIXPrivate * const d = d_func();-
328-
329 QSockNotType::List &list =d->sn_vec[type].list;-
QSockNot *sn = 0;
int i;
forpendingNotifiers.removeOne(notifier);
330-
331 auto i = 0; i < listd->socketNotifiers.size(); ++i) {-
sn = list[i];
iffind(sn->obj == notifier && sn->fd ==sockfd)
break;
});
332 if (i == list.size())
i == d->socketNotifiers.end()Description
TRUEnever evaluated
FALSEnever evaluated
0
return;
i == d->socketNotifiers.end()Description
TRUEnever evaluated
FALSEnever evaluated
if (! ((((sn->queue)->fds_bits)[((sn->fd) / (8 * (int) sizeof (__fd_mask)))] & ((__fd_mask) 1 << ((sn->fd) % (8 * (int) sizeof (__fd_mask))))) != 0)) {
i == d->socketNotifiers.end()Description
TRUEnever evaluated
FALSEnever evaluated
if (
i == d->socketNotifiers.end()Description
TRUEnever evaluated
FALSEnever evaluated
i == d->socketNotifiers.end()Description
TRUEnever evaluated
FALSEnever evaluated
d->sn_pending_listsocketNotifiers.isEmptyend()
i == d->socketNotifiers.end()Description
TRUEnever evaluated
FALSEnever evaluated
)
333 {0
d->sn_pending_listreturn;
never executed: return;
334-
335 QSocketNotifierSetUNIX &sn_set = i.appendvalue();-
336-
337 if (sn);0
} else {
d->sn_pending_listsn_set
sn_set.notifie...pe] == nullptrDescription
TRUEnever evaluated
FALSEnever evaluated
.insert((qrand() & 0xffnotifiers[type] == nullptr
sn_set.notifie...pe] == nullptrDescription
TRUEnever evaluated
FALSEnever evaluated
)
338 %return;
never executed: return;
0
339-
340 if (d->sn_pending_listsn_set
sn_set.notifie...e] != notifierDescription
TRUEnever evaluated
FALSEnever evaluated
.size()+1), sn);
sn_set.notifie...e] != notifierDescription
TRUEnever evaluated
FALSEnever evaluated
0
}
sn_set.notifie...e] != notifierDescription
TRUEnever evaluated
FALSEnever evaluated
((void) (((sn->queue)->fds_bits)[((sn->fd) / (8 * (int) sizeof (__fd_mask)))] |= ((__fd_mask) 1 << ((sn->fd) % (8 * (int
sn_set.notifie...e] != notifierDescription
TRUEnever evaluated
FALSEnever evaluated
sn_set.notifie...e] != notifierDescription
TRUEnever evaluated
FALSEnever evaluated
notifiers[type] != notifier
sn_set.notifie...e] != notifierDescription
TRUEnever evaluated
FALSEnever evaluated
) sizeof (__fd_mask))))));
}
}
int QEventDispatcherUNIX::activateTimers(){
341 ((!(thread() == QThread::currentThread())) ? qt_assertQMessageLogger("thread()__FILE__, 448, __PRETTY_FUNCTION__).warning("%s: ==Multiple QThread::currentThread()"socket notifiers for same socket %d and type %s",-
342 __FILE____PRETTY_FUNCTION__, 547) : qt_noop());-
QEventDispatcherUNIXPrivate * const d = d_func();
return d->timerList.activateTimers();
}
int QEventDispatcherUNIX::activateSocketNotifiers()
{
QEventDispatcherUNIXPrivate * const d = d_func();
ifsockfd, socketType(d->sn_pending_list.isEmpty())type));
343 return
never executed: return;
0;
never executed: return;
0
344 int n_act}-
345-
346 sn_set.notifiers[type] = 0nullptr;-
347-
348 QEvent eventif (QEvent::SockAct);0
while (!d->sn_pending_listsn_set
sn_set.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
.isEmpty()
sn_set.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
)
349 {0
QSockNot *sn =d->sn_pending_listsocketNotifiers.takeFirst();
never executed: d->socketNotifiers.erase(i);
if (((((sn->queue)->fds_bits)[((sn->fd) / (8 * (int) sizeof (__fd_mask)))] & ((__fd_mask) 1 << ((sn->fd) % (8 * (int) sizeof (__fd_mask))))) != 0)) {
never executed: d->socketNotifiers.erase(i);
((void) (((sn->queue)->fds_bits)[((sn->fd) / (8 * (int) sizeof (__fd_mask)))] &= ~((__fd_mask) 1 << ((sn->fd) % (8 * (int) sizeof (__fd_mask))))));
never executed: d->socketNotifiers.erase(i);
QCoreApplication::sendEvent
never executed: d->socketNotifiers.erase(i);
never executed: d->socketNotifiers.erase(i);
erase(sn->obj, &eventi);
never executed: d->socketNotifiers.erase(i);
++n_act;
}
}
return n_act;}
never executed: end of block
351-
352bool QEventDispatcherUNIX::processEvents(QEventLoop::ProcessEventsFlags flags)-
353{-
354 QEventDispatcherUNIXPrivate * const d = d_func();-
355 d->interrupt.store(0);-
356-
357-
358 awake();-
359 QCoreApplicationPrivate::sendPostedEvents(0, 0, d->threadData);-
360-
361 int neventsconst bool include_timers = (flags & QEventLoop::X11ExcludeTimers) == 0;-
362 const bool include_notifiers = (flags & QEventLoop::ExcludeSocketNotifiers) == 0;-
363 const bool wait_for_events = flags & QEventLoop::WaitForMoreEvents;-
364-
365 const bool canWait = (d->threadData->canWaitLocked()
d->threadData->canWaitLocked()Description
TRUEnever evaluated
FALSEnever evaluated
0
366 && !d->interrupt.load()
!d->interrupt.load()Description
TRUEnever evaluated
FALSEnever evaluated
0
367 && (flags & QEventLoop::WaitForMoreEvents));wait_for_events
wait_for_eventsDescription
TRUEnever evaluated
FALSEnever evaluated
);
0
368-
369 if (canWait
canWaitDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
370 aboutToBlock();
never executed: aboutToBlock();
0
371-
372 if (!(d->interrupt.load()
d->interrupt.load()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
373 {return
never executed: return false;
never executed: return false;
false;
never executed: return false;
0
374-
375 timespec *tm = 0nullptr;-
376 timespec wait_tm = { 0l0, 0l0 };-
377-
378 if (!(flags & QEventLoop::X11ExcludeTimers)) {if (!canWait
!canWaitDescription
TRUEnever evaluated
FALSEnever evaluated
||
(include_timers
include_timersDescription
TRUEnever evaluated
FALSEnever evaluated
&&
d->timerList.timerWait(wait_tm)))
d->timerList.t...rWait(wait_tm)Description
TRUEnever evaluated
FALSEnever evaluated
))
0
379 tm = &wait_tm;
never executed: tm = &wait_tm;
0
380-
381 }-
if (!canWait) {d->pollfds.clear();
382 d->pollfds.reserve(1 + (include_notifiers ? d->socketNotifiers.size() : 0));-
383-
384 if (!tm(include_notifiers
include_notifiersDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
385 tmfor (auto it = &wait_tm;0
tmd->tv_secsocketNotifiers.cbegin(); it != d->socketNotifiers.cend()
it != d->socke...tifiers.cend()Description
TRUEnever evaluated
FALSEnever evaluated
; ++it)
386 d->pollfds.append(qt_make_pollfd(it.key(), it.value().events()));
never executed: d->pollfds.append(qt_make_pollfd(it.key(), it.value().events()));
0
387-
388-
389 d->pollfds.append(d->threadPipe.prepare());-
390-
391 int nevents = 0l0;-
392-
393 tmswitch (qt_safe_poll(d->tv_nsec = 0lpollfds.data(), d->pollfds.size(), tm)) {-
394 case
never executed: case -1:
-1:
never executed: case -1:
0
395 perror("qt_safe_poll");-
396 break
never executed: break;
never executed: break;
never executed: break;
;
never executed: break;
0
397 }case
never executed: case 0:
never executed: case 0:
0:
never executed: case 0:
0
398 break;
never executed: break;
0
399 default
never executed: default:
:
never executed: default:
0
400 nevents =+= d->doSelectthreadPipe.check(flags, tm);d->pollfds.takeLast());-
401 if (!(flags & QEventLoop::X11ExcludeTimers)) {include_notifiers
include_notifiersDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
402 nevents += activateTimersd->activateSocketNotifiers();
never executed: nevents += d->activateSocketNotifiers();
0
403 }break;
never executed: break;
0
404 }-
405-
406 if (include_timers
include_timersDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
407 nevents += d->activateTimers();
never executed: nevents += d->activateTimers();
0
408-
409-
410 return
never executed: return (nevents > 0);
(nevents > 0);
never executed: return (nevents > 0);
0
411}-
412-
413bool QEventDispatcherUNIX::hasPendingEvents()-
414{-
415 extern uint qGlobalPostedEventsCount();-
416 return qGlobalPostedEventsCount();-
417}-
418-
419int QEventDispatcherUNIX::remainingTime(int timerId)-
420{-
421-
422 if (timerId < 1) {-
423 QMessageLogger(__FILE__, 628530, __PRETTY_FUNCTION__).warning("QEventDispatcherUNIX::remainingTime: invalid argument");-
424 return -1;-
425 }-
426-
427-
428 QEventDispatcherUNIXPrivate * const d = d_func();-
429 return d->timerList.timerRemainingTime(timerId);-
430}-
431-
432void QEventDispatcherUNIX::wakeUp()-
433{-
434 QEventDispatcherUNIXPrivate * const d = d_func();-
435 if (d->wakeUpsthreadPipe.testAndSetAcquire(0, 1)) {-
if (d->thread_pipe[1] == -1) {
eventfd_t value = 1;
int ret;
do { ret = eventfd_write(d->thread_pipe[0], value); } while (ret == -1 && (*__errno_location ()) == 4);
return;
}
char c = 0;
qt_safe_write( d->thread_pipe[1], &c, 1 );
}wakeUp();
436}
never executed: end of block
0
437-
438void QEventDispatcherUNIX::interrupt()-
439{-
440 QEventDispatcherUNIXPrivate * const d = d_func();-
441 d->interrupt.store(1);-
442 wakeUp();-
443}-
444-
445void QEventDispatcherUNIX::flush()-
446{ }-
447-
448-
Switch to Source codePreprocessed file

Generated by Squish Coco Non-Commercial 4.3.0-BETA-master-30-08-2018-4cb69e9