linuxdcpp-team team mailing list archive
-
linuxdcpp-team team
-
Mailing list archive
-
Message #05636
[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);