121QSocketNotifier::QSocketNotifier(Type type, QObject *parent)
122 : QObject(*
new QSocketNotifierPrivate, parent)
124 Q_D(QSocketNotifier);
126 qRegisterMetaType<QSocketDescriptor>();
127 qRegisterMetaType<QSocketNotifier::Type>();
145QSocketNotifier::QSocketNotifier(qintptr socket, Type type, QObject *parent)
146 : QSocketNotifier(type, parent)
148 Q_D(QSocketNotifier);
153 auto thisThreadData = d->threadData.loadRelaxed();
155 if (!d->sockfd.isValid())
156 qWarning(
"QSocketNotifier: Invalid socket specified");
157 else if (
auto dispatcher = thisThreadData->eventDispatcher.loadRelaxed())
158 dispatcher->registerSocketNotifier(
this);
160 qWarning(
"QSocketNotifier: current thread's event dispatcher has already been destroyed");
281void QSocketNotifier::setEnabled(
bool enable)
283 Q_D(QSocketNotifier);
284 if (!d->sockfd.isValid())
286 if (d->snenabled == enable)
288 d->snenabled = enable;
291 auto thisThreadData = d->threadData.loadRelaxed();
293 if (!thisThreadData->hasEventDispatcher())
295 if (Q_UNLIKELY(thread() != QThread::currentThread())) {
296 qWarning(
"QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread");
300 thisThreadData->eventDispatcher.loadRelaxed()->registerSocketNotifier(
this);
302 thisThreadData->eventDispatcher.loadRelaxed()->unregisterSocketNotifier(
this);
308bool QSocketNotifier::event(QEvent *e)
310 Q_D(QSocketNotifier);
314 case QEvent::ThreadChange:
316 QMetaObject::invokeMethod(
this,
"setEnabled", Qt::QueuedConnection,
317 Q_ARG(
bool, d->snenabled));
321 case QEvent::SockAct:
322 case QEvent::SockClose:
324 QPointer<QSocketNotifier> alive(
this);
325 emit activated(d->sockfd, d->sntype, QPrivateSignal());
328 emit activated(
int(qintptr(d->sockfd)), QPrivateSignal());
334 return QObject::event(e);