summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2009-01-21 12:23:08 +0000
committerrubidium <rubidium@openttd.org>2009-01-21 12:23:08 +0000
commit4bf2326bd1cbcd5b51c39376c8da9802edbf9e07 (patch)
tree3bd6bdc69efbe82a4204c3e678df33c30b146376 /src
parent727ffeedc90133e61cad00334a10e8d35526c287 (diff)
downloadopenttd-4bf2326bd1cbcd5b51c39376c8da9802edbf9e07.tar.xz
(svn r15195) -Fix: don't crash when removing from something you're iterating over
Diffstat (limited to 'src')
-rw-r--r--src/network/network_content.cpp30
1 files changed, 20 insertions, 10 deletions
diff --git a/src/network/network_content.cpp b/src/network/network_content.cpp
index 66c2c2d5d..f0521f0b5 100644
--- a/src/network/network_content.cpp
+++ b/src/network/network_content.cpp
@@ -750,29 +750,37 @@ void ClientNetworkContentSocketHandler::CheckDependencyState(ContentInfo *ci)
void ClientNetworkContentSocketHandler::OnConnect(bool success)
{
- for (ContentCallback **iter = this->callbacks.Begin(); iter != this->callbacks.End(); iter++) {
- (*iter)->OnConnect(success);
+ for (ContentCallback **iter = this->callbacks.Begin(); iter != this->callbacks.End(); /* nothing */) {
+ ContentCallback *cb = *iter;
+ cb->OnConnect(success);
+ if (*iter != cb) iter++;
}
}
void ClientNetworkContentSocketHandler::OnDisconnect()
{
- for (ContentCallback **iter = this->callbacks.Begin(); iter != this->callbacks.End(); iter++) {
- (*iter)->OnDisconnect();
+ for (ContentCallback **iter = this->callbacks.Begin(); iter != this->callbacks.End(); /* nothing */) {
+ ContentCallback *cb = *iter;
+ cb->OnDisconnect();
+ if (*iter != cb) iter++;
}
}
void ClientNetworkContentSocketHandler::OnReceiveContentInfo(const ContentInfo *ci)
{
- for (ContentCallback **iter = this->callbacks.Begin(); iter != this->callbacks.End(); iter++) {
- (*iter)->OnReceiveContentInfo(ci);
+ for (ContentCallback **iter = this->callbacks.Begin(); iter != this->callbacks.End(); /* nothing */) {
+ ContentCallback *cb = *iter;
+ cb->OnReceiveContentInfo(ci);
+ if (*iter != cb) iter++;
}
}
void ClientNetworkContentSocketHandler::OnDownloadProgress(const ContentInfo *ci, uint bytes)
{
- for (ContentCallback **iter = this->callbacks.Begin(); iter != this->callbacks.End(); iter++) {
- (*iter)->OnDownloadProgress(ci, bytes);
+ for (ContentCallback **iter = this->callbacks.Begin(); iter != this->callbacks.End(); /* nothing */) {
+ ContentCallback *cb = *iter;
+ cb->OnDownloadProgress(ci, bytes);
+ if (*iter != cb) iter++;
}
}
@@ -783,8 +791,10 @@ void ClientNetworkContentSocketHandler::OnDownloadComplete(ContentID cid)
ci->state = ContentInfo::ALREADY_HERE;
}
- for (ContentCallback **iter = this->callbacks.Begin(); iter != this->callbacks.End(); iter++) {
- (*iter)->OnDownloadComplete(cid);
+ for (ContentCallback **iter = this->callbacks.Begin(); iter != this->callbacks.End(); /* nothing */) {
+ ContentCallback *cb = *iter;
+ cb->OnDownloadComplete(cid);
+ if (*iter != cb) iter++;
}
}