diff options
author | Jarkko Hietaniemi <jhi@iki.fi> | 2016-03-03 21:11:38 -0500 |
---|---|---|
committer | Jarkko Hietaniemi <jhi@iki.fi> | 2016-03-04 17:46:47 -0500 |
commit | ea21af8c42cbf6f433a9fb0cc5c489ebe9e4c11b (patch) | |
tree | 7df1ffbd077a5fc2b0aa925cafeb56ca0ff646d9 | |
parent | 24e1662b30385499d57bc3afec35b6cbdc6ab973 (diff) | |
download | perl-ea21af8c42cbf6f433a9fb0cc5c489ebe9e4c11b.tar.gz |
Time-HiRes: avoid going negative on struct timespec
-rw-r--r-- | dist/Time-HiRes/HiRes.xs | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/dist/Time-HiRes/HiRes.xs b/dist/Time-HiRes/HiRes.xs index 991c10160e..c6ac977528 100644 --- a/dist/Time-HiRes/HiRes.xs +++ b/dist/Time-HiRes/HiRes.xs @@ -902,11 +902,21 @@ static int clock_nanosleep(int clock_id, int flags, static NV nsec_without_unslept(struct timespec *sleepfor, const struct timespec *unslept) { - sleepfor->tv_sec -= unslept->tv_sec; - sleepfor->tv_nsec -= unslept->tv_nsec; - if (sleepfor->tv_nsec < 0) { - sleepfor->tv_sec--; - sleepfor->tv_nsec += IV_1E9; + if (sleepfor->tv_sec >= unslept->tv_sec) { + sleepfor->tv_sec -= unslept->tv_sec; + if (sleepfor->tv_nsec >= unslept->tv_nsec) { + sleepfor->tv_nsec -= unslept->tv_nsec; + } else if (sleepfor->tv_sec > 0) { + sleepfor->tv_sec--; + sleepfor->tv_nsec += IV_1E9; + sleepfor->tv_nsec -= unslept->tv_nsec; + } else { + sleepfor->tv_sec = 0; + sleepfor->tv_nsec = 0; + } + } else { + sleepfor->tv_sec = 0; + sleepfor->tv_nsec = 0; } return ((NV)sleepfor->tv_sec) * NV_1E9 + ((NV)sleepfor->tv_nsec); } |