summaryrefslogtreecommitdiffstats
path: root/src/imports/wifi
diff options
context:
space:
mode:
authorGatis Paeglis <gatis.paeglis@digia.com>2014-01-29 19:07:20 +0100
committerGatis Paeglis <gatis.paeglis@digia.com>2014-01-30 12:38:11 +0200
commiteb7f5c21121d7a5fe86b52ec04337d77bc9f3cf4 (patch)
treebe5e71e3d2df85c8e583461b6ca39631b21b78a6 /src/imports/wifi
parentefafdf26f8ab2a0619b7d211246a1a1e7e15f688 (diff)
Make sure that wifi event thread doesn't block on exit
After setting m_exitEventThread to True we need to generate wifi event, otherwise there might be cases that we block in wifi_wait_for_event and wifi event thread never exits. Change-Id: I699ca0c25e23abc7045c1850bf773443bac897e8 Reviewed-by: Eirik Aavitsland <eirik.aavitsland@digia.com>
Diffstat (limited to 'src/imports/wifi')
-rw-r--r--src/imports/wifi/qwifimanager.cpp22
-rw-r--r--src/imports/wifi/qwifimanager.h4
2 files changed, 18 insertions, 8 deletions
diff --git a/src/imports/wifi/qwifimanager.cpp b/src/imports/wifi/qwifimanager.cpp
index e5ed67e..9139242 100644
--- a/src/imports/wifi/qwifimanager.cpp
+++ b/src/imports/wifi/qwifimanager.cpp
@@ -92,8 +92,6 @@ public:
if (QT_WIFI_DEBUG) qDebug("EventReceiver thread is running");
char buffer[2048];
while (1) {
- if (m_manager->exiting())
- return;
int size = wifi_wait_for_event(m_if.constData(), buffer, sizeof(buffer) - 1);
if (size > 0) {
buffer[size] = 0;
@@ -102,6 +100,8 @@ public:
char *event = &buffer[11];
if (strstr(event, "SCAN-RESULTS")) {
+ if (m_manager->exitingEventThread())
+ return;
QWifiManagerEvent *e = new QWifiManagerEvent(WIFI_SCAN_RESULTS);
QCoreApplication::postEvent(m_manager, e);
} else if (strstr(event, "CONNECTED")) {
@@ -125,7 +125,7 @@ QWifiManager::QWifiManager()
, m_scanTimer(0)
, m_scanning(false)
, m_daemonClientSocket(0)
- , m_exiting(false)
+ , m_exitingEventThread(false)
{
char interface[PROPERTY_VALUE_MAX];
property_get(WIFI_INTERFACE, interface, NULL);
@@ -160,8 +160,14 @@ QWifiManager::QWifiManager()
QWifiManager::~QWifiManager()
{
- m_exiting = true;
- m_eventThread->wait();
+ // exit event thread if it is running
+ if (m_eventThread->isRunning()) {
+ m_exitingEventThread = true;
+ call("SCAN");
+ m_eventThread->wait();
+ }
+ delete m_eventThread;
+ delete m_daemonClientSocket;
}
void QWifiManager::handleDhcpReply()
@@ -236,13 +242,17 @@ void QWifiManager::connectToBackend()
return;
}
if (QT_WIFI_DEBUG) qDebug("QWifiManager: started successfully");
+ m_exitingEventThread = false;
m_eventThread->start();
handleConnected();
}
void QWifiManager::disconnectFromBackend()
{
- m_eventThread->quit();
+ m_exitingEventThread = true;
+ call("SCAN");
+ m_eventThread->wait();
+
if (wifi_stop_supplicant(0) < 0)
qWarning("QWifiManager: failed to stop supplicant");
wifi_close_supplicant_connection(m_interface.constData());
diff --git a/src/imports/wifi/qwifimanager.h b/src/imports/wifi/qwifimanager.h
index 85384cc..c9ba2ef 100644
--- a/src/imports/wifi/qwifimanager.h
+++ b/src/imports/wifi/qwifimanager.h
@@ -56,7 +56,7 @@ public:
void setScanning(bool scanning);
NetworkState networkState() const { return m_state; }
bool isbackendReady() const { return m_backendReady; }
- bool exiting() const { return m_exiting; }
+ bool exitingEventThread() const { return m_exitingEventThread; }
public slots:
void start();
@@ -98,7 +98,7 @@ private:
NetworkState m_state;
QLocalSocket *m_daemonClientSocket;
QByteArray m_request;
- bool m_exiting;
+ bool m_exitingEventThread;
};
#endif // QWIFIMANAGER_H