diff options
Diffstat (limited to 'package/busybox/busybox-1.7.0-gettimeofday_ns.patch')
-rw-r--r-- | package/busybox/busybox-1.7.0-gettimeofday_ns.patch | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/package/busybox/busybox-1.7.0-gettimeofday_ns.patch b/package/busybox/busybox-1.7.0-gettimeofday_ns.patch new file mode 100644 index 000000000..8c4a8f300 --- /dev/null +++ b/package/busybox/busybox-1.7.0-gettimeofday_ns.patch @@ -0,0 +1,95 @@ +diff -urN busybox-1.7.0/networking/isrv.c busybox-1.7.0-gettimeofday_ns/networking/isrv.c +--- busybox-1.7.0/networking/isrv.c 2007-08-24 11:49:41.000000000 +0100 ++++ busybox-1.7.0-gettimeofday_ns/networking/isrv.c 2007-09-06 17:39:55.000000000 +0100 +@@ -21,20 +21,6 @@ + + /* Helpers */ + +-/* Even if _POSIX_MONOTONIC_CLOCK is defined, this +- * may require librt */ +-#if 0 /*def _POSIX_MONOTONIC_CLOCK*/ +-static time_t monotonic_time(void) +-{ +- struct timespec ts; +- if (clock_gettime(CLOCK_MONOTONIC, &ts) != 0) +- time(&ts.tv_sec); +- return ts.tv_sec; +-} +-#else +-#define monotonic_time() (time(NULL)) +-#endif +- + /* Opaque structure */ + + struct isrv_state_t { +@@ -258,7 +244,7 @@ + /* this peer is gone */ + remove_peer(state, peer); + } else if (TIMEOUT) { +- TIMEO_TBL[peer] = monotonic_time(); ++ TIMEO_TBL[peer] = monotonic_sec(); + } + } + } +@@ -335,7 +321,7 @@ + break; + + if (timeout) { +- time_t t = monotonic_time(); ++ time_t t = monotonic_sec(); + if (t != CURTIME) { + CURTIME = t; + handle_timeout(state, do_timeout); +diff -urN busybox-1.7.0/runit/runsv.c busybox-1.7.0-gettimeofday_ns/runit/runsv.c +--- busybox-1.7.0/runit/runsv.c 2007-08-24 11:50:01.000000000 +0100 ++++ busybox-1.7.0-gettimeofday_ns/runit/runsv.c 2007-09-06 17:39:55.000000000 +0100 +@@ -33,6 +33,34 @@ + #include "libbb.h" + #include "runit_lib.h" + ++#if ENABLE_MONOTONIC_SYSCALL ++#include <sys/syscall.h> ++ ++/* libc has incredibly messy way of doing this, ++ * typically requiring -lrt. We just skip all this mess */ ++static void gettimeofday_ns(struct timespec *ts) ++{ ++ syscall(__NR_clock_gettime, CLOCK_REALTIME, ts); ++} ++#else ++static void gettimeofday_ns(struct timespec *ts) ++{ ++ if (sizeof(struct timeval) == sizeof(struct timespec) ++ && sizeof(((struct timeval*)ts)->tv_usec) == sizeof(ts->tv_nsec) ++ ) { ++ /* Cheat */ ++ gettimeofday((void*)ts, NULL); ++ ts->tv_nsec *= 1000; ++ } else { ++ extern void BUG_need_to_implement_gettimeofday_ns(void); ++ BUG_need_to_implement_gettimeofday_ns(); ++ } ++} ++#endif ++ ++/* Compare possibly overflowing unsigned counters */ ++#define LESS(a,b) ((int)((unsigned)(b) - (unsigned)(a)) > 0) ++ + static int selfpipe[2]; + + /* state */ +@@ -126,14 +154,6 @@ + return 0; + } + +-#define LESS(a,b) ((int)((unsigned)(b) - (unsigned)(a)) > 0) +- +-#include <sys/syscall.h> +-static void gettimeofday_ns(struct timespec *ts) +-{ +- syscall(__NR_clock_gettime, CLOCK_REALTIME, ts); +-} +- + static void update_status(struct svdir *s) + { + ssize_t sz; |