From Hannes Gredler <hannes@gredler.at>: refactor the timer implementation
authorHannes Gredler <hannes@gredler.at>
Tue, 19 Feb 2008 22:49:52 +0000 (23:49 +0100)
committerHannes Gredler <hannes@gredler.at>
Tue, 19 Feb 2008 22:49:52 +0000 (23:49 +0100)
commit5e16706cc18d2bb585080064181c36d9c5dd75e5
tree4b21f90442eec1f752c46fb7876f59a4d42f6026
parent5e941f87f81a95c0aba3447e1c44719e2ea08571
From Hannes Gredler <hannes@gredler.at>: refactor the timer implementation

-slash all timeout functions and the corresponding infrastructure
-slash all event functions and the corresponding infrastructure

  that means all polling based timer comparisions have been removed.
  the scheduler rate can be now brought down to 10ms without much
  additional overhead.

-introduce a new wheel based timer similar to the BSD kernel implementation
 described in http://www.olsr.org/docs/wucs-95-23.pdf

 there are three major calls

  olsr_start_timer()
  olsr_stop_timer()
  olsr_change_timer()

alternatively there is a one-stop shop that figures out on its own what
to do.

  olsr_set_timer()

this comes handy for avoiding a lot of copy and paste code updating
all the client code.

the new timer API supports periodical and singleshot timers.
once the timer expires a provided function along with a context pointer
is called back. After the singleshot timer fires the used memeory for
the timer is not freed but rather returned to a free memory pool for
avoiding malloc() churn.

the implementation is very efficient as all timer start/stop/change operations
are done in O(1) complexity. walking the timer slot in the main scheduler loop
has a complexity of O(N/K) where K is 256 which should give reasonable defaults
for thousands of timers in the system.

as a sideeffect all wallclock timer references have been removed. now only
one non-wallclock timer obtained by the times() call is maintained.

note that the olsr_secure plugin does keep its wallclock based timer.
it is left to the olsrd_secure plugin authors to convert this to a
non-wallclock based timers to avoid disaster events like when the system
clock changes.
60 files changed:
.hgignore
lib/arprefresh/src/olsrd_arprefresh.c
lib/bmf/src/Bmf.c
lib/bmf/src/NetworkInterfaces.c
lib/bmf/src/olsrd_plugin.c
lib/dyn_gw/src/olsrd_dyn_gw.c
lib/dyn_gw_plain/src/olsrd_dyn_gw_plain.c
lib/httpinfo/src/olsrd_httpinfo.c
lib/nameservice/src/mapwrite.c
lib/nameservice/src/nameservice.c
lib/nameservice/src/nameservice.h
lib/nameservice/src/olsrd_plugin.c
lib/quagga/src/olsrd_plugin.c
lib/secure/src/olsrd_plugin.c
lib/secure/src/olsrd_secure.c
lib/tas/src/plugin.c
lib/tas/src/plugin.h
lib/txtinfo/src/olsrd_txtinfo.c
src/defs.h
src/duplicate_set.c
src/duplicate_set.h
src/generate_msg.h
src/hashing.c
src/hashing.h
src/hna_set.c
src/hna_set.h
src/hysteresis.c
src/interfaces.c
src/interfaces.h
src/link_set.c
src/link_set.h
src/linux/apm.c
src/linux/link_layer.c
src/lq_list.h
src/lq_packet.c
src/lq_route.c
src/lq_route.h
src/main.c
src/mid_set.c
src/mid_set.h
src/mpr_selector_set.c
src/mpr_selector_set.h
src/neighbor_table.c
src/neighbor_table.h
src/olsr.c
src/olsr_protocol.h
src/olsr_types.h
src/packet.c
src/parser.c
src/process_package.c
src/routing_table.c
src/scheduler.c
src/scheduler.h
src/socket_parser.c
src/socket_parser.h
src/tc_set.c
src/tc_set.h
src/two_hop_neighbor_table.c
src/unix/ifnet.c
src/win32/ifnet.c