| Absolute File Name: | /home/qt/qt5_coco/qt5/qtbase/src/corelib/kernel/qeventdispatcher_unix.cpp |
| Switch to Source code | Preprocessed file |
| Line | Source | Count | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | - | |||||||||||||||||||
| 2 | - | |||||||||||||||||||
| 3 | - | |||||||||||||||||||
| 4 | - | |||||||||||||||||||
| 5 | - | |||||||||||||||||||
| 6 | - | |||||||||||||||||||
| 7 | - | |||||||||||||||||||
| 8 | - | |||||||||||||||||||
| 9 | - | |||||||||||||||||||
| 10 | - | |||||||||||||||||||
| 11 | - | |||||||||||||||||||
| 12 | static const char *socketType(QSocketNotifier::Type type) | - | ||||||||||||||||||
| 13 | { | - | ||||||||||||||||||
| 14 | switch (type) { | - | ||||||||||||||||||
| 15 | case never executed: QSocketNotifier::Read:case QSocketNotifier::Read:never executed: case QSocketNotifier::Read: | 0 | ||||||||||||||||||
| 16 | return never executed: "Read";return "Read";never executed: return "Read"; | 0 | ||||||||||||||||||
| 17 | case never executed: QSocketNotifier::Write:case QSocketNotifier::Write:never executed: case QSocketNotifier::Write: | 0 | ||||||||||||||||||
| 18 | return never executed: "Write";return "Write";never executed: return "Write"; | 0 | ||||||||||||||||||
| 19 | case never executed: QSocketNotifier::Exception:case QSocketNotifier::Exception:never executed: case QSocketNotifier::Exception: | 0 | ||||||||||||||||||
| 20 | return never executed: "Exception";return "Exception";never executed: return "Exception"; | 0 | ||||||||||||||||||
| 21 | } | - | ||||||||||||||||||
| 22 | - | |||||||||||||||||||
| 23 | do { ((!(false)) ? qt_assert_x("Q_UNREACHABLE()", "Q_UNREACHABLE was reached",__FILE__,89) : qt_noop()); __builtin_unreachable(); } while (0); | - | ||||||||||||||||||
| 24 | } never executed: end of block | 0 | ||||||||||||||||||
| 25 | - | |||||||||||||||||||
| 26 | QThreadPipe::QThreadPipe() | - | ||||||||||||||||||
| 27 | { | - | ||||||||||||||||||
| 28 | fds[0] = -1; | - | ||||||||||||||||||
| 29 | fds[1] = -1; | - | ||||||||||||||||||
| 30 | - | |||||||||||||||||||
| 31 | - | |||||||||||||||||||
| 32 | - | |||||||||||||||||||
| 33 | } never executed: end of block | 0 | ||||||||||||||||||
| 34 | - | |||||||||||||||||||
| 35 | QThreadPipe::~QThreadPipe() | - | ||||||||||||||||||
| 36 | { | - | ||||||||||||||||||
| 37 | if (fds[0] >= 0
| 0 | ||||||||||||||||||
| 38 | close(fds[0]); never executed: close(fds[0]); | 0 | ||||||||||||||||||
| 39 | - | |||||||||||||||||||
| 40 | if (fds[1] >= 0
| 0 | ||||||||||||||||||
| 41 | close(fds[1]); never executed: close(fds[1]); | 0 | ||||||||||||||||||
| 42 | - | |||||||||||||||||||
| 43 | - | |||||||||||||||||||
| 44 | - | |||||||||||||||||||
| 45 | - | |||||||||||||||||||
| 46 | } never executed: end of block | 0 | ||||||||||||||||||
| 47 | bool QThreadPipe::init() | - | ||||||||||||||||||
| 48 | { | - | ||||||||||||||||||
| 49 | if ((
| 0 | ||||||||||||||||||
| 50 | return never executed: true;return true;never executed: return true; | 0 | ||||||||||||||||||
| 51 | - | |||||||||||||||||||
| 52 | if (qt_safe_pipe(fds, 04000) == -1
| 0 | ||||||||||||||||||
| 53 | perror("QThreadPipe: Unable to create pipe"); | - | ||||||||||||||||||
| 54 | return never executed: false;return false;never executed: return false; | 0 | ||||||||||||||||||
| 55 | } | - | ||||||||||||||||||
| 56 | - | |||||||||||||||||||
| 57 | - | |||||||||||||||||||
| 58 | return never executed: true;return true;never executed: return true; | 0 | ||||||||||||||||||
| 59 | } | - | ||||||||||||||||||
| 60 | - | |||||||||||||||||||
| 61 | pollfd QThreadPipe::prepare() const | - | ||||||||||||||||||
| 62 | { | - | ||||||||||||||||||
| 63 | return never executed: qt_make_pollfd(fds[0], 0x001);return qt_make_pollfd(fds[0], 0x001);never executed: return qt_make_pollfd(fds[0], 0x001); | 0 | ||||||||||||||||||
| 64 | } | - | ||||||||||||||||||
| 65 | - | |||||||||||||||||||
| 66 | void QThreadPipe::wakeUp() | - | ||||||||||||||||||
| 67 | { | - | ||||||||||||||||||
| 68 | if (wakeUps.testAndSetAcquire(0, 1)
| 0 | ||||||||||||||||||
| 69 | - | |||||||||||||||||||
| 70 | if (fds[1] == -1
| 0 | ||||||||||||||||||
| 71 | - | |||||||||||||||||||
| 72 | eventfd_t value = 1; | - | ||||||||||||||||||
| 73 | int ret; | - | ||||||||||||||||||
| 74 | do { ret = eventfd_write(fds[0], value); } never executed: while (ret == -1end of block
| 0 | ||||||||||||||||||
| 75 | return; never executed: return; | 0 | ||||||||||||||||||
| 76 | } | - | ||||||||||||||||||
| 77 | - | |||||||||||||||||||
| 78 | char c = 0; | - | ||||||||||||||||||
| 79 | qt_safe_write(fds[1], &c, 1); | - | ||||||||||||||||||
| 80 | } never executed: end of block | 0 | ||||||||||||||||||
| 81 | } never executed: end of block | 0 | ||||||||||||||||||
| 82 | - | |||||||||||||||||||
| 83 | int QThreadPipe::check(const pollfd &pfd) | - | ||||||||||||||||||
| 84 | { | - | ||||||||||||||||||
| 85 | ((!(pfd.fd == fds[0])) ? qt_assert("pfd.fd == fds[0]",__FILE__,192) : qt_noop()); | - | ||||||||||||||||||
| 86 | - | |||||||||||||||||||
| 87 | char c[16]; | - | ||||||||||||||||||
| 88 | const int readyread = pfd.revents & 0x001; | - | ||||||||||||||||||
| 89 | - | |||||||||||||||||||
| 90 | if (readyread
| 0 | ||||||||||||||||||
| 91 | - | |||||||||||||||||||
| 92 | - | |||||||||||||||||||
| 93 | - | |||||||||||||||||||
| 94 | - | |||||||||||||||||||
| 95 | - | |||||||||||||||||||
| 96 | - | |||||||||||||||||||
| 97 | - | |||||||||||||||||||
| 98 | if (fds[1] == -1
| 0 | ||||||||||||||||||
| 99 | - | |||||||||||||||||||
| 100 | eventfd_t value; | - | ||||||||||||||||||
| 101 | eventfd_read(fds[0], &value); | - | ||||||||||||||||||
| 102 | } never executed: elseend of block | 0 | ||||||||||||||||||
| 103 | - | |||||||||||||||||||
| 104 | { | - | ||||||||||||||||||
| 105 | while (::
never executed: end of block | 0 | ||||||||||||||||||
| 106 | } never executed: end of block | 0 | ||||||||||||||||||
| 107 | - | |||||||||||||||||||
| 108 | - | |||||||||||||||||||
| 109 | if (!wakeUps.testAndSetRelease(1, 0)
| 0 | ||||||||||||||||||
| 110 | - | |||||||||||||||||||
| 111 | QMessageLogger(__FILE__, 218, __PRETTY_FUNCTION__).warning("QThreadPipe: internal error, wakeUps.testAndSetRelease(1, 0) failed!"); | - | ||||||||||||||||||
| 112 | } never executed: end of block | 0 | ||||||||||||||||||
| 113 | } never executed: end of block | 0 | ||||||||||||||||||
| 114 | - | |||||||||||||||||||
| 115 | return never executed: readyread;return readyread;never executed: return readyread; | 0 | ||||||||||||||||||
| 116 | } | - | ||||||||||||||||||
| 117 | - | |||||||||||||||||||
| 118 | QEventDispatcherUNIXPrivate::QEventDispatcherUNIXPrivate() | - | ||||||||||||||||||
| 119 | { | - | ||||||||||||||||||
| 120 | if (__builtin_expect(!!(threadPipe.init() == false), false)
| 0 | ||||||||||||||||||
| 121 | 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"); | 0 | ||||||||||||||||||
| 122 | } never executed: end of block | 0 | ||||||||||||||||||
| 123 | - | |||||||||||||||||||
| 124 | QEventDispatcherUNIXPrivate::~QEventDispatcherUNIXPrivate() | - | ||||||||||||||||||
| 125 | { | - | ||||||||||||||||||
| 126 | - | |||||||||||||||||||
| 127 | qDeleteAll(timerList); | - | ||||||||||||||||||
| 128 | } never executed: end of block | 0 | ||||||||||||||||||
| 129 | - | |||||||||||||||||||
| 130 | void QEventDispatcherUNIXPrivate::setSocketNotifierPending(QSocketNotifier *notifier) | - | ||||||||||||||||||
| 131 | { | - | ||||||||||||||||||
| 132 | ((!(notifier)) ? qt_assert("notifier",__FILE__,239) : qt_noop()); | - | ||||||||||||||||||
| 133 | - | |||||||||||||||||||
| 134 | if (pendingNotifiers.contains(notifier)
| 0 | ||||||||||||||||||
| 135 | return; never executed: return; | 0 | ||||||||||||||||||
| 136 | - | |||||||||||||||||||
| 137 | pendingNotifiers << notifier; | - | ||||||||||||||||||
| 138 | } never executed: end of block | 0 | ||||||||||||||||||
| 139 | - | |||||||||||||||||||
| 140 | int QEventDispatcherUNIXPrivate::activateTimers() | - | ||||||||||||||||||
| 141 | { | - | ||||||||||||||||||
| 142 | return never executed: timerList.activateTimers();return timerList.activateTimers();never executed: return timerList.activateTimers(); | 0 | ||||||||||||||||||
| 143 | } | - | ||||||||||||||||||
| 144 | - | |||||||||||||||||||
| 145 | void QEventDispatcherUNIXPrivate::markPendingSocketNotifiers() | - | ||||||||||||||||||
| 146 | { | - | ||||||||||||||||||
| 147 | for (const pollfd &pfd : qAsConst(pollfds)) { | - | ||||||||||||||||||
| 148 | if (pfd.fd < 0
| 0 | ||||||||||||||||||
| 149 | continue; never executed: continue; | 0 | ||||||||||||||||||
| 150 | - | |||||||||||||||||||
| 151 | auto it = socketNotifiers.find(pfd.fd); | - | ||||||||||||||||||
| 152 | ((!(it != socketNotifiers.end())) ? qt_assert("it != socketNotifiers.end()",__FILE__,259) : qt_noop()); | - | ||||||||||||||||||
| 153 | - | |||||||||||||||||||
| 154 | const QSocketNotifierSetUNIX &sn_set = it.value(); | - | ||||||||||||||||||
| 155 | - | |||||||||||||||||||
| 156 | static const struct { | - | ||||||||||||||||||
| 157 | QSocketNotifier::Type type; | - | ||||||||||||||||||
| 158 | short flags; | - | ||||||||||||||||||
| 159 | } notifiers[] = { | - | ||||||||||||||||||
| 160 | { QSocketNotifier::Read, 0x001 | 0x010 | 0x008 }, | - | ||||||||||||||||||
| 161 | { QSocketNotifier::Write, 0x004 | 0x010 | 0x008 }, | - | ||||||||||||||||||
| 162 | { QSocketNotifier::Exception, 0x002 | 0x010 | 0x008 } | - | ||||||||||||||||||
| 163 | }; | - | ||||||||||||||||||
| 164 | - | |||||||||||||||||||
| 165 | for (const auto &n : notifiers) { | - | ||||||||||||||||||
| 166 | QSocketNotifier *notifier = sn_set.notifiers[n.type]; | - | ||||||||||||||||||
| 167 | - | |||||||||||||||||||
| 168 | if (!notifier
| 0 | ||||||||||||||||||
| 169 | continue; never executed: continue; | 0 | ||||||||||||||||||
| 170 | - | |||||||||||||||||||
| 171 | if (pfd.revents & 0x020
| 0 | ||||||||||||||||||
| 172 | QMessageLogger(__FILE__, 279, __PRETTY_FUNCTION__).warning("QSocketNotifier: Invalid socket %d with type %s, disabling...", | - | ||||||||||||||||||
| 173 | it.key(), socketType(n.type)); | - | ||||||||||||||||||
| 174 | notifier->setEnabled(false); | - | ||||||||||||||||||
| 175 | } never executed: end of block | 0 | ||||||||||||||||||
| 176 | - | |||||||||||||||||||
| 177 | if (pfd.revents & n.flags
| 0 | ||||||||||||||||||
| 178 | setSocketNotifierPending(notifier); never executed: setSocketNotifierPending(notifier); | 0 | ||||||||||||||||||
| 179 | } never executed: end of block | 0 | ||||||||||||||||||
| 180 | } never executed: end of block | 0 | ||||||||||||||||||
| 181 | - | |||||||||||||||||||
| 182 | pollfds.clear(); | - | ||||||||||||||||||
| 183 | } never executed: end of block | 0 | ||||||||||||||||||
| 184 | - | |||||||||||||||||||
| 185 | int QEventDispatcherUNIXPrivate::activateSocketNotifiers() | - | ||||||||||||||||||
| 186 | { | - | ||||||||||||||||||
| 187 | markPendingSocketNotifiers(); | - | ||||||||||||||||||
| 188 | - | |||||||||||||||||||
| 189 | if (pendingNotifiers.isEmpty()
| 0 | ||||||||||||||||||
| 190 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||||||||
| 191 | - | |||||||||||||||||||
| 192 | int n_activated = 0; | - | ||||||||||||||||||
| 193 | QEvent event(QEvent::SockAct); | - | ||||||||||||||||||
| 194 | - | |||||||||||||||||||
| 195 | while (!pendingNotifiers.isEmpty()
| 0 | ||||||||||||||||||
| 196 | QSocketNotifier *notifier = pendingNotifiers.takeFirst(); | - | ||||||||||||||||||
| 197 | QCoreApplication::sendEvent(notifier, &event); | - | ||||||||||||||||||
| 198 | ++n_activated; | - | ||||||||||||||||||
| 199 | } never executed: end of block | 0 | ||||||||||||||||||
| 200 | - | |||||||||||||||||||
| 201 | return never executed: n_activated;return n_activated;never executed: return n_activated; | 0 | ||||||||||||||||||
| 202 | } | - | ||||||||||||||||||
| 203 | - | |||||||||||||||||||
| 204 | QEventDispatcherUNIX::QEventDispatcherUNIX(QObject *parent) | - | ||||||||||||||||||
| 205 | : QAbstractEventDispatcher(*new QEventDispatcherUNIXPrivate, parent) | - | ||||||||||||||||||
| 206 | { } never executed: end of block | 0 | ||||||||||||||||||
| 207 | - | |||||||||||||||||||
| 208 | QEventDispatcherUNIX::QEventDispatcherUNIX(QEventDispatcherUNIXPrivate &dd, QObject *parent) | - | ||||||||||||||||||
| 209 | : QAbstractEventDispatcher(dd, parent) | - | ||||||||||||||||||
| 210 | { } never executed: end of block | 0 | ||||||||||||||||||
| 211 | - | |||||||||||||||||||
| 212 | QEventDispatcherUNIX::~QEventDispatcherUNIX() | - | ||||||||||||||||||
| 213 | { } | - | ||||||||||||||||||
| 214 | - | |||||||||||||||||||
| 215 | - | |||||||||||||||||||
| 216 | - | |||||||||||||||||||
| 217 | - | |||||||||||||||||||
| 218 | void QEventDispatcherUNIX::registerTimer(int timerId, int interval, Qt::TimerType timerType, QObject *obj) | - | ||||||||||||||||||
| 219 | { | - | ||||||||||||||||||
| 220 | - | |||||||||||||||||||
| 221 | if (timerId < 1
| 0 | ||||||||||||||||||
| 222 | QMessageLogger(__FILE__, 329, __PRETTY_FUNCTION__).warning("QEventDispatcherUNIX::registerTimer: invalid arguments"); | - | ||||||||||||||||||
| 223 | return; never executed: return; | 0 | ||||||||||||||||||
| 224 | } else if (obj->thread() != thread()
| 0 | ||||||||||||||||||
| 225 | QMessageLogger(__FILE__, 332, __PRETTY_FUNCTION__).warning("QEventDispatcherUNIX::registerTimer: timers cannot be started from another thread"); | - | ||||||||||||||||||
| 226 | return; never executed: return; | 0 | ||||||||||||||||||
| 227 | } | - | ||||||||||||||||||
| 228 | - | |||||||||||||||||||
| 229 | - | |||||||||||||||||||
| 230 | QEventDispatcherUNIXPrivate * const d = d_func(); | - | ||||||||||||||||||
| 231 | d->timerList.registerTimer(timerId, interval, timerType, obj); | - | ||||||||||||||||||
| 232 | } never executed: end of block | 0 | ||||||||||||||||||
| 233 | - | |||||||||||||||||||
| 234 | - | |||||||||||||||||||
| 235 | - | |||||||||||||||||||
| 236 | - | |||||||||||||||||||
| 237 | bool QEventDispatcherUNIX::unregisterTimer(int timerId) | - | ||||||||||||||||||
| 238 | { | - | ||||||||||||||||||
| 239 | - | |||||||||||||||||||
| 240 | if (timerId < 1
| 0 | ||||||||||||||||||
| 241 | QMessageLogger(__FILE__, 348, __PRETTY_FUNCTION__).warning("QEventDispatcherUNIX::unregisterTimer: invalid argument"); | - | ||||||||||||||||||
| 242 | return never executed: false;return false;never executed: return false; | 0 | ||||||||||||||||||
| 243 | } else if (thread() != QThread::currentThread()
| 0 | ||||||||||||||||||
| 244 | QMessageLogger(__FILE__, 351, __PRETTY_FUNCTION__).warning("QEventDispatcherUNIX::unregisterTimer: timers cannot be stopped from another thread"); | - | ||||||||||||||||||
| 245 | return never executed: false;return false;never executed: return false; | 0 | ||||||||||||||||||
| 246 | } | - | ||||||||||||||||||
| 247 | - | |||||||||||||||||||
| 248 | - | |||||||||||||||||||
| 249 | QEventDispatcherUNIXPrivate * const d = d_func(); | - | ||||||||||||||||||
| 250 | return never executed: d->timerList.unregisterTimer(timerId);return d->timerList.unregisterTimer(timerId);never executed: return d->timerList.unregisterTimer(timerId); | 0 | ||||||||||||||||||
| 251 | } | - | ||||||||||||||||||
| 252 | - | |||||||||||||||||||
| 253 | - | |||||||||||||||||||
| 254 | - | |||||||||||||||||||
| 255 | - | |||||||||||||||||||
| 256 | bool QEventDispatcherUNIX::unregisterTimers(QObject *object) | - | ||||||||||||||||||
| 257 | { | - | ||||||||||||||||||
| 258 | - | |||||||||||||||||||
| 259 | if (!object
| 0 | ||||||||||||||||||
| 260 | QMessageLogger(__FILE__, 367, __PRETTY_FUNCTION__).warning("QEventDispatcherUNIX::unregisterTimers: invalid argument"); | - | ||||||||||||||||||
| 261 | return never executed: false;return false;never executed: return false; | 0 | ||||||||||||||||||
| 262 | } else if (object->thread() != thread()
| 0 | ||||||||||||||||||
| 263 | QMessageLogger(__FILE__, 370, __PRETTY_FUNCTION__).warning("QEventDispatcherUNIX::unregisterTimers: timers cannot be stopped from another thread"); | - | ||||||||||||||||||
| 264 | return never executed: false;return false;never executed: return false; | 0 | ||||||||||||||||||
| 265 | } | - | ||||||||||||||||||
| 266 | - | |||||||||||||||||||
| 267 | - | |||||||||||||||||||
| 268 | QEventDispatcherUNIXPrivate * const d = d_func(); | - | ||||||||||||||||||
| 269 | return never executed: d->timerList.unregisterTimers(object);return d->timerList.unregisterTimers(object);never executed: return d->timerList.unregisterTimers(object); | 0 | ||||||||||||||||||
| 270 | } | - | ||||||||||||||||||
| 271 | - | |||||||||||||||||||
| 272 | QList<QEventDispatcherUNIX::TimerInfo> | - | ||||||||||||||||||
| 273 | QEventDispatcherUNIX::registeredTimers(QObject *object) const | - | ||||||||||||||||||
| 274 | { | - | ||||||||||||||||||
| 275 | if (!object
| 0 | ||||||||||||||||||
| 276 | QMessageLogger(__FILE__, 383, __PRETTY_FUNCTION__).warning("QEventDispatcherUNIX:registeredTimers: invalid argument"); | - | ||||||||||||||||||
| 277 | return never executed: QList<TimerInfo>();return QList<TimerInfo>();never executed: return QList<TimerInfo>(); | 0 | ||||||||||||||||||
| 278 | } | - | ||||||||||||||||||
| 279 | - | |||||||||||||||||||
| 280 | const QEventDispatcherUNIXPrivate * const d = d_func(); | - | ||||||||||||||||||
| 281 | return never executed: d->timerList.registeredTimers(object);return d->timerList.registeredTimers(object);never executed: return d->timerList.registeredTimers(object); | 0 | ||||||||||||||||||
| 282 | } | - | ||||||||||||||||||
| 283 | - | |||||||||||||||||||
| 284 | - | |||||||||||||||||||
| 285 | - | |||||||||||||||||||
| 286 | - | |||||||||||||||||||
| 287 | - | |||||||||||||||||||
| 288 | void QEventDispatcherUNIX::registerSocketNotifier(QSocketNotifier *notifier) | - | ||||||||||||||||||
| 289 | { | - | ||||||||||||||||||
| 290 | ((!(notifier)) ? qt_assert("notifier",__FILE__,397) : qt_noop()); | - | ||||||||||||||||||
| 291 | int sockfd = notifier->socket(); | - | ||||||||||||||||||
| 292 | QSocketNotifier::Type type = notifier->type(); | - | ||||||||||||||||||
| 293 | - | |||||||||||||||||||
| 294 | if (notifier->thread() != thread()
| 0 | ||||||||||||||||||
| 295 | QMessageLogger(__FILE__, 402, __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 | QSocketNotifierSetUNIX &sn_set = d->socketNotifiers[sockfd]; | - | ||||||||||||||||||
| 302 | - | |||||||||||||||||||
| 303 | if (sn_set.notifiers[type]
| 0 | ||||||||||||||||||
| 304 | QMessageLogger(__FILE__, 411, __PRETTY_FUNCTION__).warning("%s: Multiple socket notifiers for 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)); | 0 | ||||||||||||||||||
| 305 | __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)); | 0 | ||||||||||||||||||
| 306 | - | |||||||||||||||||||
| 307 | sn_set.notifiers[type] = notifier; | - | ||||||||||||||||||
| 308 | } never executed: end of block | 0 | ||||||||||||||||||
| 309 | - | |||||||||||||||||||
| 310 | void QEventDispatcherUNIX::unregisterSocketNotifier(QSocketNotifier *notifier) | - | ||||||||||||||||||
| 311 | { | - | ||||||||||||||||||
| 312 | ((!(notifier)) ? qt_assert("notifier",__FILE__,419) : qt_noop()); | - | ||||||||||||||||||
| 313 | int sockfd = notifier->socket(); | - | ||||||||||||||||||
| 314 | QSocketNotifier::Type type = notifier->type(); | - | ||||||||||||||||||
| 315 | - | |||||||||||||||||||
| 316 | if (notifier->thread() != thread()
| 0 | ||||||||||||||||||
| 317 | QMessageLogger(__FILE__, 424, __PRETTY_FUNCTION__).warning("QSocketNotifier: socket notifier (fd %d) cannot be disabled from another thread.\n" | - | ||||||||||||||||||
| 318 | "(Notifier's thread is %s(%p), event dispatcher's thread is %s(%p), current thread is %s(%p))", | - | ||||||||||||||||||
| 319 | sockfd, | - | ||||||||||||||||||
| 320 | notifier->thread() ? notifier->thread()->metaObject()->className() : "QThread", notifier->thread(), | - | ||||||||||||||||||
| 321 | thread() ? thread()->metaObject()->className() : "QThread", thread(), | - | ||||||||||||||||||
| 322 | QThread::currentThread() ? QThread::currentThread()->metaObject()->className() : "QThread", QThread::currentThread()); | - | ||||||||||||||||||
| 323 | return; never executed: return; | 0 | ||||||||||||||||||
| 324 | } | - | ||||||||||||||||||
| 325 | - | |||||||||||||||||||
| 326 | - | |||||||||||||||||||
| 327 | QEventDispatcherUNIXPrivate * const d = d_func(); | - | ||||||||||||||||||
| 328 | - | |||||||||||||||||||
| 329 | d->pendingNotifiers.removeOne(notifier); | - | ||||||||||||||||||
| 330 | - | |||||||||||||||||||
| 331 | auto i = d->socketNotifiers.find(sockfd); | - | ||||||||||||||||||
| 332 | if (i == d->socketNotifiers.end()
| 0 | ||||||||||||||||||
| 333 | return; never executed: return; | 0 | ||||||||||||||||||
| 334 | - | |||||||||||||||||||
| 335 | QSocketNotifierSetUNIX &sn_set = i.value(); | - | ||||||||||||||||||
| 336 | - | |||||||||||||||||||
| 337 | if (sn_set.notifiers[type] == nullptr
| 0 | ||||||||||||||||||
| 338 | return; never executed: return; | 0 | ||||||||||||||||||
| 339 | - | |||||||||||||||||||
| 340 | if (sn_set.notifiers[type] != notifier
| 0 | ||||||||||||||||||
| 341 | QMessageLogger(__FILE__, 448, __PRETTY_FUNCTION__).warning("%s: Multiple socket notifiers for same socket %d and type %s", | - | ||||||||||||||||||
| 342 | __PRETTY_FUNCTION__, sockfd, socketType(type)); | - | ||||||||||||||||||
| 343 | return; never executed: return; | 0 | ||||||||||||||||||
| 344 | } | - | ||||||||||||||||||
| 345 | - | |||||||||||||||||||
| 346 | sn_set.notifiers[type] = nullptr; | - | ||||||||||||||||||
| 347 | - | |||||||||||||||||||
| 348 | if (sn_set.isEmpty()
| 0 | ||||||||||||||||||
| 349 | d->socketNotifiers.erase(i); never executed: d->socketNotifiers.erase(i); | 0 | ||||||||||||||||||
| 350 | } never executed: end of block | 0 | ||||||||||||||||||
| 351 | - | |||||||||||||||||||
| 352 | bool 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 | const 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()
| 0 | ||||||||||||||||||
| 366 | && !d->interrupt.load()
| 0 | ||||||||||||||||||
| 367 | && wait_for_events
| 0 | ||||||||||||||||||
| 368 | - | |||||||||||||||||||
| 369 | if (canWait
| 0 | ||||||||||||||||||
| 370 | aboutToBlock(); never executed: aboutToBlock(); | 0 | ||||||||||||||||||
| 371 | - | |||||||||||||||||||
| 372 | if (d->interrupt.load()
| 0 | ||||||||||||||||||
| 373 | return never executed: false;return false;never executed: return false; | 0 | ||||||||||||||||||
| 374 | - | |||||||||||||||||||
| 375 | timespec *tm = nullptr; | - | ||||||||||||||||||
| 376 | timespec wait_tm = { 0, 0 }; | - | ||||||||||||||||||
| 377 | - | |||||||||||||||||||
| 378 | if (!canWait
| 0 | ||||||||||||||||||
| 379 | tm = &wait_tm; never executed: tm = &wait_tm; | 0 | ||||||||||||||||||
| 380 | - | |||||||||||||||||||
| 381 | d->pollfds.clear(); | - | ||||||||||||||||||
| 382 | d->pollfds.reserve(1 + (include_notifiers ? d->socketNotifiers.size() : 0)); | - | ||||||||||||||||||
| 383 | - | |||||||||||||||||||
| 384 | if (include_notifiers
| 0 | ||||||||||||||||||
| 385 | for (auto it = d->socketNotifiers.cbegin(); it != d->socketNotifiers.cend()
| 0 | ||||||||||||||||||
| 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 = 0; | - | ||||||||||||||||||
| 392 | - | |||||||||||||||||||
| 393 | switch (qt_safe_poll(d->pollfds.data(), d->pollfds.size(), tm)) { | - | ||||||||||||||||||
| 394 | case never executed: -1:case -1:never executed: case -1: | 0 | ||||||||||||||||||
| 395 | perror("qt_safe_poll"); | - | ||||||||||||||||||
| 396 | break; never executed: break; | 0 | ||||||||||||||||||
| 397 | case never executed: 0:case 0:never executed: case 0: | 0 | ||||||||||||||||||
| 398 | break; never executed: break; | 0 | ||||||||||||||||||
| 399 | default never executed: :default:never executed: default: | 0 | ||||||||||||||||||
| 400 | nevents += d->threadPipe.check(d->pollfds.takeLast()); | - | ||||||||||||||||||
| 401 | if (include_notifiers
| 0 | ||||||||||||||||||
| 402 | nevents += d->activateSocketNotifiers(); never executed: nevents += d->activateSocketNotifiers(); | 0 | ||||||||||||||||||
| 403 | break; never executed: break; | 0 | ||||||||||||||||||
| 404 | } | - | ||||||||||||||||||
| 405 | - | |||||||||||||||||||
| 406 | if (include_timers
| 0 | ||||||||||||||||||
| 407 | nevents += d->activateTimers(); never executed: nevents += d->activateTimers(); | 0 | ||||||||||||||||||
| 408 | - | |||||||||||||||||||
| 409 | - | |||||||||||||||||||
| 410 | return never executed: (nevents > 0);return (nevents > 0);never executed: return (nevents > 0); | 0 | ||||||||||||||||||
| 411 | } | - | ||||||||||||||||||
| 412 | - | |||||||||||||||||||
| 413 | bool QEventDispatcherUNIX::hasPendingEvents() | - | ||||||||||||||||||
| 414 | { | - | ||||||||||||||||||
| 415 | extern uint qGlobalPostedEventsCount(); | - | ||||||||||||||||||
| 416 | return never executed: qGlobalPostedEventsCount();return qGlobalPostedEventsCount();never executed: return qGlobalPostedEventsCount(); | 0 | ||||||||||||||||||
| 417 | } | - | ||||||||||||||||||
| 418 | - | |||||||||||||||||||
| 419 | int QEventDispatcherUNIX::remainingTime(int timerId) | - | ||||||||||||||||||
| 420 | { | - | ||||||||||||||||||
| 421 | - | |||||||||||||||||||
| 422 | if (timerId < 1
| 0 | ||||||||||||||||||
| 423 | QMessageLogger(__FILE__, 530, __PRETTY_FUNCTION__).warning("QEventDispatcherUNIX::remainingTime: invalid argument"); | - | ||||||||||||||||||
| 424 | return never executed: -1;return -1;never executed: return -1; | 0 | ||||||||||||||||||
| 425 | } | - | ||||||||||||||||||
| 426 | - | |||||||||||||||||||
| 427 | - | |||||||||||||||||||
| 428 | QEventDispatcherUNIXPrivate * const d = d_func(); | - | ||||||||||||||||||
| 429 | return never executed: d->timerList.timerRemainingTime(timerId);return d->timerList.timerRemainingTime(timerId);never executed: return d->timerList.timerRemainingTime(timerId); | 0 | ||||||||||||||||||
| 430 | } | - | ||||||||||||||||||
| 431 | - | |||||||||||||||||||
| 432 | void QEventDispatcherUNIX::wakeUp() | - | ||||||||||||||||||
| 433 | { | - | ||||||||||||||||||
| 434 | QEventDispatcherUNIXPrivate * const d = d_func(); | - | ||||||||||||||||||
| 435 | d->threadPipe.wakeUp(); | - | ||||||||||||||||||
| 436 | } never executed: end of block | 0 | ||||||||||||||||||
| 437 | - | |||||||||||||||||||
| 438 | void QEventDispatcherUNIX::interrupt() | - | ||||||||||||||||||
| 439 | { | - | ||||||||||||||||||
| 440 | QEventDispatcherUNIXPrivate * const d = d_func(); | - | ||||||||||||||||||
| 441 | d->interrupt.store(1); | - | ||||||||||||||||||
| 442 | wakeUp(); | - | ||||||||||||||||||
| 443 | } never executed: end of block | 0 | ||||||||||||||||||
| 444 | - | |||||||||||||||||||
| 445 | void QEventDispatcherUNIX::flush() | - | ||||||||||||||||||
| 446 | { } | - | ||||||||||||||||||
| 447 | - | |||||||||||||||||||
| 448 | - | |||||||||||||||||||
| Switch to Source code | Preprocessed file |