← Back to team overview

linuxdcpp-team team mailing list archive

[Branch ~dcplusplus-team/dcplusplus/trunk] Rev 2928: fix double-locking when creating an upload

 

------------------------------------------------------------
revno: 2928
committer: poy <poy@xxxxxxxxxx>
branch nick: trunk
timestamp: Sun 2012-05-27 14:53:12 +0200
message:
  fix double-locking when creating an upload
modified:
  dcpp/HubSettings.cpp
  dcpp/HubSettings.h
  dcpp/UploadManager.cpp
  dcpp/UploadManager.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/HubSettings.cpp'
--- dcpp/HubSettings.cpp	2012-05-24 17:47:25 +0000
+++ dcpp/HubSettings.cpp	2012-05-27 12:53:12 +0000
@@ -21,14 +21,19 @@
 
 namespace dcpp {
 
-const string HubSettings::stringNames[HubStrLast - HubStrFirst] = {
+const string HubSettings::stringNames[StringCount] = {
 	"Nick", "UserDescription", "Email", "UserIp" // not "Description" for compat with prev fav hub lists
 };
-const string HubSettings::boolNames[HubBoolLast - HubBoolFirst] = {
+const string HubSettings::boolNames[BoolCount] = {
 	"ShowJoins", "FavShowJoins"
 };
 
-HubSettings::HubSettings () {
+namespace {
+inline bool defined(const string& s) { return !s.empty(); }
+inline bool defined(tribool b) { return !indeterminate(b); }
+}
+
+HubSettings::HubSettings() {
 	// tribools default to false; init them to an indeterminate value.
 	for(auto& setting: bools) {
 		setting = indeterminate;
@@ -52,35 +57,35 @@
 }
 
 void HubSettings::merge(const HubSettings& sub) {
-	for(uint8_t i = 0; i < HubStrLast - HubStrFirst; ++i) {
-		if(!sub.strings[i].empty()) {
+	for(uint8_t i = 0; i < StringCount; ++i) {
+		if(defined(sub.strings[i])) {
 			strings[i] = sub.strings[i];
 		}
 	}
-	for(uint8_t i = 0; i < HubBoolLast - HubBoolFirst; ++i) {
-		if(!indeterminate(sub.bools[i])) {
+	for(uint8_t i = 0; i < BoolCount; ++i) {
+		if(defined(sub.bools[i])) {
 			bools[i] = sub.bools[i];
 		}
 	}
 }
 
 void HubSettings::load(SimpleXML& xml) {
-	for(uint8_t i = 0; i < HubStrLast - HubStrFirst; ++i) {
+	for(uint8_t i = 0; i < StringCount; ++i) {
 		strings[i] = xml.getChildAttrib(stringNames[i]);
 	}
-	for(uint8_t i = 0; i < HubBoolLast - HubBoolFirst; ++i) {
+	for(uint8_t i = 0; i < BoolCount; ++i) {
 		bools[i] = to3bool(xml.getIntChildAttrib(boolNames[i]));
 	}
 }
 
 void HubSettings::save(SimpleXML& xml) const {
-	for(uint8_t i = 0; i < HubStrLast - HubStrFirst; ++i) {
-		if(!strings[i].empty()) {
+	for(uint8_t i = 0; i < StringCount; ++i) {
+		if(defined(strings[i])) {
 			xml.addChildAttrib(stringNames[i], strings[i]);
 		}
 	}
-	for(uint8_t i = 0; i < HubBoolLast - HubBoolFirst; ++i) {
-		if(!indeterminate(bools[i])) {
+	for(uint8_t i = 0; i < BoolCount; ++i) {
+		if(defined(bools[i])) {
 			xml.addChildAttrib(boolNames[i], toInt(bools[i]));
 		}
 	}

=== modified file 'dcpp/HubSettings.h'
--- dcpp/HubSettings.h	2012-05-24 17:47:25 +0000
+++ dcpp/HubSettings.h	2012-05-27 12:53:12 +0000
@@ -69,11 +69,14 @@
 	void save(SimpleXML& xml) const;
 
 private:
-	static const string stringNames[HubStrLast - HubStrFirst];
-	static const string boolNames[HubBoolLast - HubBoolFirst];
-
-	string strings[HubStrLast - HubStrFirst];
-	tribool bools[HubBoolLast - HubBoolFirst];
+	enum { StringCount = HubStrLast - HubStrFirst,
+		BoolCount = HubBoolLast - HubBoolFirst };
+
+	static const string stringNames[StringCount];
+	static const string boolNames[BoolCount];
+
+	string strings[StringCount];
+	tribool bools[BoolCount];
 };
 
 } // namespace dcpp

=== modified file 'dcpp/UploadManager.cpp'
--- dcpp/UploadManager.cpp	2012-03-03 19:33:45 +0000
+++ dcpp/UploadManager.cpp	2012-05-27 12:53:12 +0000
@@ -84,11 +84,10 @@
 				string bz2 = File(sourceFile, File::READ, File::OPEN).read();
 				string xml;
 				CryptoManager::getInstance()->decodeBZ2(reinterpret_cast<const uint8_t*>(bz2.data()), bz2.size(), xml);
-				// Clear to save some memory...
-				string().swap(bz2);
 				is = new MemoryInputStream(xml);
 				start = 0;
 				size = xml.size();
+
 			} else {
 				File* f = new File(sourceFile, File::READ, File::OPEN);
 
@@ -111,6 +110,7 @@
 				}
 			}
 			type = userlist ? Transfer::TYPE_FULL_LIST : Transfer::TYPE_FILE;
+
 		} else if(aType == Transfer::names[Transfer::TYPE_TREE]) {
 			sourceFile = ShareManager::getInstance()->toReal(aFile);
 			MemoryInputStream* mis = ShareManager::getInstance()->getTree(aFile);
@@ -124,10 +124,11 @@
 			is = mis;
 			free = true;
 			type = Transfer::TYPE_TREE;
+
 		} else if(aType == Transfer::names[Transfer::TYPE_PARTIAL_LIST]) {
 			// Partial file list
 			MemoryInputStream* mis = ShareManager::getInstance()->generatePartialList(aFile, listRecursive);
-			if(mis == NULL) {
+			if(!mis) {
 				aSource.fileNotAvail();
 				return false;
 			}
@@ -137,6 +138,7 @@
 			is = mis;
 			free = true;
 			type = Transfer::TYPE_PARTIAL_LIST;
+
 		} else {
 			aSource.fileNotAvail("Unknown file type");
 			return false;
@@ -150,12 +152,10 @@
 		return false;
 	}
 
-	Lock l(cs);
-
 	bool extraSlot = false;
 
 	if(!aSource.isSet(UserConnection::FLAG_HASSLOT)) {
-		bool hasReserved = (reservedSlots.find(aSource.getUser()) != reservedSlots.end());
+		bool hasReserved = hasReservedSlot(aSource.getUser());
 		bool isFavorite = FavoriteManager::getInstance()->hasSlot(aSource.getUser());
 
 		if(!(hasReserved || isFavorite || getFreeSlots() > 0 || getAutoSlot())) {
@@ -184,6 +184,8 @@
 		setLastGrant(GET_TICK());
 	}
 
+	Lock l(cs);
+
 	Upload* u = new Upload(aSource, sourceFile, TTHValue());
 	u->setStream(is);
 	u->setSegment(Segment(start, size));
@@ -249,6 +251,11 @@
 		ClientManager::getInstance()->connect(aUser, Util::toString(Util::rand()));
 }
 
+bool UploadManager::hasReservedSlot(const UserPtr& user) const {
+	Lock l(cs);
+	return reservedSlots.find(user) != reservedSlots.end();
+}
+
 void UploadManager::on(UserConnectionListener::Get, UserConnection* aSource, const string& aFile, int64_t aResume) noexcept {
 	if(aSource->getState() != UserConnection::STATE_GET) {
 		dcdebug("UM::onGet Bad state, ignoring\n");

=== modified file 'dcpp/UploadManager.h'
--- dcpp/UploadManager.h	2012-01-13 20:55:20 +0000
+++ dcpp/UploadManager.h	2012-05-27 12:53:12 +0000
@@ -106,6 +106,7 @@
 	UploadManager() noexcept;
 	virtual ~UploadManager();
 
+	bool hasReservedSlot(const UserPtr& user) const;
 	bool getAutoSlot();
 	void removeConnection(UserConnection* aConn);
 	void removeUpload(Upload* aUpload);