------------------------------------------------------------ revno: 3240 committer: poy <p...@123gen.com> 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);
_______________________________________________ Mailing list: https://launchpad.net/~linuxdcpp-team Post to : linuxdcpp-team@lists.launchpad.net Unsubscribe : https://launchpad.net/~linuxdcpp-team More help : https://help.launchpad.net/ListHelp