summaryrefslogtreecommitdiff
path: root/package/busybox/busybox-1.7.0-gettimeofday_ns.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/busybox/busybox-1.7.0-gettimeofday_ns.patch')
-rw-r--r--package/busybox/busybox-1.7.0-gettimeofday_ns.patch95
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;