summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJarkko Hietaniemi <jhi@iki.fi>2016-03-03 21:11:38 -0500
committerJarkko Hietaniemi <jhi@iki.fi>2016-03-04 17:46:47 -0500
commitea21af8c42cbf6f433a9fb0cc5c489ebe9e4c11b (patch)
tree7df1ffbd077a5fc2b0aa925cafeb56ca0ff646d9
parent24e1662b30385499d57bc3afec35b6cbdc6ab973 (diff)
downloadperl-ea21af8c42cbf6f433a9fb0cc5c489ebe9e4c11b.tar.gz
Time-HiRes: avoid going negative on struct timespec
-rw-r--r--dist/Time-HiRes/HiRes.xs20
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);
}