120QSocketNotifier::QSocketNotifier(Type type, QObject *parent)
121 : QObject(*
new QSocketNotifierPrivate, parent)
123 Q_D(QSocketNotifier);
125 qRegisterMetaType<QSocketDescriptor>();
126 qRegisterMetaType<QSocketNotifier::Type>();
144QSocketNotifier::QSocketNotifier(qintptr socket, Type type, QObject *parent)
145 : QSocketNotifier(type, parent)
147 Q_D(QSocketNotifier);
152 auto thisThreadData = d->threadData.loadRelaxed();
154 if (!d->sockfd.isValid())
155 qWarning(
"QSocketNotifier: Invalid socket specified");
156 else if (!thisThreadData->hasEventDispatcher())
157 qWarning(
"QSocketNotifier: Can only be used with threads started with QThread");
159 thisThreadData->eventDispatcher.loadRelaxed()->registerSocketNotifier(
this);
280void QSocketNotifier::setEnabled(
bool enable)
282 Q_D(QSocketNotifier);
283 if (!d->sockfd.isValid())
285 if (d->snenabled == enable)
287 d->snenabled = enable;
290 auto thisThreadData = d->threadData.loadRelaxed();
292 if (!thisThreadData->hasEventDispatcher())
294 if (Q_UNLIKELY(thread() != QThread::currentThread())) {
295 qWarning(
"QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread");
299 thisThreadData->eventDispatcher.loadRelaxed()->registerSocketNotifier(
this);
301 thisThreadData->eventDispatcher.loadRelaxed()->unregisterSocketNotifier(
this);
307bool QSocketNotifier::event(QEvent *e)
309 Q_D(QSocketNotifier);
313 case QEvent::ThreadChange:
315 QMetaObject::invokeMethod(
this,
"setEnabled", Qt::QueuedConnection,
316 Q_ARG(
bool, d->snenabled));
320 case QEvent::SockAct:
321 case QEvent::SockClose:
323 QPointer<QSocketNotifier> alive(
this);
324 emit activated(d->sockfd, d->sntype, QPrivateSignal());
327 emit activated(
int(qintptr(d->sockfd)), QPrivateSignal());
333 return QObject::event(e);