aboutsummaryrefslogtreecommitdiffstats
path: root/lib/dtotimespec.c
diff options
context:
space:
mode:
authorPaul Eggert2013-09-19 14:40:08 -0700
committerPaul Eggert2013-09-19 14:40:08 -0700
commit230fe2a5a10f2bc128f354e3fb1b48536b1f143b (patch)
treeb282d5f242b8ada877d188d03d43da78b175d67a /lib/dtotimespec.c
parentc39cc7d149d28060c40bc206eb8a63f7a0636301 (diff)
downloademacs-230fe2a5a10f2bc128f354e3fb1b48536b1f143b.tar.gz
emacs-230fe2a5a10f2bc128f354e3fb1b48536b1f143b.zip
Merge from gnulib.
This incorporates the following changes: 2013-09-19 stdio: OS X port of putc_unlocked + extern inline 2013-09-19 signal: OS X port of sigaddset etc. + extern inline 2013-09-19 extern-inline: do not always suppress extern inline on OS X 2013-09-17 getgroups: statement without effect 2013-08-28 headers: check that _GL_INLINE_HEADER_BEGIN is defined
Diffstat (limited to 'lib/dtotimespec.c')
-rw-r--r--lib/dtotimespec.c30
1 files changed, 10 insertions, 20 deletions
diff --git a/lib/dtotimespec.c b/lib/dtotimespec.c
index ecce2e5bcc5..064f7d3a0a9 100644
--- a/lib/dtotimespec.c
+++ b/lib/dtotimespec.c
@@ -29,41 +29,31 @@
29struct timespec 29struct timespec
30dtotimespec (double sec) 30dtotimespec (double sec)
31{ 31{
32 enum { BILLION = 1000 * 1000 * 1000 };
33 double min_representable = TYPE_MINIMUM (time_t); 32 double min_representable = TYPE_MINIMUM (time_t);
34 double max_representable = 33 double max_representable =
35 ((TYPE_MAXIMUM (time_t) * (double) BILLION + (BILLION - 1)) 34 ((TYPE_MAXIMUM (time_t) * (double) TIMESPEC_RESOLUTION
36 / BILLION); 35 + (TIMESPEC_RESOLUTION - 1))
37 struct timespec r; 36 / TIMESPEC_RESOLUTION);
38 37
39 if (! (min_representable < sec)) 38 if (! (min_representable < sec))
40 { 39 return make_timespec (TYPE_MINIMUM (time_t), 0);
41 r.tv_sec = TYPE_MINIMUM (time_t);
42 r.tv_nsec = 0;
43 }
44 else if (! (sec < max_representable)) 40 else if (! (sec < max_representable))
45 { 41 return make_timespec (TYPE_MAXIMUM (time_t), TIMESPEC_RESOLUTION - 1);
46 r.tv_sec = TYPE_MAXIMUM (time_t);
47 r.tv_nsec = BILLION - 1;
48 }
49 else 42 else
50 { 43 {
51 time_t s = sec; 44 time_t s = sec;
52 double frac = BILLION * (sec - s); 45 double frac = TIMESPEC_RESOLUTION * (sec - s);
53 long ns = frac; 46 long ns = frac;
54 ns += ns < frac; 47 ns += ns < frac;
55 s += ns / BILLION; 48 s += ns / TIMESPEC_RESOLUTION;
56 ns %= BILLION; 49 ns %= TIMESPEC_RESOLUTION;
57 50
58 if (ns < 0) 51 if (ns < 0)
59 { 52 {
60 s--; 53 s--;
61 ns += BILLION; 54 ns += TIMESPEC_RESOLUTION;
62 } 55 }
63 56
64 r.tv_sec = s; 57 return make_timespec (s, ns);
65 r.tv_nsec = ns;
66 } 58 }
67
68 return r;
69} 59}