linuxdcpp-team team mailing list archive
-
linuxdcpp-team team
-
Mailing list archive
-
Message #06749
[Branch ~dcplusplus-team/dcplusplus/trunk] Rev 3255: forgot some locks
------------------------------------------------------------
revno: 3255
committer: poy <poy@xxxxxxxxxx>
branch nick: trunk
timestamp: Fri 2013-04-12 20:35:46 +0200
message:
forgot some locks
modified:
dcpp/HttpManager.cpp
dcpp/HttpManager.h
--
lp:dcplusplus
https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk
Your team Dcplusplus-team is subscribed to branch lp:dcplusplus.
To unsubscribe from this branch go to https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk/+edit-subscription
=== modified file 'dcpp/HttpManager.cpp'
--- dcpp/HttpManager.cpp 2013-04-12 18:24:09 +0000
+++ dcpp/HttpManager.cpp 2013-04-12 18:35:46 +0000
@@ -50,13 +50,16 @@
}
HttpConnection* HttpManager::makeConn(string&& url) {
- Lock l(cs);
- Conn conn { new HttpConnection(), string(), 0 };
- conns.push_back(move(conn));
- conn.c->addListener(this);
- conn.c->setUrl(move(url));
- fire(HttpManagerListener::Added(), conn.c);
- return conn.c;
+ auto c = new HttpConnection();
+ {
+ Lock l(cs);
+ Conn conn { c, string(), 0 };
+ conns.push_back(move(conn));
+ }
+ c->addListener(this);
+ c->setUrl(move(url));
+ fire(HttpManagerListener::Added(), c);
+ return c;
}
HttpManager::Conn* HttpManager::findConn(HttpConnection* c) {
@@ -68,31 +71,40 @@
return nullptr;
}
-void HttpManager::remove(Conn& conn) {
- conn.remove = GET_TICK() + 60 * 1000;
+void HttpManager::removeLater(HttpConnection* c) {
+ Lock l(cs);
+ findConn(c)->remove = GET_TICK() + 60 * 1000;
}
void HttpManager::on(HttpConnectionListener::Data, HttpConnection* c, const uint8_t* data, size_t len) noexcept {
- Lock l(cs);
- auto& buf = findConn(c)->buf;
- if(buf.empty() && c->getSize() != -1) {
- buf.reserve(c->getSize());
+ {
+ Lock l(cs);
+ auto& buf = findConn(c)->buf;
+ if(buf.empty() && c->getSize() != -1) {
+ buf.reserve(c->getSize());
+ }
+ buf.append(reinterpret_cast<const char*>(data), len);
}
- buf.append(reinterpret_cast<const char*>(data), len);
fire(HttpManagerListener::Updated(), c);
}
void HttpManager::on(HttpConnectionListener::Failed, HttpConnection* c, const string& str) noexcept {
- auto& conn = *findConn(c);
- conn.buf.clear();
+ {
+ Lock l(cs);
+ findConn(c)->buf.clear();
+ }
fire(HttpManagerListener::Failed(), c, str);
- remove(conn);
+ removeLater(c);
}
void HttpManager::on(HttpConnectionListener::Complete, HttpConnection* c) noexcept {
- auto& conn = *findConn(c);
- fire(HttpManagerListener::Complete(), c, move(conn.buf));
- remove(conn);
+ string buf;
+ {
+ Lock l(cs);
+ buf = move(findConn(c)->buf);
+ }
+ fire(HttpManagerListener::Complete(), c, move(buf));
+ removeLater(c);
}
void HttpManager::on(HttpConnectionListener::Redirected, HttpConnection* c) noexcept {
@@ -102,20 +114,27 @@
void HttpManager::on(HttpConnectionListener::Retried, HttpConnection* c, bool connected) noexcept {
if(connected) {
+ Lock l(cs);
findConn(c)->buf.clear();
}
}
void HttpManager::on(TimerManagerListener::Minute, uint64_t tick) noexcept {
+ vector<HttpConnection*> removed;
+
Lock l(cs);
- conns.erase(std::remove_if(conns.begin(), conns.end(), [tick, this](const Conn& conn) -> bool {
+ conns.erase(std::remove_if(conns.begin(), conns.end(), [tick, &removed](const Conn& conn) -> bool {
if(conn.remove && tick > conn.remove) {
- fire(HttpManagerListener::Removed(), conn.c);
- delete conn.c;
+ removed.push_back(conn.c);
return true;
}
return false;
}), conns.end());
+
+ for(auto c: removed) {
+ fire(HttpManagerListener::Removed(), c);
+ delete c;
+ }
}
} // namespace dcpp
=== modified file 'dcpp/HttpManager.h'
--- dcpp/HttpManager.h 2013-04-12 18:24:09 +0000
+++ dcpp/HttpManager.h 2013-04-12 18:35:46 +0000
@@ -56,7 +56,7 @@
HttpConnection* makeConn(string&& url);
Conn* findConn(HttpConnection* c);
- void remove(Conn& conn);
+ void removeLater(HttpConnection* c);
// HttpConnectionListener
void on(HttpConnectionListener::Data, HttpConnection*, const uint8_t*, size_t) noexcept;