Added a new lock specific to deleting, and improved safety

This commit is contained in:
barnold1953 2014-05-23 11:17:55 -07:00
parent 9553271fa1
commit 6817c9682e
2 changed files with 28 additions and 16 deletions

View file

@ -39,6 +39,8 @@ void Overlays::init(QGLWidget* parent) {
}
void Overlays::update(float deltatime) {
{
QWriteLocker lock(&_lock);
foreach(Overlay* thisOverlay, _overlays2D) {
thisOverlay->update(deltatime);
@ -46,8 +48,13 @@ void Overlays::update(float deltatime) {
foreach(Overlay* thisOverlay, _overlays3D) {
thisOverlay->update(deltatime);
}
while (!_overlaysToDelete.isEmpty()) {
}
if (!_overlaysToDelete.isEmpty()) {
QWriteLocker lock(&_deleteLock);
do {
delete _overlaysToDelete.takeLast();
} while (!_overlaysToDelete.isEmpty());
}
}
@ -172,6 +179,8 @@ bool Overlays::editOverlay(unsigned int id, const QScriptValue& properties) {
void Overlays::deleteOverlay(unsigned int id) {
Overlay* overlayToDelete;
{
QWriteLocker lock(&_lock);
if (_overlays2D.contains(id)) {
overlayToDelete = _overlays2D.take(id);
@ -180,7 +189,9 @@ void Overlays::deleteOverlay(unsigned int id) {
} else {
return;
}
}
QWriteLocker lock(&_deleteLock);
_overlaysToDelete.push_back(overlayToDelete);
}

View file

@ -46,6 +46,7 @@ private:
unsigned int _nextOverlayID;
QGLWidget* _parent;
QReadWriteLock _lock;
QReadWriteLock _deleteLock;
};