libbb: shrink monotonic_XXX functions, introduce monotonic_ns (unused for now)
No binary (build failed)
—
(log yok)
| @@ -237,6 +237,7 @@ extern int *const bb_errno; | |
| #define errno (*bb_errno) | |
| #endif | |
| + | unsigned long long monotonic_ns(void) FAST_FUNC; |
| unsigned long long monotonic_us(void) FAST_FUNC; | |
| unsigned monotonic_sec(void) FAST_FUNC; | |
| @@ -10,8 +10,8 @@ | |
| #include "libbb.h" | |
| #if ENABLE_MONOTONIC_SYSCALL | |
| - | #include <sys/syscall.h> |
| + | #include <sys/syscall.h> |
| /* Old glibc (< 2.3.4) does not provide this constant. We use syscall | |
| * directly so this definition is safe. */ | |
| #ifndef CLOCK_MONOTONIC | |
| @@ -20,30 +20,47 @@ | |
| /* libc has incredibly messy way of doing this, | |
| * typically requiring -lrt. We just skip all this mess */ | |
| + | static void get_mono(struct timespec *ts) |
| + | { |
| + | if (syscall(__NR_clock_gettime, CLOCK_MONOTONIC, ts)) |
| + | bb_error_msg_and_die("clock_gettime(MONOTONIC) failed"); |
| + | } |
| + | unsigned long long FAST_FUNC monotonic_ns(void) |
| + | { |
| + | struct timespec ts; |
| + | get_mono(&ts); |
| + | return ts.tv_sec * 1000000000ULL + ts.tv_nsec; |
| + | } |
| unsigned long long FAST_FUNC monotonic_us(void) | |
| { | |
| struct timespec ts; | |
| - | if (syscall(__NR_clock_gettime, CLOCK_MONOTONIC, &ts)) |
| - | bb_error_msg_and_die("clock_gettime(MONOTONIC) failed"); |
| + | get_mono(&ts); |
| return ts.tv_sec * 1000000ULL + ts.tv_nsec/1000; | |
| } | |
| unsigned FAST_FUNC monotonic_sec(void) | |
| { | |
| struct timespec ts; | |
| - | if (syscall(__NR_clock_gettime, CLOCK_MONOTONIC, &ts)) |
| - | bb_error_msg_and_die("clock_gettime(MONOTONIC) failed"); |
| + | get_mono(&ts); |
| return ts.tv_sec; | |
| } | |
| + | |
| #else | |
| + | |
| + | unsigned long long FAST_FUNC monotonic_ns(void) |
| + | { |
| + | struct timeval tv; |
| + | gettimeofday(&tv, NULL); |
| + | return tv.tv_sec * 1000000000ULL + tv.tv_usec * 1000; |
| + | } |
| unsigned long long FAST_FUNC monotonic_us(void) | |
| { | |
| struct timeval tv; | |
| gettimeofday(&tv, NULL); | |
| return tv.tv_sec * 1000000ULL + tv.tv_usec; | |
| } | |
| - | |
| unsigned FAST_FUNC monotonic_sec(void) | |
| { | |
| return time(NULL); | |
| } | |
| + | |
| #endif | |
| @@ -9615,7 +9615,6 @@ setcmd(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) | |
| } | |
| #if ENABLE_ASH_RANDOM_SUPPORT | |
| - | /* Roughly copied from bash.. */ |
| static void | |
| change_random(const char *value) | |
| { | |
| @@ -9636,10 +9635,11 @@ change_random(const char *value) | |
| if (random_galois_LFSR < 0) /* if we just shifted 1 out of msb... */ | |
| t ^= MASK; | |
| random_galois_LFSR = t; | |
| - | /* Both are weak, xoring them gives better randomness |
| + | /* Both are weak, combining them gives better randomness |
| * and ~2^64 period. & 0x7fff is probably bash compat | |
| - | * for $RANDOM range. */ |
| - | t = (t ^ random_LCG) & 0x7fff; |
| + | * for $RANDOM range. Combining with subtraction is |
| + | * just for fun. + and ^ would work equally well. */ |
| + | t = (t - random_LCG) & 0x7fff; |
| /* set without recursion */ | |
| setvar(vrandom.text, utoa(t), VNOFUNC); | |
| vrandom.flags &= ~VNOFUNC; | |
| @@ -13432,7 +13432,9 @@ int ash_main(int argc ATTRIBUTE_UNUSED, char **argv) | |
| rootpid = getpid(); | |
| #if ENABLE_ASH_RANDOM_SUPPORT | |
| - | random_galois_LFSR = random_LCG = rootpid + time(NULL); |
| + | /* Can use monotonic_ns() for better randomness but for now it is |
| + | * not used anywhere else in busybox... so avoid bloat */ |
| + | random_galois_LFSR = random_LCG = rootpid + monotonic_us(); |
| #endif | |
| init(); | |
| setstackmark(&smark); | |