diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-06-29 02:25:53 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-06-29 02:25:53 +0000 |
commit | ce13b7600277478055de0b7c38b483a76145efd2 (patch) | |
tree | b952e4328f8e182099fb3d72afc5c8978a56ebff | |
parent | 540ab7097c2932e8ef9e3bbb6abf5604c05acdde (diff) | |
download | busybox-w32-ce13b7600277478055de0b7c38b483a76145efd2.tar.gz busybox-w32-ce13b7600277478055de0b7c38b483a76145efd2.tar.bz2 busybox-w32-ce13b7600277478055de0b7c38b483a76145efd2.zip |
libbb: shrink monotonic_XXX functions, introduce monotonic_ns
(unused for now)
function old new delta
get_mono - 31 +31
sv_main 1228 1234 +6
expand 1693 1697 +4
get_address 178 181 +3
utoa_to_buf 108 110 +2
builtin_exit 46 48 +2
qrealloc 36 33 -3
qgravechar 109 106 -3
ash_main 1383 1380 -3
grep_file 850 846 -4
popstring 140 134 -6
monotonic_us 85 60 -25
monotonic_sec 41 16 -25
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 5/7 up/down: 48/-69) Total: -21 bytes
-rw-r--r-- | include/libbb.h | 1 | ||||
-rw-r--r-- | libbb/time.c | 29 | ||||
-rw-r--r-- | shell/ash.c | 12 |
3 files changed, 31 insertions, 11 deletions
diff --git a/include/libbb.h b/include/libbb.h index d74f8021b..7bc0dca2f 100644 --- a/include/libbb.h +++ b/include/libbb.h | |||
@@ -237,6 +237,7 @@ extern int *const bb_errno; | |||
237 | #define errno (*bb_errno) | 237 | #define errno (*bb_errno) |
238 | #endif | 238 | #endif |
239 | 239 | ||
240 | unsigned long long monotonic_ns(void) FAST_FUNC; | ||
240 | unsigned long long monotonic_us(void) FAST_FUNC; | 241 | unsigned long long monotonic_us(void) FAST_FUNC; |
241 | unsigned monotonic_sec(void) FAST_FUNC; | 242 | unsigned monotonic_sec(void) FAST_FUNC; |
242 | 243 | ||
diff --git a/libbb/time.c b/libbb/time.c index 7d3ac9183..850ac1542 100644 --- a/libbb/time.c +++ b/libbb/time.c | |||
@@ -10,8 +10,8 @@ | |||
10 | #include "libbb.h" | 10 | #include "libbb.h" |
11 | 11 | ||
12 | #if ENABLE_MONOTONIC_SYSCALL | 12 | #if ENABLE_MONOTONIC_SYSCALL |
13 | #include <sys/syscall.h> | ||
14 | 13 | ||
14 | #include <sys/syscall.h> | ||
15 | /* Old glibc (< 2.3.4) does not provide this constant. We use syscall | 15 | /* Old glibc (< 2.3.4) does not provide this constant. We use syscall |
16 | * directly so this definition is safe. */ | 16 | * directly so this definition is safe. */ |
17 | #ifndef CLOCK_MONOTONIC | 17 | #ifndef CLOCK_MONOTONIC |
@@ -20,30 +20,47 @@ | |||
20 | 20 | ||
21 | /* libc has incredibly messy way of doing this, | 21 | /* libc has incredibly messy way of doing this, |
22 | * typically requiring -lrt. We just skip all this mess */ | 22 | * typically requiring -lrt. We just skip all this mess */ |
23 | static void get_mono(struct timespec *ts) | ||
24 | { | ||
25 | if (syscall(__NR_clock_gettime, CLOCK_MONOTONIC, ts)) | ||
26 | bb_error_msg_and_die("clock_gettime(MONOTONIC) failed"); | ||
27 | } | ||
28 | unsigned long long FAST_FUNC monotonic_ns(void) | ||
29 | { | ||
30 | struct timespec ts; | ||
31 | get_mono(&ts); | ||
32 | return ts.tv_sec * 1000000000ULL + ts.tv_nsec; | ||
33 | } | ||
23 | unsigned long long FAST_FUNC monotonic_us(void) | 34 | unsigned long long FAST_FUNC monotonic_us(void) |
24 | { | 35 | { |
25 | struct timespec ts; | 36 | struct timespec ts; |
26 | if (syscall(__NR_clock_gettime, CLOCK_MONOTONIC, &ts)) | 37 | get_mono(&ts); |
27 | bb_error_msg_and_die("clock_gettime(MONOTONIC) failed"); | ||
28 | return ts.tv_sec * 1000000ULL + ts.tv_nsec/1000; | 38 | return ts.tv_sec * 1000000ULL + ts.tv_nsec/1000; |
29 | } | 39 | } |
30 | unsigned FAST_FUNC monotonic_sec(void) | 40 | unsigned FAST_FUNC monotonic_sec(void) |
31 | { | 41 | { |
32 | struct timespec ts; | 42 | struct timespec ts; |
33 | if (syscall(__NR_clock_gettime, CLOCK_MONOTONIC, &ts)) | 43 | get_mono(&ts); |
34 | bb_error_msg_and_die("clock_gettime(MONOTONIC) failed"); | ||
35 | return ts.tv_sec; | 44 | return ts.tv_sec; |
36 | } | 45 | } |
46 | |||
37 | #else | 47 | #else |
48 | |||
49 | unsigned long long FAST_FUNC monotonic_ns(void) | ||
50 | { | ||
51 | struct timeval tv; | ||
52 | gettimeofday(&tv, NULL); | ||
53 | return tv.tv_sec * 1000000000ULL + tv.tv_usec * 1000; | ||
54 | } | ||
38 | unsigned long long FAST_FUNC monotonic_us(void) | 55 | unsigned long long FAST_FUNC monotonic_us(void) |
39 | { | 56 | { |
40 | struct timeval tv; | 57 | struct timeval tv; |
41 | gettimeofday(&tv, NULL); | 58 | gettimeofday(&tv, NULL); |
42 | return tv.tv_sec * 1000000ULL + tv.tv_usec; | 59 | return tv.tv_sec * 1000000ULL + tv.tv_usec; |
43 | } | 60 | } |
44 | |||
45 | unsigned FAST_FUNC monotonic_sec(void) | 61 | unsigned FAST_FUNC monotonic_sec(void) |
46 | { | 62 | { |
47 | return time(NULL); | 63 | return time(NULL); |
48 | } | 64 | } |
65 | |||
49 | #endif | 66 | #endif |
diff --git a/shell/ash.c b/shell/ash.c index 9c3216243..85064d5af 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
@@ -9615,7 +9615,6 @@ setcmd(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) | |||
9615 | } | 9615 | } |
9616 | 9616 | ||
9617 | #if ENABLE_ASH_RANDOM_SUPPORT | 9617 | #if ENABLE_ASH_RANDOM_SUPPORT |
9618 | /* Roughly copied from bash.. */ | ||
9619 | static void | 9618 | static void |
9620 | change_random(const char *value) | 9619 | change_random(const char *value) |
9621 | { | 9620 | { |
@@ -9636,10 +9635,11 @@ change_random(const char *value) | |||
9636 | if (random_galois_LFSR < 0) /* if we just shifted 1 out of msb... */ | 9635 | if (random_galois_LFSR < 0) /* if we just shifted 1 out of msb... */ |
9637 | t ^= MASK; | 9636 | t ^= MASK; |
9638 | random_galois_LFSR = t; | 9637 | random_galois_LFSR = t; |
9639 | /* Both are weak, xoring them gives better randomness | 9638 | /* Both are weak, combining them gives better randomness |
9640 | * and ~2^64 period. & 0x7fff is probably bash compat | 9639 | * and ~2^64 period. & 0x7fff is probably bash compat |
9641 | * for $RANDOM range. */ | 9640 | * for $RANDOM range. Combining with subtraction is |
9642 | t = (t ^ random_LCG) & 0x7fff; | 9641 | * just for fun. + and ^ would work equally well. */ |
9642 | t = (t - random_LCG) & 0x7fff; | ||
9643 | /* set without recursion */ | 9643 | /* set without recursion */ |
9644 | setvar(vrandom.text, utoa(t), VNOFUNC); | 9644 | setvar(vrandom.text, utoa(t), VNOFUNC); |
9645 | vrandom.flags &= ~VNOFUNC; | 9645 | vrandom.flags &= ~VNOFUNC; |
@@ -13432,7 +13432,9 @@ int ash_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
13432 | rootpid = getpid(); | 13432 | rootpid = getpid(); |
13433 | 13433 | ||
13434 | #if ENABLE_ASH_RANDOM_SUPPORT | 13434 | #if ENABLE_ASH_RANDOM_SUPPORT |
13435 | random_galois_LFSR = random_LCG = rootpid + time(NULL); | 13435 | /* Can use monotonic_ns() for better randomness but for now it is |
13436 | * not used anywhere else in busybox... so avoid bloat */ | ||
13437 | random_galois_LFSR = random_LCG = rootpid + monotonic_us(); | ||
13436 | #endif | 13438 | #endif |
13437 | init(); | 13439 | init(); |
13438 | setstackmark(&smark); | 13440 | setstackmark(&smark); |