]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/wheel.c
zebra, lib: fix the ZEBRA_INTERFACE_VRF_UPDATE zapi message
[mirror_frr.git] / lib / wheel.c
index fe53dea29999c1a6d424896eba1993ffff91d66d..69d2fa48dc0b382d2875049139f99a5ec589c5cf 100644 (file)
  * 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; see the file COPYING; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
- * MA 02110-1301 USA
+ * You should have received a copy of the GNU General Public License along
+ * with this program; see the file COPYING; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  */
 #include "zebra.h"
 #include "linklist.h"
 #include "wheel.h"
 #include "log.h"
 
-DEFINE_MTYPE_STATIC(LIB, TIMER_WHEEL,   "Timer Wheel")
+DEFINE_MTYPE_STATIC(LIB, TIMER_WHEEL, "Timer Wheel")
 DEFINE_MTYPE_STATIC(LIB, TIMER_WHEEL_LIST, "Timer Wheel Slot List")
 
 static int debug_timer_wheel = 0;
 
-static int
-wheel_timer_thread (struct thread *t)
+static int wheel_timer_thread(struct thread *t);
+
+static int wheel_timer_thread_helper(struct thread *t)
 {
-  struct listnode *node, *nextnode;
-  unsigned long long curr_slot;
-  unsigned int slots_to_skip = 1;
-  struct timer_wheel *wheel;
-  void *data;
+       struct listnode *node, *nextnode;
+       unsigned long long curr_slot;
+       unsigned int slots_to_skip = 1;
+       struct timer_wheel *wheel;
+       void *data;
+
+       wheel = THREAD_ARG(t);
+       THREAD_OFF(wheel->timer);
+
+       wheel->curr_slot += wheel->slots_to_skip;
+
+       curr_slot = wheel->curr_slot % wheel->slots;
 
-  wheel = THREAD_ARG(t);
-  THREAD_OFF(wheel->timer);
+       if (debug_timer_wheel)
+               zlog_debug("%s: Wheel Slot: %lld(%lld) count: %d",
+                          __PRETTY_FUNCTION__, wheel->curr_slot, curr_slot,
+                          listcount(wheel->wheel_slot_lists[curr_slot]));
 
-  wheel->curr_slot += wheel->slots_to_skip;
+       for (ALL_LIST_ELEMENTS(wheel->wheel_slot_lists[curr_slot], node,
+                              nextnode, data))
+               (*wheel->slot_run)(data);
 
-  curr_slot = wheel->curr_slot % wheel->slots;
+       while (list_isempty(wheel->wheel_slot_lists[(curr_slot + slots_to_skip)
+                                                   % wheel->slots])
+              && (curr_slot + slots_to_skip) % wheel->slots != curr_slot)
+               slots_to_skip++;
 
-  if (debug_timer_wheel)
-    zlog_debug ("%s: Wheel Slot: %lld(%lld) count: %d",
-               __PRETTY_FUNCTION__,
-               wheel->curr_slot,
-               curr_slot, listcount(wheel->wheel_slot_lists[curr_slot]));
+       wheel->slots_to_skip = slots_to_skip;
+       thread_add_timer_msec(wheel->master, wheel_timer_thread, wheel,
+                             wheel->nexttime * slots_to_skip, &wheel->timer);
 
-  for (ALL_LIST_ELEMENTS (wheel->wheel_slot_lists[curr_slot], node, nextnode, data))
-    (*wheel->slot_run)(data);
+       return 0;
+}
+
+static int wheel_timer_thread(struct thread *t)
+{
+       struct timer_wheel *wheel;
 
-  while (list_isempty(wheel->wheel_slot_lists[(curr_slot + slots_to_skip) % wheel->slots]) &&
-        (curr_slot + slots_to_skip ) % wheel->slots != curr_slot)
-    slots_to_skip++;
+       wheel = THREAD_ARG(t);
 
-  wheel->slots_to_skip = slots_to_skip;
-  THREAD_TIMER_MSEC_ON (wheel->master, wheel->timer,
-                       wheel_timer_thread, wheel,
-                       wheel->nexttime * slots_to_skip);
+       thread_execute_name(wheel->master, wheel_timer_thread_helper,
+                           wheel, 0, wheel->name);
 
-  return 0;
+       return 0;
 }
 
-struct timer_wheel *
-wheel_init (struct thread_master *master, int period, size_t slots,
-           unsigned int (*slot_key) (void *),
-           void (*slot_run) (void *))
+struct timer_wheel *wheel_init(struct thread_master *master, int period,
+                              size_t slots, unsigned int (*slot_key)(void *),
+                              void (*slot_run)(void *),
+                              const char *run_name)
 {
-  struct timer_wheel *wheel;
-  size_t i;
+       struct timer_wheel *wheel;
+       size_t i;
 
-  wheel = XCALLOC(MTYPE_TIMER_WHEEL, sizeof (struct timer_wheel));
+       wheel = XCALLOC(MTYPE_TIMER_WHEEL, sizeof(struct timer_wheel));
 
-  wheel->slot_key = slot_key;
-  wheel->slot_run = slot_run;
+       wheel->name = XSTRDUP(MTYPE_TIMER_WHEEL, run_name);
+       wheel->slot_key = slot_key;
+       wheel->slot_run = slot_run;
 
-  wheel->period = period;
-  wheel->slots = slots;
-  wheel->curr_slot = 0;
-  wheel->master = master;
-  wheel->nexttime = period / slots;
+       wheel->period = period;
+       wheel->slots = slots;
+       wheel->curr_slot = 0;
+       wheel->master = master;
+       wheel->nexttime = period / slots;
 
-  wheel->wheel_slot_lists = XCALLOC(MTYPE_TIMER_WHEEL_LIST,
-                                   slots * sizeof (struct listnode *));
-  for (i = 0; i < slots; i++)
-    wheel->wheel_slot_lists[i] = list_new ();
+       wheel->wheel_slot_lists = XCALLOC(MTYPE_TIMER_WHEEL_LIST,
+                                         slots * sizeof(struct listnode *));
+       for (i = 0; i < slots; i++)
+               wheel->wheel_slot_lists[i] = list_new();
 
-  THREAD_TIMER_MSEC_ON (wheel->master, wheel->timer,
-                       wheel_timer_thread, wheel,
-                       wheel->nexttime);
+       thread_add_timer_msec(wheel->master, wheel_timer_thread, wheel,
+                             wheel->nexttime, &wheel->timer);
 
-  return wheel;
+       return wheel;
 }
 
-void
-wheel_delete (struct timer_wheel *wheel)
+void wheel_delete(struct timer_wheel *wheel)
 {
-  int i;
+       int i;
 
-  for (i = 0; i < wheel->slots; i++)
-    {
-      list_delete(wheel->wheel_slot_lists[i]);
-    }
+       for (i = 0; i < wheel->slots; i++) {
+               list_delete(&wheel->wheel_slot_lists[i]);
+       }
 
-  THREAD_OFF(wheel->timer);
-  XFREE(MTYPE_TIMER_WHEEL_LIST, wheel->wheel_slot_lists);
-  XFREE(MTYPE_TIMER_WHEEL, wheel);
+       THREAD_OFF(wheel->timer);
+       XFREE(MTYPE_TIMER_WHEEL_LIST, wheel->wheel_slot_lists);
+       XFREE(MTYPE_TIMER_WHEEL, wheel->name);
+       XFREE(MTYPE_TIMER_WHEEL, wheel);
 }
 
-int
-wheel_stop (struct timer_wheel *wheel)
+int wheel_stop(struct timer_wheel *wheel)
 {
-  THREAD_OFF(wheel->timer);
-  return 0;
+       THREAD_OFF(wheel->timer);
+       return 0;
 }
 
-int
-wheel_start (struct timer_wheel *wheel)
+int wheel_start(struct timer_wheel *wheel)
 {
-  if (!wheel->timer)
-    THREAD_TIMER_MSEC_ON (wheel->master, wheel->timer,
-                         wheel_timer_thread, wheel,
-                         wheel->nexttime);
+       if (!wheel->timer)
+               thread_add_timer_msec(wheel->master, wheel_timer_thread, wheel,
+                                     wheel->nexttime, &wheel->timer);
 
-  return 0;
+       return 0;
 }
 
-int
-wheel_add_item (struct timer_wheel *wheel, void *item)
+int wheel_add_item(struct timer_wheel *wheel, void *item)
 {
-  long long slot;
+       long long slot;
 
-  slot = (*wheel->slot_key)(item);
+       slot = (*wheel->slot_key)(item);
 
-  if (debug_timer_wheel)
-    zlog_debug ("%s: Inserting %p: %lld %lld",
-               __PRETTY_FUNCTION__, item,
-               slot, slot % wheel->slots);
-  listnode_add (wheel->wheel_slot_lists[slot % wheel->slots], item);
+       if (debug_timer_wheel)
+               zlog_debug("%s: Inserting %p: %lld %lld", __PRETTY_FUNCTION__,
+                          item, slot, slot % wheel->slots);
+       listnode_add(wheel->wheel_slot_lists[slot % wheel->slots], item);
 
-  return 0;
+       return 0;
 }
 
-int
-wheel_remove_item (struct timer_wheel *wheel, void *item)
+int wheel_remove_item(struct timer_wheel *wheel, void *item)
 {
-  long long slot;
+       long long slot;
 
-  slot = (*wheel->slot_key)(item);
+       slot = (*wheel->slot_key)(item);
 
-  if (debug_timer_wheel)
-    zlog_debug ("%s: Removing %p: %lld %lld",
-               __PRETTY_FUNCTION__, item,
-               slot, slot % wheel->slots);
-  listnode_delete (wheel->wheel_slot_lists[slot % wheel->slots], item);
+       if (debug_timer_wheel)
+               zlog_debug("%s: Removing %p: %lld %lld", __PRETTY_FUNCTION__,
+                          item, slot, slot % wheel->slots);
+       listnode_delete(wheel->wheel_slot_lists[slot % wheel->slots], item);
 
-  return 0;
+       return 0;
 }