* Changed the TaskScheduler so new tasks are inserted beyond the last

due task when executing.

* Moved stuff from torrent/torrent.cc to torrent::Manager.


git-svn-id: svn://rakshasa.no/libtorrent/trunk/rtorrent@535 e378c898-3ddf-0310-93e7-cc216c733640
This commit is contained in:
rakshasa
2005-08-18 00:46:54 +00:00
parent b0ac469262
commit abbe4dd675
3 changed files with 29 additions and 20 deletions
+24 -17
View File
@@ -43,24 +43,21 @@
namespace utils {
inline void
TaskScheduler::execute_task(const value_type& v) {
if (!is_scheduled(v.second))
throw std::logic_error("TaskScheduler::execute_task(iterator) received an invalid iterator");
v.second->set_iterator(end());
v.second->get_slot()();
}
void
TaskScheduler::insert(TaskItem* task, Timer time) {
if (is_scheduled(task))
throw std::logic_error("TaskScheduler::insert(...) tried to insert an already inserted or invalid TaskItem");
iterator itr = std::find_if(begin(), end(),
rak::less_equal(time, rak::mem_ptr_ref(&value_type::first)));
// Only insert at or after m_entry because if we might be in
// execute(...).
iterator itr = std::find_if(m_entry, end(), rak::less_equal(time, rak::mem_ptr_ref(&value_type::first)));
task->set_iterator(Base::insert(itr, value_type(time, task)));
// Make sure m_entry points to the right node if we try inserting
// before m_entry.
if (itr == m_entry)
m_entry = task->get_iterator();
}
void
@@ -68,19 +65,29 @@ TaskScheduler::erase(TaskItem* task) {
if (!is_scheduled(task))
return;
Base::erase(task->get_iterator());
iterator itr = Base::erase(task->get_iterator());
if (task->get_iterator() == m_entry)
m_entry = itr;
task->set_iterator(end());
}
void
TaskScheduler::execute(Timer time) {
Base tmp;
m_entry = std::find_if(begin(), end(), rak::less_equal(time, rak::mem_ptr_ref(&value_type::first)));
tmp.splice(tmp.begin(), *this,
begin(), std::find_if(begin(), end(), rak::less_equal(time, rak::mem_ptr_ref(&value_type::first))));
// Since we are always using the front rather than a splice of the
// due tasks, it is safe to erase them from within other tasks.
while (begin() != m_entry) {
if (!is_scheduled(Base::front().second))
throw std::logic_error("TaskScheduler::execute_task(iterator) received an invalid iterator");
Base::front().second->set_iterator(end());
Base::front().second->get_slot()();
std::for_each(tmp.begin(), tmp.end(),
rak::bind1st(std::mem_fun(&TaskScheduler::execute_task), this));
Base::pop_front();
}
}
}
+3 -1
View File
@@ -58,6 +58,8 @@ public:
using Base::rbegin;
using Base::rend;
TaskScheduler() : m_entry(begin()) {}
void insert(TaskItem* task, Timer time);
void erase(TaskItem* task);
@@ -68,7 +70,7 @@ public:
Timer get_next_timeout() const { return begin()->first; }
private:
inline void execute_task(const value_type& v);
iterator m_entry;
};
}