aboutsummaryrefslogtreecommitdiff
path: root/engines/fullpipe/messages.cpp
diff options
context:
space:
mode:
authorEugene Sandulenko2013-12-10 22:22:51 +0200
committerEugene Sandulenko2013-12-10 22:22:51 +0200
commit6e6685a53de4f0f3deb4414f59153b2d6f673b6b (patch)
treed752720537861467b9f5e31250fd15be43c72b9e /engines/fullpipe/messages.cpp
parent789b4b694f2fcfd54772feb4032653be03ca75f2 (diff)
downloadscummvm-rg350-6e6685a53de4f0f3deb4414f59153b2d6f673b6b.tar.gz
scummvm-rg350-6e6685a53de4f0f3deb4414f59153b2d6f673b6b.tar.bz2
scummvm-rg350-6e6685a53de4f0f3deb4414f59153b2d6f673b6b.zip
FULLPIPE: Remove premature optimization in GlobalMessageQueueList::compact()
This fixes freeze in intro and most probably tons of other stuff. Kudos go to eriktorbjorn for debugging it.
Diffstat (limited to 'engines/fullpipe/messages.cpp')
-rw-r--r--engines/fullpipe/messages.cpp19
1 files changed, 18 insertions, 1 deletions
diff --git a/engines/fullpipe/messages.cpp b/engines/fullpipe/messages.cpp
index 6af3f731df..c28365acc5 100644
--- a/engines/fullpipe/messages.cpp
+++ b/engines/fullpipe/messages.cpp
@@ -557,16 +557,33 @@ void GlobalMessageQueueList::disableQueueById(int id) {
}
int GlobalMessageQueueList::compact() {
+ int *useList = new int[size() + 2];
+
+ for (uint i = 0; i < size() + 2; i++)
+ useList[i] = 0;
+
for (uint i = 0; i < size();) {
if (((MessageQueue *)_storage[i])->_isFinished) {
disableQueueById(_storage[i]->_id);
remove_at(i);
} else {
+ if (_storage[i]->_id < size() + 2)
+ useList[_storage[i]->_id] = 1;
i++;
}
}
- return size() + 1;
+ uint i;
+
+ for (i = 1; i < size() + 2; i++) {
+ if (!useList[i]) {
+ delete [] useList;
+
+ return i;
+ }
+ }
+
+ return i;
}
void GlobalMessageQueueList::addMessageQueue(MessageQueue *msg) {