summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2014-03-14 21:43:56 -0400
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2014-03-14 21:44:20 -0400
commit8fe90522fb74dd84ff791a7546fee70047672396 (patch)
tree431a098266bd3ea245a0f019678667a06cc094b0
parent40b71e89bae4e51768db4dc50ec64c1e9c96eec4 (diff)
timedated: use builtins for integer log and exp
-rw-r--r--src/shared/util.h6
-rw-r--r--src/test/test-util.c12
-rw-r--r--src/timedate/timedate-sntp.c25
3 files changed, 21 insertions, 22 deletions
diff --git a/src/shared/util.h b/src/shared/util.h
index c596d795d3..7752b1e3df 100644
--- a/src/shared/util.h
+++ b/src/shared/util.h
@@ -782,6 +782,12 @@ static inline unsigned u32ctz(uint32_t n) {
#endif
}
+static inline int log2i(int x) {
+ assert(x > 0);
+
+ return __SIZEOF_INT__ * 8 - __builtin_clz(x) - 1;
+}
+
static inline bool logind_running(void) {
return access("/run/systemd/seats/", F_OK) >= 0;
}
diff --git a/src/test/test-util.c b/src/test/test-util.c
index 6297182e0b..a6247726b0 100644
--- a/src/test/test-util.c
+++ b/src/test/test-util.c
@@ -645,6 +645,17 @@ static void test_hexdump(void) {
hexdump(stdout, data, sizeof(data));
}
+static void test_log2i(void) {
+ assert_se(log2i(1) == 0);
+ assert_se(log2i(2) == 1);
+ assert_se(log2i(3) == 1);
+ assert_se(log2i(4) == 2);
+ assert_se(log2i(32) == 5);
+ assert_se(log2i(33) == 5);
+ assert_se(log2i(63) == 5);
+ assert_se(log2i(INT_MAX) == sizeof(int)*8-2);
+}
+
int main(int argc, char *argv[]) {
log_parse_environment();
log_open();
@@ -687,6 +698,7 @@ int main(int argc, char *argv[]) {
test_in_set();
test_writing_tmpfile();
test_hexdump();
+ test_log2i();
return 0;
}
diff --git a/src/timedate/timedate-sntp.c b/src/timedate/timedate-sntp.c
index 608177f662..4d992c49de 100644
--- a/src/timedate/timedate-sntp.c
+++ b/src/timedate/timedate-sntp.c
@@ -138,25 +138,6 @@ struct SNTPContext {
static int sntp_arm_timer(SNTPContext *sntp);
-static int log2i(int a) {
- int exp = 0;
-
- assert(a > 0);
-
- while (a > 0) {
- a >>= 1;
- exp++;
- }
-
- return exp;
-}
-
-static double log2d(int a) {
- if (a < 0)
- return 1.0 / (1UL << - a);
- return 1UL << a;
-}
-
static double ntp_ts_to_d(const struct ntp_ts *ts) {
return be32toh(ts->sec) + ((double)be32toh(ts->frac) / UINT_MAX);
}
@@ -531,21 +512,21 @@ static int sntp_receive_response(sd_event_source *source, int fd, uint32_t reven
" dest : %f\n"
" offset : %+f sec\n"
" delay : %+f sec\n"
- " packet count : %llu\n"
+ " packet count : %"PRIu64"\n"
" jitter/spike : %f (%s)\n"
" poll interval: %llu\n",
NTP_FIELD_LEAP(ntpmsg->field),
NTP_FIELD_VERSION(ntpmsg->field),
NTP_FIELD_MODE(ntpmsg->field),
ntpmsg->stratum,
- log2d(ntpmsg->precision), ntpmsg->precision,
+ exp2(ntpmsg->precision), ntpmsg->precision,
ntpmsg->stratum == 1 ? ntpmsg->refid : "n/a",
origin - OFFSET_1900_1970,
recv - OFFSET_1900_1970,
trans - OFFSET_1900_1970,
dest - OFFSET_1900_1970,
offset, delay,
- (unsigned long long)sntp->packet_count,
+ sntp->packet_count,
sntp->samples_jitter, spike ? "yes" : "no",
sntp->poll_interval / USEC_PER_SEC);