summaryrefslogtreecommitdiffstats
path: root/src/corelib/io/qwinoverlappedionotifier.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/io/qwinoverlappedionotifier.cpp')
-rw-r--r--src/corelib/io/qwinoverlappedionotifier.cpp21
1 files changed, 18 insertions, 3 deletions
diff --git a/src/corelib/io/qwinoverlappedionotifier.cpp b/src/corelib/io/qwinoverlappedionotifier.cpp
index c084912897..8fa3648987 100644
--- a/src/corelib/io/qwinoverlappedionotifier.cpp
+++ b/src/corelib/io/qwinoverlappedionotifier.cpp
@@ -161,12 +161,20 @@ private:
QMutex mutex;
};
-Q_GLOBAL_STATIC(QWinIoCompletionPort, iocp)
+QWinIoCompletionPort *QWinOverlappedIoNotifier::iocp = 0;
+HANDLE QWinOverlappedIoNotifier::iocpInstanceLock = CreateMutex(NULL, FALSE, NULL);
+unsigned int QWinOverlappedIoNotifier::iocpInstanceRefCount = 0;
QWinOverlappedIoNotifier::QWinOverlappedIoNotifier(QObject *parent)
: QObject(parent),
hHandle(INVALID_HANDLE_VALUE)
{
+ WaitForSingleObject(iocpInstanceLock, INFINITE);
+ if (!iocp)
+ iocp = new QWinIoCompletionPort;
+ iocpInstanceRefCount++;
+ ReleaseMutex(iocpInstanceLock);
+
hSemaphore = CreateSemaphore(NULL, 0, 255, NULL);
hResultsMutex = CreateMutex(NULL, FALSE, NULL);
connect(this, &QWinOverlappedIoNotifier::_q_notify,
@@ -178,6 +186,13 @@ QWinOverlappedIoNotifier::~QWinOverlappedIoNotifier()
setEnabled(false);
CloseHandle(hResultsMutex);
CloseHandle(hSemaphore);
+
+ WaitForSingleObject(iocpInstanceLock, INFINITE);
+ if (!--iocpInstanceRefCount) {
+ delete iocp;
+ iocp = 0;
+ }
+ ReleaseMutex(iocpInstanceLock);
}
void QWinOverlappedIoNotifier::setHandle(HANDLE h)
@@ -188,9 +203,9 @@ void QWinOverlappedIoNotifier::setHandle(HANDLE h)
void QWinOverlappedIoNotifier::setEnabled(bool enabled)
{
if (enabled)
- iocp()->registerNotifier(this);
+ iocp->registerNotifier(this);
else
- iocp()->unregisterNotifier(this);
+ iocp->unregisterNotifier(this);
}
/*!