diff options
| author | Paul Eggert | 2013-09-19 14:40:08 -0700 |
|---|---|---|
| committer | Paul Eggert | 2013-09-19 14:40:08 -0700 |
| commit | 230fe2a5a10f2bc128f354e3fb1b48536b1f143b (patch) | |
| tree | b282d5f242b8ada877d188d03d43da78b175d67a /lib/dtotimespec.c | |
| parent | c39cc7d149d28060c40bc206eb8a63f7a0636301 (diff) | |
| download | emacs-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.c | 30 |
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 @@ | |||
| 29 | struct timespec | 29 | struct timespec |
| 30 | dtotimespec (double sec) | 30 | dtotimespec (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 | } |