linuxdcpp-team team mailing list archive
-
linuxdcpp-team team
-
Mailing list archive
-
Message #06721
[Branch ~dcplusplus-team/dcplusplus/trunk] Rev 3240: ditch TaskQueue
------------------------------------------------------------
revno: 3240
committer: poy <poy@xxxxxxxxxx>
branch nick: trunk
timestamp: Tue 2013-03-26 23:03:28 +0100
message:
ditch TaskQueue
removed:
dcpp/TaskQueue.h
modified:
win32/HubFrame.cpp
win32/HubFrame.h
win32/TransferView.cpp
win32/TransferView.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
=== removed file 'dcpp/TaskQueue.h'
--- dcpp/TaskQueue.h 2013-01-18 21:28:38 +0000
+++ dcpp/TaskQueue.h 1970-01-01 00:00:00 +0000
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2001-2013 Jacek Sieka, arnetheduck on gmail point com
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef DCPLUSPLUS_DCPP_TASK_H
-#define DCPLUSPLUS_DCPP_TASK_H
-
-#include <memory>
-#include <vector>
-
-#include <boost/noncopyable.hpp>
-
-#include "CriticalSection.h"
-
-namespace dcpp {
-
-using std::pair;
-using std::unique_ptr;
-using std::vector;
-
-struct Task {
- virtual ~Task() { };
-};
-
-struct StringTask : Task {
- StringTask(string str) : str(move(str)) { }
- string str;
-};
-
-template<bool threadsafe>
-class TaskQueue : private boost::noncopyable {
-protected:
- typedef vector<pair<int, unique_ptr<Task>>> List;
-
-public:
- void add(int type, std::unique_ptr<Task> && data) { tasks.emplace_back(type, move(data)); }
- List get() { return move(tasks); }
- void clear() { tasks.clear(); }
-
-private:
- List tasks;
-};
-
-template<>
-class TaskQueue<true> : public TaskQueue<false> {
- typedef TaskQueue<false> BaseType;
-
-public:
- void add(int type, std::unique_ptr<Task> && data) { Lock l(cs); BaseType::add(type, move(data)); }
- List get() { Lock l(cs); return BaseType::get(); }
- void clear() { Lock l(cs); BaseType::clear(); }
-
-private:
- CriticalSection cs;
-};
-
-} // namespace dcpp
-
-#endif
=== modified file 'win32/HubFrame.cpp'
--- win32/HubFrame.cpp 2013-03-16 14:57:07 +0000
+++ win32/HubFrame.cpp 2013-03-26 22:03:28 +0000
@@ -66,7 +66,7 @@
{ N_("CID"), 300, false}
};
-HubFrame::FrameList HubFrame::frames;
+decltype(HubFrame::frames) HubFrame::frames;
void HubFrame::openWindow(TabViewPtr parent, string url, bool activate, bool connect) {
Util::sanitizeUrl(url);
@@ -175,12 +175,12 @@
showUsers(0),
client(0),
url(url),
-updateUsers(false),
selCount(0),
statusDirty(true),
waitingForPW(false),
resort(false),
confirmClose(true),
+updateUsers(false),
currentUser(0),
hubMenu(false),
inTabComplete(false)
@@ -619,28 +619,14 @@
void HubFrame::execTasks() {
updateUsers = false;
- auto t = tasks.get();
HoldRedraw hold { users };
- for(auto& i: t) {
- if(i.first == UPDATE_USER) {
- updateUser(static_cast<UserTask&>(*i.second));
- } else if(i.first == UPDATE_USER_JOIN) {
- UserTask& u = static_cast<UserTask&>(*i.second);
- if(updateUser(u)) {
- if(client->get(HubSettings::ShowJoins) || (client->get(HubSettings::FavShowJoins) && FavoriteManager::getInstance()->isFavoriteUser(u.user))) {
- addStatus(str(TF_("Joins: %1%") % Text::toT(u.identity.getNick())));
- }
- }
- } else if(i.first == REMOVE_USER) {
- UserTask& u = static_cast<UserTask&>(*i.second);
- removeUser(u.user);
- if(client->get(HubSettings::ShowJoins) || (client->get(HubSettings::FavShowJoins) && FavoriteManager::getInstance()->isFavoriteUser(u.user))) {
- addStatus(str(TF_("Parts: %1%") % Text::toT(u.identity.getNick())));
- }
- }
+ for(auto& task: tasks) {
+ task.first(*task.second);
}
+ tasks.clear();
+
if(resort && showUsers->getChecked()) {
users->resort();
resort = false;
@@ -889,7 +875,7 @@
}
HubFrame::UserTask::UserTask(const OnlineUser& ou) :
-user(ou.getUser(), ou.getClient().getHubUrl()),
+user(ou),
identity(ou.getIdentity())
{
}
@@ -932,7 +918,15 @@
void HubFrame::on(ClientListener::UserUpdated, Client*, const OnlineUser& user) noexcept {
auto task = new UserTask(user);
callAsync([this, task] {
- tasks.add(UPDATE_USER_JOIN, unique_ptr<Task>(task));
+ tasks.emplace_back([=](const UserTask& u) {
+ if(updateUser(u)) {
+ if(client->get(HubSettings::ShowJoins) ||
+ (client->get(HubSettings::FavShowJoins) && FavoriteManager::getInstance()->isFavoriteUser(u.user)))
+ {
+ addStatus(str(TF_("Joins: %1%") % Text::toT(u.identity.getNick())));
+ }
+ }
+ }, unique_ptr<UserTask>(task));
updateUsers = true;
});
}
@@ -940,7 +934,7 @@
void HubFrame::on(UsersUpdated, Client*, const OnlineUserList& aList) noexcept {
for(auto& i: aList) {
auto task = new UserTask(*i);
- callAsync([this, task] { tasks.add(UPDATE_USER, unique_ptr<Task>(task)); });
+ callAsync([this, task] { tasks.emplace_back([=](const UserTask& u) { updateUser(u); }, unique_ptr<UserTask>(task)); });
}
callAsync([this] { updateUsers = true; });
}
@@ -948,7 +942,14 @@
void HubFrame::on(ClientListener::UserRemoved, Client*, const OnlineUser& user) noexcept {
auto task = new UserTask(user);
callAsync([this, task] {
- tasks.add(REMOVE_USER, unique_ptr<Task>(task));
+ tasks.emplace_back([=](const UserTask& u) {
+ removeUser(u.user);
+ if(client->get(HubSettings::ShowJoins) ||
+ (client->get(HubSettings::FavShowJoins) && FavoriteManager::getInstance()->isFavoriteUser(u.user)))
+ {
+ addStatus(str(TF_("Parts: %1%") % Text::toT(u.identity.getNick())));
+ }
+ }, unique_ptr<UserTask>(task));
updateUsers = true;
});
}
=== modified file 'win32/HubFrame.h'
--- win32/HubFrame.h 2013-01-21 18:43:48 +0000
+++ win32/HubFrame.h 2013-03-26 22:03:28 +0000
@@ -19,10 +19,11 @@
#ifndef DCPLUSPLUS_WIN32_HUB_FRAME_H
#define DCPLUSPLUS_WIN32_HUB_FRAME_H
+#include <functional>
+
#include <dcpp/forward.h>
#include <dcpp/OnlineUser.h>
#include <dcpp/ClientListener.h>
-#include <dcpp/TaskQueue.h>
#include <dcpp/User.h>
#include <dcpp/FavoriteManagerListener.h>
@@ -33,6 +34,8 @@
#include "MDIChildFrame.h"
#include "UserInfoBase.h"
+using std::function;
+
class HubFrame :
public MDIChildFrame<HubFrame>,
public IRecent<HubFrame>,
@@ -101,11 +104,7 @@
COLUMN_LAST
};
- enum Tasks {
- UPDATE_USER_JOIN, UPDATE_USER, REMOVE_USER
- };
-
- struct UserTask : Task {
+ struct UserTask {
UserTask(const OnlineUser& ou);
HintedUser user;
@@ -137,7 +136,6 @@
};
typedef unordered_map<UserPtr, UserInfo*, User::Hash> UserMap;
- typedef UserMap::iterator UserMapIter;
struct CountAvailable {
CountAvailable() : available(0) { }
@@ -167,14 +165,14 @@
Client* client;
string url;
- bool updateUsers;
size_t selCount;
bool statusDirty;
bool waitingForPW;
bool resort;
bool confirmClose;
- TaskQueue<false> tasks;
+ vector<pair<function<void (const UserTask&)>, unique_ptr<UserTask>>> tasks;
+ bool updateUsers;
UserInfo* currentUser; /// only for situations when the user list is hidden
@@ -185,8 +183,7 @@
StringList tabCompleteNicks;
bool inTabComplete;
- typedef std::vector<HubFrame*> FrameList;
- static FrameList frames;
+ static vector<HubFrame*> frames;
HubFrame(TabViewPtr parent, string&& url, bool connect);
virtual ~HubFrame();
=== modified file 'win32/TransferView.cpp'
--- win32/TransferView.cpp 2013-03-23 16:45:15 +0000
+++ win32/TransferView.cpp 2013-03-26 22:03:28 +0000
@@ -61,7 +61,8 @@
transfers(0),
mdi(mdi_),
downloadIcon(WinUtil::createIcon(IDI_DOWNLOAD, 16)),
- uploadIcon(WinUtil::createIcon(IDI_UPLOAD, 16))
+ uploadIcon(WinUtil::createIcon(IDI_UPLOAD, 16)),
+ updateList(false)
{
create();
setHelpId(IDH_TRANSFERS);
@@ -85,6 +86,8 @@
layout();
+ setTimer([this] { return handleTimer(); }, 500);
+
ConnectionManager::getInstance()->addListener(this);
DownloadManager::getInstance()->addListener(this);
UploadManager::getInstance()->addListener(this);
@@ -578,10 +581,76 @@
}
}
+bool TransferView::handleTimer() {
+ if(updateList) {
+ updateList = false;
+ callAsync([this] { execTasks(); });
+ }
+ return true;
+}
+
void TransferView::layout() {
transfers->resize(dwt::Rectangle(getClientSize()));
}
+void TransferView::addConn(const UpdateInfo& ui) {
+ TransferInfo* transfer = nullptr;
+ auto conn = findConn(ui.user, ui.download);
+ if(ui.updateMask & UpdateInfo::MASK_FILE) {
+ transfer = findTransfer(ui.path, ui.download);
+ if(!transfer) {
+ transferItems.emplace_back(ui.tth, ui.download, ui.path);
+ transfer = &transferItems.back();
+ transfers->insert(transfer);
+ }
+ if(conn && &conn->parent != transfer) {
+ removeTransfer(conn->parent);
+ conn = nullptr;
+ }
+ if(ui.download) {
+ QueueManager::getInstance()->getSizeInfo(transfer->size, transfer->startPos, ui.path);
+ } else {
+ transfer->transferred = ui.transferred;
+ transfer->size = ui.size;
+ }
+ } else {
+ if(conn) {
+ removeConn(*conn);
+ conn = nullptr;
+ }
+ // we don't know what file this connection is for yet.
+ transferItems.emplace_back(TTHValue(), ui.download, ui.user.user->getCID().toBase32());
+ transfer = &transferItems.back();
+ transfers->insert(transfer);
+ }
+ if(!conn) {
+ transfer->conns.emplace_back(ui.user, *transfer);
+ conn = &transfer->conns.back();
+ transfers->insertChild(reinterpret_cast<LPARAM>(transfer), reinterpret_cast<LPARAM>(conn));
+ }
+ conn->update(ui);
+ transfer->update();
+}
+
+void TransferView::updateConn(const UpdateInfo& ui) {
+ auto conn = findConn(ui.user, ui.download);
+ if(conn) {
+ conn->update(ui);
+ conn->parent.update();
+ }
+}
+
+void TransferView::removeConn(const UpdateInfo& ui) {
+ auto conn = findConn(ui.user, ui.download);
+ if(conn) {
+ removeConn(*conn);
+ }
+ auto transfer = findTransfer(ui.path, ui.download);
+ if(transfer) {
+ removeTransfer(*transfer);
+ }
+}
+
TransferView::ConnectionInfo* TransferView::findConn(const HintedUser& user, bool download) {
if(!user) { return nullptr; }
for(auto& transfer: transferItems) {
@@ -640,88 +709,15 @@
return users;
}
-void TransferView::addTask(int type, Task* ui) {
- tasks.add(type, unique_ptr<Task>(ui));
- callAsync([this] { execTasks(); });
-}
-
void TransferView::execTasks() {
- auto t = tasks.get();
- if(t.empty())
- return;
+ updateList = false;
HoldRedraw hold { transfers };
- for(auto& i: t) {
- switch(i.first) {
- case ADD_CONNECTION:
- {
- auto& ui = static_cast<UpdateInfo&>(*i.second);
- TransferInfo* transfer = nullptr;
- auto conn = findConn(ui.user, ui.download);
- if(ui.updateMask & UpdateInfo::MASK_FILE) {
- transfer = findTransfer(ui.path, ui.download);
- if(!transfer) {
- transferItems.emplace_back(ui.tth, ui.download, ui.path);
- transfer = &transferItems.back();
- transfers->insert(transfer);
- }
- if(conn && &conn->parent != transfer) {
- removeTransfer(conn->parent);
- conn = nullptr;
- }
- if(ui.download) {
- QueueManager::getInstance()->getSizeInfo(transfer->size, transfer->startPos, ui.path);
- } else {
- transfer->transferred = ui.transferred;
- transfer->size = ui.size;
- }
- } else {
- if(conn) {
- removeConn(*conn);
- conn = nullptr;
- }
- // we don't know what file this connection is for yet.
- transferItems.emplace_back(TTHValue(), ui.download, ui.user.user->getCID().toBase32());
- transfer = &transferItems.back();
- transfers->insert(transfer);
- }
- if(!conn) {
- transfer->conns.emplace_back(ui.user, *transfer);
- conn = &transfer->conns.back();
- transfers->insertChild(reinterpret_cast<LPARAM>(transfer), reinterpret_cast<LPARAM>(conn));
- }
- conn->update(ui);
- transfer->update();
- break;
- }
-
- case UPDATE_CONNECTION:
- {
- auto& ui = static_cast<UpdateInfo&>(*i.second);
- auto conn = findConn(ui.user, ui.download);
- if(conn) {
- conn->update(ui);
- conn->parent.update();
- }
- break;
- }
-
- case REMOVE_CONNECTION:
- {
- auto& ui = static_cast<UpdateInfo&>(*i.second);
- auto conn = findConn(ui.user, ui.download);
- if(conn) {
- removeConn(*conn);
- }
- auto transfer = findTransfer(ui.path, ui.download);
- if(transfer) {
- removeTransfer(*transfer);
- }
- break;
- }
- }
+ for(auto& task: tasks) {
+ task.first(*task.second);
}
+ tasks.clear();
transfers->resort();
}
@@ -731,11 +727,11 @@
ui->setStatus(ConnectionInfo::STATUS_WAITING);
ui->setStatusString(T_("Connecting"));
- addTask(ADD_CONNECTION, ui);
+ addedConn(ui);
}
void TransferView::on(ConnectionManagerListener::Removed, ConnectionQueueItem* aCqi) noexcept {
- addTask(REMOVE_CONNECTION, new UpdateInfo(aCqi->getUser(), aCqi->getDownload()));
+ removedConn(new UpdateInfo(aCqi->getUser(), aCqi->getDownload()));
}
void TransferView::on(ConnectionManagerListener::Failed, ConnectionQueueItem* aCqi, const string& aReason) noexcept {
@@ -744,14 +740,14 @@
T_("Remote client does not fully support TTH - cannot download") :
Text::toT(aReason));
- addTask(UPDATE_CONNECTION, ui);
+ updatedConn(ui);
}
void TransferView::on(ConnectionManagerListener::StatusChanged, ConnectionQueueItem* aCqi) noexcept {
auto ui = new UpdateInfo(aCqi->getUser(), aCqi->getDownload());
ui->setStatusString((aCqi->getState() == ConnectionQueueItem::CONNECTING) ? T_("Connecting") : T_("Waiting to retry"));
- addTask(UPDATE_CONNECTION, ui);
+ updatedConn(ui);
}
namespace { tstring getFile(Transfer* t) {
@@ -804,15 +800,13 @@
statusString += str(TF_("Downloading %1%") % getFile(d));
ui->setStatusString(statusString);
- addTask(UPDATE_CONNECTION, ui);
+ updatedConn(ui);
}
void TransferView::on(DownloadManagerListener::Tick, const DownloadList& dl) noexcept {
for(auto i: dl) {
onTransferTick(i, true);
}
-
- callAsync([this] { execTasks(); });
}
void TransferView::on(DownloadManagerListener::Requesting, Download* d) noexcept {
@@ -820,7 +814,7 @@
starting(ui, d);
ui->setStatusString(str(TF_("Requesting %1%") % getFile(d)));
- addTask(ADD_CONNECTION, ui);
+ addedConn(ui);
}
void TransferView::on(UploadManagerListener::Complete, Upload* u) noexcept {
@@ -848,35 +842,54 @@
statusString += str(TF_("Uploading %1%") % getFile(u));
ui->setStatusString(statusString);
- addTask(UPDATE_CONNECTION, ui);
+ updatedConn(ui);
}
void TransferView::on(UploadManagerListener::Tick, const UploadList& ul) noexcept {
for(auto i: ul) {
onTransferTick(i, false);
}
-
- callAsync([this] { execTasks(); });
}
void TransferView::on(QueueManagerListener::Removed, QueueItem* qi) noexcept {
- auto ui = new UpdateInfo(HintedUser(), true);
+ /*auto ui = new UpdateInfo(HintedUser(), true);
ui->setFile(qi->getTTH(), qi->getTarget());
- addTask(REMOVE_CONNECTION, ui);
+ removedConn(ui);*/
}
void TransferView::on(QueueManagerListener::StatusUpdated, QueueItem* qi) noexcept {
- if(qi->isFinished() || qi->getPriority() == QueueItem::PAUSED || qi->countOnlineUsers() == 0) {
+ /*if(qi->isFinished() || qi->getPriority() == QueueItem::PAUSED || qi->countOnlineUsers() == 0) {
auto ui = new UpdateInfo(HintedUser(), true);
ui->setFile(qi->getTTH(), qi->getTarget());
- addTask(REMOVE_CONNECTION, ui);
- }
+ removedConn(ui);
+ }*/
}
void TransferView::on(QueueManagerListener::CRCFailed, Download* d, const string& aReason) noexcept {
onFailed(d, aReason);
}
+void TransferView::addedConn(UpdateInfo* ui) {
+ callAsync([this, ui] {
+ tasks.emplace_back([=](const UpdateInfo& ui) { addConn(ui); }, unique_ptr<UpdateInfo>(ui));
+ updateList = true;
+ });
+}
+
+void TransferView::updatedConn(UpdateInfo* ui) {
+ callAsync([this, ui] {
+ tasks.emplace_back([=](const UpdateInfo& ui) { updateConn(ui); }, unique_ptr<UpdateInfo>(ui));
+ updateList = true;
+ });
+}
+
+void TransferView::removedConn(UpdateInfo* ui) {
+ callAsync([this, ui] {
+ tasks.emplace_back([=](const UpdateInfo& ui) { removeConn(ui); }, unique_ptr<UpdateInfo>(ui));
+ updateList = true;
+ });
+}
+
void TransferView::starting(UpdateInfo* ui, Transfer* t) {
ui->setFile(t->getTTH(), t->getPath());
ui->setStatus(ConnectionInfo::STATUS_RUNNING);
@@ -892,7 +905,7 @@
ui->setFile(t->getTTH(), t->getPath());
ui->setTransferred(t->getPos(), t->getActual(), t->getSize());
ui->setSpeed(t->getAverageSpeed());
- tasks.add(UPDATE_CONNECTION, unique_ptr<Task>(ui));
+ updatedConn(ui);
}
void TransferView::onTransferComplete(Transfer* t, bool download) {
@@ -902,7 +915,7 @@
ui->setStatusString(T_("Idle"));
ui->setTransferred(t->getPos(), t->getActual(), t->getSize());
- addTask(UPDATE_CONNECTION, ui);
+ updatedConn(ui);
}
void TransferView::onFailed(Download* d, const string& aReason) {
@@ -911,5 +924,5 @@
ui->setStatus(ConnectionInfo::STATUS_WAITING);
ui->setStatusString(Text::toT(aReason));
- addTask(UPDATE_CONNECTION, ui);
+ updatedConn(ui);
}
=== modified file 'win32/TransferView.h'
--- win32/TransferView.h 2013-03-22 16:30:58 +0000
+++ win32/TransferView.h 2013-03-26 22:03:28 +0000
@@ -19,13 +19,13 @@
#ifndef DCPLUSPLUS_WIN32_TRANSFER_VIEW_H
#define DCPLUSPLUS_WIN32_TRANSFER_VIEW_H
+#include <functional>
#include <list>
#include <dcpp/DownloadManagerListener.h>
#include <dcpp/UploadManagerListener.h>
#include <dcpp/ConnectionManagerListener.h>
#include <dcpp/QueueManagerListener.h>
-#include <dcpp/TaskQueue.h>
#include <dcpp/forward.h>
#include <dcpp/MerkleTree.h>
#include <dcpp/Util.h>
@@ -36,6 +36,7 @@
#include "UserInfoBase.h"
+using std::function;
using std::list;
class TransferView :
@@ -73,12 +74,6 @@
COLUMN_LAST
};
- enum {
- ADD_CONNECTION,
- UPDATE_CONNECTION,
- REMOVE_CONNECTION
- };
-
struct TransferInfo;
struct UpdateInfo;
@@ -152,7 +147,7 @@
list<ConnectionInfo> conns;
};
- struct UpdateInfo : public Task {
+ struct UpdateInfo {
enum {
MASK_STATUS = 1 << 0,
MASK_STATUS_STRING = 1 << 1,
@@ -210,9 +205,8 @@
const dwt::IconPtr downloadIcon;
const dwt::IconPtr uploadIcon;
- bool startup;
-
- TaskQueue<true> tasks; // todo get rid of TaskQueue
+ vector<pair<function<void (const UpdateInfo&)>, unique_ptr<UpdateInfo>>> tasks;
+ bool updateList;
ParamMap ucLineParams;
@@ -224,9 +218,14 @@
bool handleKeyDown(int c);
void handleDblClicked();
LRESULT handleCustomDraw(NMLVCUSTOMDRAW& data);
+ bool handleTimer();
void layout();
+ void addConn(const UpdateInfo& ui);
+ void updateConn(const UpdateInfo& ui);
+ void removeConn(const UpdateInfo& ui);
+
ConnectionInfo* findConn(const HintedUser& user, bool download);
TransferInfo* findTransfer(const string& path, bool download);
void removeConn(ConnectionInfo& conn);
@@ -235,7 +234,6 @@
// AspectUserInfo
UserInfoList selectedUsersImpl() const;
- void addTask(int type, Task* ui);
void execTasks();
virtual void on(ConnectionManagerListener::Added, ConnectionQueueItem* aCqi) noexcept;
@@ -257,6 +255,10 @@
virtual void on(QueueManagerListener::StatusUpdated, QueueItem* qi) noexcept;
virtual void on(QueueManagerListener::CRCFailed, Download* d, const string& aReason) noexcept;
+ void addedConn(UpdateInfo* ui);
+ void updatedConn(UpdateInfo* ui);
+ void removedConn(UpdateInfo* ui);
+
void starting(UpdateInfo* ui, Transfer* t);
void onTransferTick(Transfer* t, bool download);
void onTransferComplete(Transfer* t, bool download);