History

fixes leak of GenericThread and also fixes crash in octree servers on client disconnect

Brad Hefta-Gaub committed 12 years ago

Commit f97ab1d1 parent b4c963b4 files · +29 −21Browse files

Showing the changes to libraries/shared/src/GenericThread.cpp (1 of 4 files). Show all

Unified · Split

libraries/shared/src/GenericThread.cpp+14−8
@@ -8,8 +8,11 @@ · 7 unmodified lines
8// Generic Threaded or non-threaded processing class8// Generic Threaded or non-threaded processing class
9//9//
10 10
11#include <QDebug>
12
11#include "GenericThread.h"13#include "GenericThread.h"
12 14
15
13GenericThread::GenericThread() :16GenericThread::GenericThread() :
14 _stopThread(false),17 _stopThread(false),
15 _isThreaded(false) // assume non-threaded, must call initialize()18 _isThreaded(false) // assume non-threaded, must call initialize()
@@ -23,15 +26,11 @@ GenericThread::~GenericThread() { · 7 unmodified lines
23void GenericThread::initialize(bool isThreaded) {26void GenericThread::initialize(bool isThreaded) {
24 _isThreaded = isThreaded;27 _isThreaded = isThreaded;
25 if (_isThreaded) {28 if (_isThreaded) {
26 QThread* _thread = new QThread(this);29 _thread = new QThread(this);
27 30
28 // when the worker thread is started, call our engine's run..31 // when the worker thread is started, call our engine's run..
29 connect(_thread, SIGNAL(started()), this, SLOT(threadRoutine()));32 connect(_thread, SIGNAL(started()), this, SLOT(threadRoutine()));
30 33
31 // XXXBHG: this is a known memory leak/thread leak. I will fix this shortly.
32 //connect(this, SIGNAL(finished()), this, SLOT(deleteLater()));
33 //connect(_thread, SIGNAL(finished()), _thread, SLOT(deleteLater()));
34
35 this->moveToThread(_thread);34 this->moveToThread(_thread);
36 35
37 // Starts an event loop, and emits _thread->started()36 // Starts an event loop, and emits _thread->started()
@@ -42,7 +41,11 @@ void GenericThread::initialize(bool isThreaded) { · 4 unmodified lines
42void GenericThread::terminate() {41void GenericThread::terminate() {
43 if (_isThreaded) {42 if (_isThreaded) {
44 _stopThread = true;43 _stopThread = true;
45 //_isThreaded = false;44
45 if (_thread) {
46 _thread->wait();
47 _thread->deleteLater();
48 }
46 }49 }
47}50}
48 51
@@ -61,7 +64,10 @@ void GenericThread::threadRoutine() { · 12 unmodified lines
61 }64 }
62 }65 }
63 66
64 if (_isThreaded) {67 // If we were on a thread, then wait till it's done
65 emit finished();68 if (_isThreaded && _thread) {
69 _thread->quit();
66 }70 }
71
72 emit finished();
67}73}