← Back to team overview

linuxdcpp-team team mailing list archive

[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;