summaryrefslogtreecommitdiffstats
path: root/src/imports
diff options
context:
space:
mode:
Diffstat (limited to 'src/imports')
-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