Browse Source

Implement scheduler_touch_channel()

Andrea Shepard 10 years ago
parent
commit
ac1b627e85
2 changed files with 27 additions and 0 deletions
  1. 24 0
      src/or/scheduler.c
  2. 3 0
      src/or/scheduler.h

+ 24 - 0
src/or/scheduler.c

@@ -579,6 +579,30 @@ scheduler_channel_wants_writes(channel_t *chan)
   if (became_pending) scheduler_retrigger();
 }
 
+/**
+ * Notify the scheduler that a channel's position in the pqueue may have
+ * changed
+ */
+
+void
+scheduler_touch_channel(channel_t *chan)
+{
+  tor_assert(chan);
+
+  if (chan->scheduler_state == SCHED_CHAN_PENDING) {
+    /* Remove and re-add it */
+    smartlist_pqueue_remove(channels_pending,
+                            scheduler_compare_channels,
+                            STRUCT_OFFSET(channel_t, sched_heap_idx),
+                            chan);
+    smartlist_pqueue_add(channels_pending,
+                         scheduler_compare_channels,
+                         STRUCT_OFFSET(channel_t, sched_heap_idx),
+                         chan);
+  }
+  /* else no-op, since it isn't in the queue */
+}
+
 /**
  * Notify the scheduler of a queue size adjustment, to recalculate the
  * queue heuristic.

+ 3 - 0
src/or/scheduler.h

@@ -30,5 +30,8 @@ void scheduler_release_channel(channel_t *chan);
 /* Notify scheduler of queue size adjustments */
 void scheduler_adjust_queue_size(channel_t *chan, char dir, uint64_t adj);
 
+/* Notify scheduler that a channel's queue position may have changed */
+void scheduler_touch_channel(channel_t *chan);
+
 #endif /* !defined(TOR_SCHEDULER_H) */