fix problem on OS X: no packets where sent out.
authorL. Aaron Kaplan <aaron@lo-res.org>
Tue, 6 Jan 2009 20:17:42 +0000 (20:17 +0000)
committerL. Aaron Kaplan <aaron@lo-res.org>
Tue, 6 Jan 2009 20:17:42 +0000 (20:17 +0000)
Because the timers did not trigger because olsr_times() returned 0 all the time.
Why is this so?
Because if you look at the BSD man pages of times(3) it will return the number of ticks since the epoche and not since booting.
Therefore the values are higher than the -1 of a singed long. Therefore -erro was being returned. And errno was 0 all the time.
This seems to be a very strange problem in OS X: for some time the FreeBSD man page was wrong. But FreeBSD actually returns the real uptime in clock ticks. But OS X actually returns the clock ticks since the epoche.

The fix makes the following: compare properly against the clock_t type (which is a unsigned long).
This way, nothing can go wrong in any case.

Cudos and and thanks for Henning Rogge for thinking this thru with me.
Reference to the FreeBSD man page for times(3):  http://www.freebsd.org/cgi/query-pr.cgi?pr=122359

TIMES(3)                 BSD Library Functions Manual                 TIMES(3)

NAME
     times -- process times

LIBRARY
     Standard C Library (libc, -lc)

SYNOPSIS
     #include <sys/times.h>

     clock_t
     times(struct tms *buffer);

DESCRIPTION
     This interface is obsoleted by getrusage(2) and gettimeofday(2).

     The times() function returns the value of time in CLK_TCK's of a second since 0 hours, 0 minutes, 0 seconds, January 1, 1970,
     Coordinated Universal Time.

src/scheduler.c

index b78b551..39422cc 100644 (file)
@@ -843,8 +843,8 @@ olsr_set_timer(struct timer_entry **timer_ptr,
 static unsigned long olsr_times(void)
 {
   struct tms tms_buf;
-  const long t = times(&tms_buf);
-  return t < 0 ? -errno : t;
+  const clock_t t = times(&tms_buf);
+  return (t == ((clock_t)-1) ) ? (clock_t)-errno : t;
 }