Extension of scheduler, different logic in FetchManager regarding re-requesting (exponential backoff, and flipping broadcast/forwarding hint)
diff --git a/scheduler/scheduler.cc b/scheduler/scheduler.cc
index 227eead..02b6431 100644
--- a/scheduler/scheduler.cc
+++ b/scheduler/scheduler.cc
@@ -167,11 +167,14 @@
 }
 
 bool
-Scheduler::addTask(TaskPtr newTask)
+Scheduler::addTask(TaskPtr newTask, bool reset/* = true*/)
 {
   if (addToMap(newTask))
   {
-    newTask->reset();
+    if (reset)
+      {
+        newTask->reset();
+      }
     int res = evtimer_add(newTask->ev(), newTask->tv());
     if (res < 0)
     {
@@ -194,7 +197,7 @@
 }
 
 void
-Scheduler::rescheduleTask(const TaskPtr &task)
+Scheduler::rescheduleTask(TaskPtr task)
 {
   ScopedLock lock(m_mutex);
   TaskMapIt it = m_taskMap.find(task->tag());
@@ -231,8 +234,56 @@
   }
 }
 
+void
+Scheduler::rescheduleTaskAt (const Task::Tag &tag, double time)
+{
+  ScopedLock lock(m_mutex);
+  TaskMapIt it = m_taskMap.find (tag);
+  if (it != m_taskMap.end())
+  {
+    TaskPtr task = it->second;
+    task->reset();
+    task->setTv (time);
+
+    int res = evtimer_add(task->ev(), task->tv());
+    if (res < 0)
+    {
+      _LOG_ERROR ("evtimer_add failed for " << task->tag());
+    }
+  }
+  else
+    {
+      _LOG_ERROR ("Task for tag " << tag << " not found");
+    }
+}
+
+void
+Scheduler::rescheduleTaskAt (TaskPtr task, double time)
+{
+  ScopedLock lock(m_mutex);
+  TaskMapIt it = m_taskMap.find(task->tag());
+  if (it != m_taskMap.end())
+  {
+    TaskPtr task = it->second;
+    task->reset();
+    task->setTv (time);
+
+    int res = evtimer_add(task->ev(), task->tv());
+    if (res < 0)
+    {
+      _LOG_ERROR ("evtimer_add failed for " << task->tag());
+    }
+  }
+  else
+  {
+    task->setTv (time); // force different time
+    addTask (task, false);
+  }
+}
+
+
 bool
-Scheduler::addToMap(const TaskPtr &task)
+Scheduler::addToMap(TaskPtr task)
 {
   ScopedLock lock(m_mutex);
   if (m_taskMap.find(task->tag()) == m_taskMap.end())
diff --git a/scheduler/scheduler.h b/scheduler/scheduler.h
index 7fe5db0..18bd9bd 100644
--- a/scheduler/scheduler.h
+++ b/scheduler/scheduler.h
@@ -71,7 +71,7 @@
 
   // if task with the same tag exists, the task is not added and return false
   virtual bool
-  addTask(TaskPtr task);
+  addTask(TaskPtr task, bool reset = true);
 
   // delete task by task->tag, regardless of whether it's invoked or not
   virtual void
@@ -101,7 +101,13 @@
   // rescheduleTask(A) is called at second 4, A will be reschedule to run
   // at second 9
   virtual void
-  rescheduleTask(const TaskPtr &task);
+  rescheduleTask(TaskPtr task);
+
+  virtual void
+  rescheduleTaskAt (const Task::Tag &tag, double time);
+
+  virtual void
+  rescheduleTaskAt (TaskPtr task, double time);
 
   void
   eventLoop();
@@ -115,7 +121,7 @@
 
 protected:
   bool
-  addToMap(const TaskPtr &task);
+  addToMap(TaskPtr task);
 
 protected:
   typedef std::map<Task::Tag, TaskPtr> TaskMap;