1 /* $NetBSD: t_time_arith.c,v 1.7 2025/10/06 12:05:04 riastradh Exp $ */ 2 3 /*- 4 * Copyright (c) 2024-2025 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 17 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #include <sys/cdefs.h> 30 __RCSID("$NetBSD: t_time_arith.c,v 1.7 2025/10/06 12:05:04 riastradh Exp $"); 31 32 #include <sys/timearith.h> 33 34 #include <atf-c.h> 35 #include <errno.h> 36 #include <limits.h> 37 #include <setjmp.h> 38 #include <signal.h> 39 #include <stdbool.h> 40 #include <stdint.h> 41 #include <stdio.h> 42 #include <stdlib.h> 43 #include <string.h> 44 #include <time.h> 45 #include <unistd.h> 46 #include <util.h> 47 48 #include "h_macros.h" 49 50 enum { HZ = 100 }; 51 52 int hz = HZ; 53 int tick = 1000000/HZ; 54 55 static sig_atomic_t jmp_en; 56 static int jmp_sig; 57 static jmp_buf jmp; 58 59 static void 60 handle_signal(int signo) 61 { 62 const int errno_save = errno; 63 char buf[32]; 64 65 snprintf_ss(buf, sizeof(buf), "signal %d\n", signo); 66 (void)write(STDERR_FILENO, buf, strlen(buf)); 67 68 errno = errno_save; 69 70 if (jmp_en) { 71 jmp_sig = signo; 72 jmp_en = 0; 73 longjmp(jmp, 1); 74 } else { 75 raise_default_signal(signo); 76 } 77 } 78 79 const struct itimer_transition { 80 struct itimerspec it_time; 81 struct timespec it_now; 82 struct timespec it_next; 83 int it_overruns; 84 const char *it_xfail; 85 } itimer_transitions[] = { 86 /* 87 * Fired more than one interval early -- treat clock as wound 88 * backwards, not counting overruns. Advance to the next 89 * integral multiple of it_interval starting from it_value. 90 */ 91 [0] = {{.it_value = {3,0}, .it_interval = {1,0}}, 92 {0,1}, {1,0}, 0, 93 NULL}, 94 [1] = {{.it_value = {3,0}, .it_interval = {1,0}}, 95 {0,500000000}, {1,0}, 0, 96 NULL}, 97 [2] = {{.it_value = {3,0}, .it_interval = {1,0}}, 98 {0,999999999}, {1,0}, 0, 99 NULL}, 100 [3] = {{.it_value = {3,0}, .it_interval = {1,0}}, 101 {1,0}, {2,0}, 0, 102 NULL}, 103 [4] = {{.it_value = {3,0}, .it_interval = {1,0}}, 104 {1,1}, {2,0}, 0, 105 NULL}, 106 [5] = {{.it_value = {3,0}, .it_interval = {1,0}}, 107 {1,500000000}, {2,0}, 0, 108 NULL}, 109 [6] = {{.it_value = {3,0}, .it_interval = {1,0}}, 110 {1,999999999}, {2,0}, 0, 111 NULL}, 112 113 /* 114 * Fired exactly one interval early. Treat this too as clock 115 * wound backwards. 116 */ 117 [7] = {{.it_value = {3,0}, .it_interval = {1,0}}, 118 {2,0}, {3,0}, 0, 119 NULL}, 120 121 /* 122 * Fired less than one interval early -- callouts and real-time 123 * clock might not be perfectly synced, counted as zero 124 * overruns. Advance by one interval from the scheduled time. 125 */ 126 [8] = {{.it_value = {3,0}, .it_interval = {1,0}}, 127 {2,1}, {3,0}, 0, 128 NULL}, 129 [9] = {{.it_value = {3,0}, .it_interval = {1,0}}, 130 {2,500000000}, {3,0}, 0, 131 NULL}, 132 [10] = {{.it_value = {3,0}, .it_interval = {1,0}}, 133 {2,999999999}, {3,0}, 0, 134 NULL}, 135 136 /* 137 * Fired exactly on time. Advance by one interval. 138 */ 139 [11] = {{.it_value = {3,0}, .it_interval = {1,0}}, 140 {3,0}, {4,0}, 0, NULL}, 141 142 /* 143 * Fired late by less than one interval -- callouts and 144 * real-time clock might not be prefectly synced, counted as 145 * zero overruns. Advance by one interval from the scheduled 146 * time (even if it's very close to a full interval). 147 */ 148 [12] = {{.it_value = {3,0}, .it_interval = {1,0}}, 149 {3,1}, {4,0}, 0, NULL}, 150 [14] = {{.it_value = {3,0}, .it_interval = {1,0}}, 151 {3,500000000}, {4,0}, 0, NULL}, 152 [15] = {{.it_value = {3,0}, .it_interval = {1,0}}, 153 {3,999999999}, {4,0}, 0, NULL}, 154 155 /* 156 * Fired late by exactly one interval -- treat it as overrun. 157 */ 158 [16] = {{.it_value = {3,0}, .it_interval = {1,0}}, 159 {4,0}, {5,0}, 1, 160 NULL}, 161 162 /* 163 * Fired late by more than one interval but less than two -- 164 * overrun. 165 */ 166 [17] = {{.it_value = {3,0}, .it_interval = {1,0}}, 167 {4,1}, {5,0}, 1, 168 NULL}, 169 [18] = {{.it_value = {3,0}, .it_interval = {1,0}}, 170 {4,500000000}, {5,0}, 1, 171 NULL}, 172 [19] = {{.it_value = {3,0}, .it_interval = {1,0}}, 173 {4,999999999}, {5,0}, 1, 174 NULL}, 175 176 /* 177 * Fired late by exactly two intervals -- two overruns. 178 */ 179 [20] = {{.it_value = {3,0}, .it_interval = {1,0}}, 180 {5,0}, {6,0}, 2, 181 NULL}, 182 183 /* 184 * Fired late by more intervals plus slop, up to 32. 185 * 186 * XXX Define DELAYTIMER_MAX so we can write it in terms of 187 * that. 188 */ 189 [21] = {{.it_value = {3,0}, .it_interval = {1,0}}, 190 {13,123456789}, {14,0}, 10, 191 NULL}, 192 [22] = {{.it_value = {3,0}, .it_interval = {1,0}}, 193 {34,999999999}, {35,0}, 31, 194 NULL}, 195 196 /* 197 * Fired late by roughly INT_MAX intervals. 198 */ 199 [23] = {{.it_value = {3,0}, .it_interval = {1,0}}, 200 {(time_t)3 + INT_MAX - 1, 0}, 201 {(time_t)3 + INT_MAX, 0}, 202 INT_MAX - 1, 203 NULL}, 204 [24] = {{.it_value = {3,0}, .it_interval = {1,0}}, 205 {(time_t)3 + INT_MAX, 0}, 206 {(time_t)3 + INT_MAX + 1, 0}, 207 INT_MAX, 208 NULL}, 209 [25] = {{.it_value = {3,0}, .it_interval = {1,0}}, 210 {(time_t)3 + INT_MAX + 1, 0}, 211 {(time_t)3 + INT_MAX + 2, 0}, 212 INT_MAX, 213 NULL}, 214 215 /* (2^63 - 1) ns */ 216 [26] = {{.it_value = {3,0}, .it_interval = {9223372036,854775807}}, 217 {3,1}, {9223372039,854775807}, 0, NULL}, 218 /* 2^63 ns */ 219 [27] = {{.it_value = {3,0}, .it_interval = {9223372036,854775808}}, 220 {3,1}, {9223372039,854775808}, 0, NULL}, 221 /* (2^63 + 1) ns */ 222 [28] = {{.it_value = {3,0}, .it_interval = {9223372036,854775809}}, 223 {3,1}, {9223372039,854775809}, 0, NULL}, 224 225 /* 226 * Overflows -- we should (XXX but currently don't) reject 227 * intervals of at least 2^64 nanoseconds up front, since this 228 * is more time than it is reasonable to wait (more than 584 229 * years). 230 */ 231 232 /* (2^64 - 1) ns */ 233 [29] = {{.it_value = {3,0}, .it_interval = {18446744073,709551615}}, 234 {2,999999999}, {0,0}, 0, 235 NULL}, 236 /* 2^64 ns */ 237 [30] = {{.it_value = {3,0}, .it_interval = {18446744073,709551616}}, 238 {2,999999999}, {0,0}, 0, 239 NULL}, 240 /* (2^64 + 1) ns */ 241 [31] = {{.it_value = {3,0}, .it_interval = {18446744073,709551617}}, 242 {2,999999999}, {0,0}, 0, 243 NULL}, 244 245 /* (2^63 - 1) us */ 246 [32] = {{.it_value = {3,0}, .it_interval = {9223372036854,775807}}, 247 {2,999999999}, {0,0}, 0, 248 NULL}, 249 /* 2^63 us */ 250 [33] = {{.it_value = {3,0}, .it_interval = {9223372036854,775808}}, 251 {2,999999999}, {0,0}, 0, 252 NULL}, 253 /* (2^63 + 1) us */ 254 [34] = {{.it_value = {3,0}, .it_interval = {9223372036854,775809}}, 255 {2,999999999}, {0,0}, 0, 256 NULL}, 257 258 /* (2^64 - 1) us */ 259 [35] = {{.it_value = {3,0}, .it_interval = {18446744073709,551615}}, 260 {2,999999999}, {0,0}, 0, 261 NULL}, 262 /* 2^64 us */ 263 [36] = {{.it_value = {3,0}, .it_interval = {18446744073709,551616}}, 264 {2,999999999}, {0,0}, 0, 265 NULL}, 266 /* (2^64 + 1) us */ 267 [37] = {{.it_value = {3,0}, .it_interval = {18446744073709,551617}}, 268 {2,999999999}, {0,0}, 0, 269 NULL}, 270 271 /* (2^63 - 1) ms */ 272 [38] = {{.it_value = {3,0}, .it_interval = {9223372036854775,807}}, 273 {2,999999999}, {0,0}, 0, 274 NULL}, 275 /* 2^63 ms */ 276 [39] = {{.it_value = {3,0}, .it_interval = {9223372036854775,808}}, 277 {2,999999999}, {0,0}, 0, 278 NULL}, 279 /* (2^63 + 1) ms */ 280 [40] = {{.it_value = {3,0}, .it_interval = {9223372036854775,809}}, 281 {2,999999999}, {0,0}, 0, 282 NULL}, 283 284 /* (2^64 - 1) ms */ 285 [41] = {{.it_value = {3,0}, .it_interval = {18446744073709551,615}}, 286 {2,999999999}, {0,0}, 0, 287 NULL}, 288 /* 2^64 ms */ 289 [42] = {{.it_value = {3,0}, .it_interval = {18446744073709551,616}}, 290 {2,999999999}, {0,0}, 0, 291 NULL}, 292 /* (2^64 + 1) ms */ 293 [43] = {{.it_value = {3,0}, .it_interval = {18446744073709551,617}}, 294 {2,999999999}, {0,0}, 0, 295 NULL}, 296 297 /* invalid intervals */ 298 [44] = {{.it_value = {3,0}, .it_interval = {-1,0}}, 299 {3,1}, {0,0}, 0, NULL}, 300 [45] = {{.it_value = {3,0}, .it_interval = {0,-1}}, 301 {3,1}, {0,0}, 0, NULL}, 302 [46] = {{.it_value = {3,0}, .it_interval = {0,1000000000}}, 303 {3,1}, {0,0}, 0, NULL}, 304 305 /* 306 * Overflow nanosecond arithmetic. The magic interval number 307 * here is ceiling(INT64_MAX/2) nanoseconds. The interval 308 * start value will be rounded to an integral number of ticks, 309 * so rather than write exactly `4611686018,427387905', just 310 * round up the `now' value to the next second. This forces an 311 * overrun _and_ triggers int64_t arithmetic overflow. 312 */ 313 [47] = {{.it_value = {0,1}, 314 .it_interval = {4611686018,427387904}}, 315 /* XXX needless overflow */ 316 {4611686019,0}, {0,0}, 1, 317 NULL}, 318 319 /* interval ~ 1/4 * (2^63 - 1) ns, now ~ 3/4 * (2^63 - 1) ns */ 320 [48] = {{.it_value = {0,1}, 321 .it_interval = {2305843009,213693952}}, 322 /* XXX needless overflow */ 323 {6917529028,0}, {0,0}, 3, 324 NULL}, 325 [49] = {{.it_value = {6917529027,0}, 326 .it_interval = {2305843009,213693952}}, 327 {6917529028,0}, {9223372036,213693952}, 0, NULL}, 328 [50] = {{.it_value = {6917529029,0}, 329 .it_interval = {2305843009,213693952}}, 330 {6917529028,0}, {6917529029,0}, 0, 331 NULL}, 332 333 /* interval ~ 1/2 * (2^63 - 1) ns, now ~ 3/4 * (2^63 - 1) ns */ 334 [51] = {{.it_value = {0,1}, 335 .it_interval = {4611686018,427387904}}, 336 /* XXX needless overflow */ 337 {6917529028,0}, {0,0}, 1, 338 NULL}, 339 [52] = {{.it_value = {2305843009,213693951}, /* ~1/4 * (2^63 - 1) */ 340 .it_interval = {4611686018,427387904}}, 341 /* XXX needless overflow */ 342 {6917529028,0}, {0,0}, 1, 343 NULL}, 344 [54] = {{.it_value = {6917529027,0}, 345 .it_interval = {4611686018,427387904}}, 346 {6917529028,0}, {11529215045,427387904}, 0, NULL}, 347 [55] = {{.it_value = {6917529029,0}, 348 .it_interval = {4611686018,427387904}}, 349 {6917529028,0}, {6917529029,0}, 0, 350 NULL}, 351 352 [56] = {{.it_value = {INT64_MAX - 1,0}, .it_interval = {1,0}}, 353 /* XXX needless overflow */ 354 {INT64_MAX - 2,999999999}, {0,0}, 0, 355 NULL}, 356 [57] = {{.it_value = {INT64_MAX - 1,0}, .it_interval = {1,0}}, 357 {INT64_MAX - 1,0}, {INT64_MAX,0}, 0, NULL}, 358 [58] = {{.it_value = {INT64_MAX - 1,0}, .it_interval = {1,0}}, 359 {INT64_MAX - 1,1}, {INT64_MAX,0}, 0, NULL}, 360 [59] = {{.it_value = {INT64_MAX - 1,0}, .it_interval = {1,0}}, 361 {INT64_MAX - 1,999999999}, {INT64_MAX,0}, 0, NULL}, 362 [60] = {{.it_value = {INT64_MAX - 1,0}, .it_interval = {1,0}}, 363 {INT64_MAX,0}, {0,0}, 0, 364 NULL}, 365 [61] = {{.it_value = {INT64_MAX - 1,0}, .it_interval = {1,0}}, 366 {INT64_MAX,1}, {0,0}, 0, 367 NULL}, 368 [62] = {{.it_value = {INT64_MAX - 1,0}, .it_interval = {1,0}}, 369 {INT64_MAX,999999999}, {0,0}, 0, 370 NULL}, 371 372 [63] = {{.it_value = {INT64_MAX,0}, .it_interval = {1,0}}, 373 {INT64_MAX - 1,1}, {0,0}, 0, 374 NULL}, 375 [64] = {{.it_value = {INT64_MAX,0}, .it_interval = {1,0}}, 376 {INT64_MAX - 1,999999999}, {0,0}, 0, 377 NULL}, 378 [65] = {{.it_value = {INT64_MAX,0}, .it_interval = {1,0}}, 379 {INT64_MAX,0}, {0,0}, 0, 380 NULL}, 381 [66] = {{.it_value = {INT64_MAX,0}, .it_interval = {1,0}}, 382 {INT64_MAX,1}, {0,0}, 0, 383 NULL}, 384 [67] = {{.it_value = {INT64_MAX,0}, .it_interval = {1,0}}, 385 {INT64_MAX,999999999}, {0,0}, 0, 386 NULL}, 387 }; 388 389 ATF_TC(itimer_transitions); 390 ATF_TC_HEAD(itimer_transitions, tc) 391 { 392 atf_tc_set_md_var(tc, "descr", 393 "Tests interval timer transitions"); 394 } 395 ATF_TC_BODY(itimer_transitions, tc) 396 { 397 volatile unsigned i; 398 399 REQUIRE_LIBC(signal(SIGFPE, handle_signal), SIG_ERR); 400 REQUIRE_LIBC(signal(SIGABRT, handle_signal), SIG_ERR); 401 402 for (i = 0; i < __arraycount(itimer_transitions); i++) { 403 struct itimer_transition it = itimer_transitions[i]; 404 struct timespec next; 405 int overruns; 406 volatile bool aborted = true; 407 volatile bool expect_abort = false; 408 409 fprintf(stderr, "case %u\n", i); 410 411 if (it.it_xfail) 412 atf_tc_expect_fail("%s", it.it_xfail); 413 414 if (itimespecfix(&it.it_time.it_value) != 0 || 415 itimespecfix(&it.it_time.it_interval) != 0) { 416 fprintf(stderr, "rejected by itimerspecfix\n"); 417 expect_abort = true; 418 } 419 420 if (setjmp(jmp) == 0) { 421 jmp_en = 1; 422 itimer_transition(&it.it_time, &it.it_now, 423 &next, &overruns); 424 jmp_en = 0; 425 aborted = false; 426 } 427 ATF_CHECK(!jmp_en); 428 jmp_en = 0; /* paranoia */ 429 if (expect_abort) { 430 fprintf(stderr, "expected abort\n"); 431 ATF_CHECK_MSG(aborted, 432 "[%u] missing invariant assertion", i); 433 ATF_CHECK_MSG(jmp_sig == SIGABRT, 434 "[%u] missing invariant assertion", i); 435 } else { 436 ATF_CHECK_MSG(!aborted, "[%u] raised signal %d: %s", i, 437 jmp_sig, strsignal(jmp_sig)); 438 } 439 440 ATF_CHECK_MSG((next.tv_sec == it.it_next.tv_sec && 441 next.tv_nsec == it.it_next.tv_nsec), 442 "[%u] periodic intervals of %lld.%09d from %lld.%09d" 443 " last expired at %lld.%09d:" 444 " next expiry at %lld.%09d, expected %lld.%09d", i, 445 (long long)it.it_time.it_interval.tv_sec, 446 (int)it.it_time.it_interval.tv_nsec, 447 (long long)it.it_time.it_value.tv_sec, 448 (int)it.it_time.it_value.tv_nsec, 449 (long long)it.it_now.tv_sec, (int)it.it_now.tv_nsec, 450 (long long)next.tv_sec, (int)next.tv_nsec, 451 (long long)it.it_next.tv_sec, (int)it.it_next.tv_nsec); 452 ATF_CHECK_EQ_MSG(overruns, it.it_overruns, 453 "[%u] periodic intervals of %lld.%09d from %lld.%09d" 454 " last expired at %lld.%09d:" 455 " overruns %d, expected %d", i, 456 (long long)it.it_time.it_interval.tv_sec, 457 (int)it.it_time.it_interval.tv_nsec, 458 (long long)it.it_time.it_value.tv_sec, 459 (int)it.it_time.it_value.tv_nsec, 460 (long long)it.it_now.tv_sec, (int)it.it_now.tv_nsec, 461 overruns, it.it_overruns); 462 463 if (it.it_xfail) 464 atf_tc_expect_pass(); 465 } 466 } 467 468 /* 469 * { 0, if t <= 0; 470 * tstohz(t sec) @ f Hz = { ceil(t/(1/f)), if that's below INT_MAX; 471 * { INT_MAX, otherwise. 472 */ 473 474 #define TSTOHZ_ROUND_XFAIL \ 475 "PR kern/59691: tstohz(9) rounding errors" 476 477 const struct tstohz_case { 478 int ts_hz; 479 struct timespec ts_ts; 480 int ts_ticks; 481 const char *ts_xfail; 482 } tstohz_cases[] = { 483 /* 484 * hz = 10 485 */ 486 487 /* negative inputs yield 0 ticks */ 488 [0] = {10, {.tv_sec = -1, .tv_nsec = 0}, 0, NULL}, 489 [1] = {10, {.tv_sec = -1, .tv_nsec = 999999999}, 0, NULL}, 490 491 /* zero input yields 0 ticks */ 492 [2] = {10, {.tv_sec = 0, .tv_nsec = 0}, 0, NULL}, 493 494 /* 495 * Nonzero input always yields >=2 ticks, because the time from 496 * now until the next tick may be arbitrarily short, and we 497 * need to wait one full tick, so we have to wait for two 498 * ticks. 499 */ 500 [3] = {10, {.tv_sec = 0, .tv_nsec = 1}, 2, NULL}, 501 [4] = {10, {.tv_sec = 0, .tv_nsec = 2}, 2, NULL}, 502 [5] = {10, {.tv_sec = 0, .tv_nsec = 99999999}, 2, NULL}, 503 [6] = {10, {.tv_sec = 0, .tv_nsec = 100000000}, 2, NULL}, 504 [7] = {10, {.tv_sec = 0, .tv_nsec = 100000001}, 3, NULL}, 505 [8] = {10, {.tv_sec = 0, .tv_nsec = 100000002}, 3, NULL}, 506 [9] = {10, {.tv_sec = 0, .tv_nsec = 199999999}, 3, NULL}, 507 [10] = {10, {.tv_sec = 0, .tv_nsec = 200000000}, 3, NULL}, 508 [11] = {10, {.tv_sec = 0, .tv_nsec = 200000001}, 4, NULL}, 509 [12] = {10, {.tv_sec = 0, .tv_nsec = 200000002}, 4, NULL}, 510 [13] = {10, {.tv_sec = 0, .tv_nsec = 999999999}, 11, NULL}, 511 [14] = {10, {.tv_sec = 1, .tv_nsec = 0}, 11, NULL}, 512 [15] = {10, {.tv_sec = 1, .tv_nsec = 1}, 12, NULL}, 513 [16] = {10, {.tv_sec = 1, .tv_nsec = 2}, 12, NULL}, 514 /* .tv_sec ~ INT32_MAX/1000000 */ 515 [17] = {10, {.tv_sec = 2147, .tv_nsec = 999999999}, 21481, NULL}, 516 [18] = {10, {.tv_sec = 2148, .tv_nsec = 0}, 21481, NULL}, 517 [19] = {10, {.tv_sec = 2148, .tv_nsec = 1}, 21482, NULL}, 518 [20] = {10, {.tv_sec = 2148, .tv_nsec = 2}, 21482, NULL}, 519 /* .tv_sec ~ INT32_MAX/hz */ 520 [21] = {10, {.tv_sec = 214748364, .tv_nsec = 499999999}, 2147483646, 521 NULL}, 522 /* saturate at INT_MAX = 2^31 - 1 ticks */ 523 [22] = {10, {.tv_sec = 214748364, .tv_nsec = 500000000}, 2147483646, 524 NULL}, 525 [23] = {10, {.tv_sec = 214748364, .tv_nsec = 500000001}, 2147483647, 526 NULL}, 527 [24] = {10, {.tv_sec = 214748364, .tv_nsec = 500000002}, 2147483647, 528 NULL}, 529 [25] = {10, {.tv_sec = 214748364, .tv_nsec = 599999999}, 2147483647, 530 NULL}, 531 [26] = {10, {.tv_sec = 214748364, .tv_nsec = 600000000}, 2147483647, 532 NULL}, 533 [27] = {10, {.tv_sec = 214748364, .tv_nsec = 999999999}, 2147483647, 534 NULL}, 535 [28] = {10, {.tv_sec = 214748365, .tv_nsec = 0}, 2147483647, 536 NULL}, 537 [29] = {10, {.tv_sec = 214748365, .tv_nsec = 1}, 2147483647, 538 NULL}, 539 [30] = {10, {.tv_sec = 214748365, .tv_nsec = 2}, 2147483647, 540 NULL}, 541 [31] = {10, {.tv_sec = (time_t)INT_MAX + 1, .tv_nsec = 123456789}, 542 INT_MAX, NULL}, 543 /* .tv_sec ~ INT64_MAX/1000000, overflows to INT_MAX ticks */ 544 [32] = {10, {.tv_sec = 9223372036854, .tv_nsec = 999999999}, 545 INT_MAX, NULL}, 546 [33] = {10, {.tv_sec = 9223372036855, .tv_nsec = 0}, 547 INT_MAX, NULL}, 548 [34] = {10, {.tv_sec = 9223372036855, .tv_nsec = 1}, 549 INT_MAX, NULL}, 550 [35] = {10, {.tv_sec = 9223372036855, .tv_nsec = 2}, 551 INT_MAX, NULL}, 552 /* .tv_sec ~ INT64_MAX/hz, overflows to INT_MAX ticks */ 553 [36] = {10, {.tv_sec = 922337203685477580, .tv_nsec = 999999999}, 554 INT_MAX, NULL}, 555 [37] = {10, {.tv_sec = 922337203685477581, .tv_nsec = 0}, 556 INT_MAX, NULL}, 557 [38] = {10, {.tv_sec = 922337203685477581, .tv_nsec = 1}, 558 INT_MAX, NULL}, 559 [39] = {10, {.tv_sec = 922337203685477581, .tv_nsec = 2}, 560 INT_MAX, NULL}, 561 [40] = {10, {.tv_sec = (time_t)INT_MAX + 1, .tv_nsec = 123456789}, 562 INT_MAX, NULL}, 563 564 /* 565 * hz = 100 566 */ 567 568 [41] = {100, {.tv_sec = -1, .tv_nsec = 0}, 0, NULL}, 569 [42] = {100, {.tv_sec = -1, .tv_nsec = 999999999}, 0, NULL}, 570 [43] = {100, {.tv_sec = 0, .tv_nsec = 0}, 0, NULL}, 571 [44] = {100, {.tv_sec = 0, .tv_nsec = 1}, 2, NULL}, 572 [45] = {100, {.tv_sec = 0, .tv_nsec = 2}, 2, NULL}, 573 [46] = {100, {.tv_sec = 0, .tv_nsec = 9999999}, 2, NULL}, 574 [47] = {100, {.tv_sec = 0, .tv_nsec = 10000000}, 2, NULL}, 575 [48] = {100, {.tv_sec = 0, .tv_nsec = 10000001}, 3, NULL}, 576 [49] = {100, {.tv_sec = 0, .tv_nsec = 10000002}, 3, NULL}, 577 [50] = {100, {.tv_sec = 0, .tv_nsec = 19999999}, 3, NULL}, 578 [51] = {100, {.tv_sec = 0, .tv_nsec = 20000000}, 3, NULL}, 579 [52] = {100, {.tv_sec = 0, .tv_nsec = 20000001}, 4, NULL}, 580 [53] = {100, {.tv_sec = 0, .tv_nsec = 20000002}, 4, NULL}, 581 [54] = {100, {.tv_sec = 0, .tv_nsec = 99999999}, 11, NULL}, 582 [55] = {100, {.tv_sec = 0, .tv_nsec = 100000000}, 11, NULL}, 583 [56] = {100, {.tv_sec = 0, .tv_nsec = 100000001}, 12, NULL}, 584 [57] = {100, {.tv_sec = 0, .tv_nsec = 100000002}, 12, NULL}, 585 [58] = {100, {.tv_sec = 0, .tv_nsec = 999999999}, 101, NULL}, 586 [59] = {100, {.tv_sec = 1, .tv_nsec = 0}, 101, NULL}, 587 [60] = {100, {.tv_sec = 1, .tv_nsec = 1}, 102, NULL}, 588 [61] = {100, {.tv_sec = 1, .tv_nsec = 2}, 102, NULL}, 589 /* .tv_sec ~ INT32_MAX/1000000 */ 590 [62] = {100, {.tv_sec = 2147, .tv_nsec = 999999999}, 214801, NULL}, 591 [63] = {100, {.tv_sec = 2148, .tv_nsec = 0}, 214801, NULL}, 592 [64] = {100, {.tv_sec = 2148, .tv_nsec = 1}, 214802, NULL}, 593 [65] = {100, {.tv_sec = 2148, .tv_nsec = 2}, 214802, NULL}, 594 /* .tv_sec ~ INT32_MAX/hz */ 595 [66] = {100, {.tv_sec = 21474836, .tv_nsec = 439999999}, 2147483645, 596 NULL}, 597 [67] = {100, {.tv_sec = 21474836, .tv_nsec = 440000000}, 2147483645, 598 NULL}, 599 [68] = {100, {.tv_sec = 21474836, .tv_nsec = 440000001}, 2147483646, 600 NULL}, 601 [69] = {100, {.tv_sec = 21474836, .tv_nsec = 440000002}, 2147483646, 602 NULL}, 603 [70] = {100, {.tv_sec = 21474836, .tv_nsec = 449999999}, 2147483646, 604 NULL}, 605 [71] = {100, {.tv_sec = 21474836, .tv_nsec = 450000000}, 2147483646, 606 NULL}, 607 /* saturate at INT_MAX = 2^31 - 1 ticks */ 608 [72] = {100, {.tv_sec = 21474836, .tv_nsec = 450000001}, 2147483647, 609 NULL}, 610 [73] = {100, {.tv_sec = 21474836, .tv_nsec = 450000002}, 2147483647, 611 NULL}, 612 [74] = {100, {.tv_sec = 21474836, .tv_nsec = 459999999}, 2147483647, 613 NULL}, 614 [75] = {100, {.tv_sec = 21474836, .tv_nsec = 460000000}, 2147483647, 615 NULL}, 616 [76] = {100, {.tv_sec = 21474836, .tv_nsec = 460000001}, 2147483647, 617 NULL}, 618 [77] = {100, {.tv_sec = 21474836, .tv_nsec = 460000002}, 2147483647, 619 NULL}, 620 [78] = {100, {.tv_sec = 21474836, .tv_nsec = 999999999}, 2147483647, 621 NULL}, 622 [79] = {100, {.tv_sec = 21474837, .tv_nsec = 0}, 2147483647, 623 NULL}, 624 [80] = {100, {.tv_sec = 21474837, .tv_nsec = 1}, 2147483647, 625 NULL}, 626 [81] = {100, {.tv_sec = 21474837, .tv_nsec = 2}, 2147483647, 627 NULL}, 628 [82] = {100, {.tv_sec = 21474837, .tv_nsec = 2}, 2147483647, 629 NULL}, 630 /* .tv_sec ~ INT64_MAX/1000000 */ 631 [83] = {100, {.tv_sec = 9223372036854, .tv_nsec = 999999999}, 632 INT_MAX, NULL}, 633 [84] = {100, {.tv_sec = 9223372036855, .tv_nsec = 0}, 634 INT_MAX, NULL}, 635 [85] = {100, {.tv_sec = 9223372036855, .tv_nsec = 1}, 636 INT_MAX, NULL}, 637 [86] = {100, {.tv_sec = 9223372036855, .tv_nsec = 2}, 638 INT_MAX, NULL}, 639 /* .tv_sec ~ INT64_MAX/hz, overflows to INT_MAX ticks */ 640 [87] = {100, {.tv_sec = 92233720368547758, .tv_nsec = 999999999}, 641 INT_MAX, NULL}, 642 [88] = {100, {.tv_sec = 92233720368547758, .tv_nsec = 0}, 643 INT_MAX, NULL}, 644 [89] = {100, {.tv_sec = 92233720368547758, .tv_nsec = 1}, 645 INT_MAX, NULL}, 646 [90] = {100, {.tv_sec = 92233720368547758, .tv_nsec = 2}, 647 INT_MAX, NULL}, 648 [91] = {100, {.tv_sec = (time_t)INT_MAX + 1, .tv_nsec = 123456789}, 649 INT_MAX, NULL}, 650 651 /* 652 * hz = 1000 653 */ 654 655 [92] = {1000, {.tv_sec = -1, .tv_nsec = 0}, 0, NULL}, 656 [93] = {1000, {.tv_sec = -1, .tv_nsec = 999999999}, 0, NULL}, 657 [94] = {1000, {.tv_sec = 0, .tv_nsec = 0}, 0, NULL}, 658 [95] = {1000, {.tv_sec = 0, .tv_nsec = 1}, 2, NULL}, 659 [96] = {1000, {.tv_sec = 0, .tv_nsec = 2}, 2, NULL}, 660 [97] = {1000, {.tv_sec = 0, .tv_nsec = 999999}, 2, NULL}, 661 [98] = {1000, {.tv_sec = 0, .tv_nsec = 1000000}, 2, NULL}, 662 [99] = {1000, {.tv_sec = 0, .tv_nsec = 1000001}, 3, NULL}, 663 [100] = {1000, {.tv_sec = 0, .tv_nsec = 1000002}, 3, NULL}, 664 [101] = {1000, {.tv_sec = 0, .tv_nsec = 1999999}, 3, NULL}, 665 [102] = {1000, {.tv_sec = 0, .tv_nsec = 2000000}, 3, NULL}, 666 [103] = {1000, {.tv_sec = 0, .tv_nsec = 2000001}, 4, NULL}, 667 [104] = {1000, {.tv_sec = 0, .tv_nsec = 2000002}, 4, NULL}, 668 [105] = {1000, {.tv_sec = 0, .tv_nsec = 999999999}, 1001, NULL}, 669 [106] = {1000, {.tv_sec = 1, .tv_nsec = 0}, 1001, NULL}, 670 [107] = {1000, {.tv_sec = 1, .tv_nsec = 1}, 1002, NULL}, 671 [108] = {1000, {.tv_sec = 1, .tv_nsec = 2}, 1002, NULL}, 672 /* .tv_sec ~ INT_MAX/1000000 */ 673 [109] = {1000, {.tv_sec = 2147, .tv_nsec = 999999999}, 2148001, NULL}, 674 [110] = {1000, {.tv_sec = 2148, .tv_nsec = 0}, 2148001, NULL}, 675 [111] = {1000, {.tv_sec = 2148, .tv_nsec = 1}, 2148002, NULL}, 676 [112] = {1000, {.tv_sec = 2148, .tv_nsec = 2}, 2148002, NULL}, 677 /* .tv_sec ~ INT_MAX/hz */ 678 [113] = {1000, {.tv_sec = 2147483, .tv_nsec = 643999999}, 2147483645, 679 NULL}, 680 [114] = {1000, {.tv_sec = 2147483, .tv_nsec = 644000000}, 2147483645, 681 NULL}, 682 [115] = {1000, {.tv_sec = 2147483, .tv_nsec = 644000001}, 2147483646, 683 NULL}, 684 [116] = {1000, {.tv_sec = 2147483, .tv_nsec = 644000002}, 2147483646, 685 NULL}, 686 [117] = {1000, {.tv_sec = 2147483, .tv_nsec = 644999999}, 2147483646, 687 NULL}, 688 [118] = {1000, {.tv_sec = 2147483, .tv_nsec = 645000000}, 2147483646, 689 NULL}, 690 /* saturate at INT_MAX = 2^31 - 1 ticks */ 691 [119] = {1000, {.tv_sec = 2147483, .tv_nsec = 645000001}, 2147483647, 692 NULL}, 693 [120] = {1000, {.tv_sec = 2147483, .tv_nsec = 645000002}, 2147483647, 694 NULL}, 695 [121] = {1000, {.tv_sec = 2147483, .tv_nsec = 645999999}, 2147483647, 696 NULL}, 697 [122] = {1000, {.tv_sec = 2147483, .tv_nsec = 646000000}, 2147483647, 698 NULL}, 699 [123] = {1000, {.tv_sec = 2147483, .tv_nsec = 646000001}, 2147483647, 700 NULL}, 701 [124] = {1000, {.tv_sec = 2147483, .tv_nsec = 646000002}, 2147483647, 702 NULL}, 703 [125] = {1000, {.tv_sec = 2147483, .tv_nsec = 699999999}, 2147483647, 704 NULL}, 705 [126] = {1000, {.tv_sec = 2147484, .tv_nsec = 0}, 2147483647, 706 NULL}, 707 [127] = {1000, {.tv_sec = 2147484, .tv_nsec = 1}, 2147483647, 708 NULL}, 709 [128] = {1000, {.tv_sec = 2147484, .tv_nsec = 2}, 2147483647, 710 NULL}, 711 [129] = {1000, {.tv_sec = 2147484, .tv_nsec = 2}, 2147483647, 712 NULL}, 713 /* .tv_sec ~ INT64_MAX/1000000, overflows to INT_MAX ticks */ 714 [130] = {1000, {.tv_sec = 9223372036854, .tv_nsec = 999999999}, 715 INT_MAX, NULL}, 716 [131] = {1000, {.tv_sec = 9223372036855, .tv_nsec = 0}, 717 INT_MAX, NULL}, 718 [132] = {1000, {.tv_sec = 9223372036855, .tv_nsec = 1}, 719 INT_MAX, NULL}, 720 [133] = {1000, {.tv_sec = 9223372036855, .tv_nsec = 2}, 721 INT_MAX, NULL}, 722 /* .tv_sec ~ INT64_MAX/hz, overflows to INT_MAX ticks */ 723 [134] = {1000, {.tv_sec = 92233720368547758, .tv_nsec = 999999999}, 724 INT_MAX, NULL}, 725 [135] = {1000, {.tv_sec = 92233720368547758, .tv_nsec = 0}, 726 INT_MAX, NULL}, 727 [136] = {1000, {.tv_sec = 92233720368547758, .tv_nsec = 1}, 728 INT_MAX, NULL}, 729 [137] = {1000, {.tv_sec = 92233720368547758, .tv_nsec = 2}, 730 INT_MAX, NULL}, 731 [138] = {1000, {.tv_sec = (time_t)INT_MAX + 1, .tv_nsec = 123456789}, 732 INT_MAX, NULL}, 733 734 /* 735 * hz = 8191, prime non-divisor of 10^k or 2^k 736 */ 737 738 [139] = {8191, {.tv_sec = -1, .tv_nsec = 0}, 0, NULL}, 739 [140] = {8191, {.tv_sec = -1, .tv_nsec = 999999999}, 0, NULL}, 740 [141] = {8191, {.tv_sec = 0, .tv_nsec = 0}, 0, NULL}, 741 [142] = {8191, {.tv_sec = 0, .tv_nsec = 1}, 2, NULL}, 742 [143] = {8191, {.tv_sec = 0, .tv_nsec = 2}, 2, NULL}, 743 [144] = {8191, {.tv_sec = 0, .tv_nsec = 122084}, 2, 744 TSTOHZ_ROUND_XFAIL}, 745 [145] = {8191, {.tv_sec = 0, .tv_nsec = 122085}, 2, 746 TSTOHZ_ROUND_XFAIL}, 747 [146] = {8191, {.tv_sec = 0, .tv_nsec = 122086}, 3, NULL}, 748 [147] = {8191, {.tv_sec = 0, .tv_nsec = 244168}, 3, 749 TSTOHZ_ROUND_XFAIL}, 750 [148] = {8191, {.tv_sec = 0, .tv_nsec = 244169}, 3, 751 TSTOHZ_ROUND_XFAIL}, 752 [149] = {8191, {.tv_sec = 0, .tv_nsec = 244170}, 3, 753 TSTOHZ_ROUND_XFAIL}, 754 [150] = {8191, {.tv_sec = 0, .tv_nsec = 244171}, 4, NULL}, 755 [151] = {8191, {.tv_sec = 0, .tv_nsec = 244172}, 4, NULL}, 756 [152] = {8191, {.tv_sec = 0, .tv_nsec = 999999999}, 8192, NULL}, 757 [153] = {8191, {.tv_sec = 1, .tv_nsec = 0}, 8192, NULL}, 758 [154] = {8191, {.tv_sec = 1, .tv_nsec = 1}, 8193, NULL}, 759 [155] = {8191, {.tv_sec = 1, .tv_nsec = 2}, 8193, NULL}, 760 /* .tv_sec ~ INT_MAX/1000000 */ 761 [156] = {8191, {.tv_sec = 2147, .tv_nsec = 999999999}, 17594269, NULL}, 762 [157] = {8191, {.tv_sec = 2148, .tv_nsec = 0}, 17594269, NULL}, 763 [158] = {8191, {.tv_sec = 2148, .tv_nsec = 1}, 17594270, NULL}, 764 [159] = {8191, {.tv_sec = 2148, .tv_nsec = 2}, 17594270, NULL}, 765 /* .tv_sec ~ INT_MAX/hz */ 766 [160] = {8191, {.tv_sec = 262176, .tv_nsec = 3540471}, 2147483646, 767 NULL}, 768 [161] = {8191, {.tv_sec = 262176, .tv_nsec = 3540472}, 2147483647, 769 NULL}, 770 [162] = {8191, {.tv_sec = 262176, .tv_nsec = 3540473}, 2147483647, 771 NULL}, 772 /* saturate at INT_MAX = 2^31 - 1 ticks */ 773 [163] = {8191, {.tv_sec = 262176, .tv_nsec = 3662556}, 2147483647, 774 NULL}, 775 [164] = {8191, {.tv_sec = 262176, .tv_nsec = 3662557}, 2147483647, 776 NULL}, 777 [165] = {8191, {.tv_sec = 262176, .tv_nsec = 3662558}, 2147483647, 778 NULL}, 779 [166] = {8191, {.tv_sec = 262176, .tv_nsec = 999999999}, 2147483647, 780 NULL}, 781 /* .tv_sec ~ INT64_MAX/1000000, overflows to INT_MAX ticks */ 782 [167] = {8191, {.tv_sec = 9223372036854, .tv_nsec = 999999999}, 783 INT_MAX, NULL}, 784 [168] = {8191, {.tv_sec = 9223372036855, .tv_nsec = 0}, 785 INT_MAX, NULL}, 786 [169] = {8191, {.tv_sec = 9223372036855, .tv_nsec = 1}, 787 INT_MAX, NULL}, 788 [170] = {8191, {.tv_sec = 9223372036855, .tv_nsec = 2}, 789 INT_MAX, NULL}, 790 /* .tv_sec ~ INT64_MAX/hz, overflows to INT_MAX ticks */ 791 [171] = {8191, {.tv_sec = 92233720368547758, .tv_nsec = 999999999}, 792 INT_MAX, NULL}, 793 [172] = {8191, {.tv_sec = 92233720368547758, .tv_nsec = 0}, 794 INT_MAX, NULL}, 795 [173] = {8191, {.tv_sec = 92233720368547758, .tv_nsec = 1}, 796 INT_MAX, NULL}, 797 [174] = {8191, {.tv_sec = 92233720368547758, .tv_nsec = 2}, 798 INT_MAX, NULL}, 799 [175] = {8191, {.tv_sec = (time_t)INT_MAX + 1, .tv_nsec = 123456789}, 800 INT_MAX, NULL}, 801 }; 802 803 ATF_TC(tstohz); 804 ATF_TC_HEAD(tstohz, tc) 805 { 806 atf_tc_set_md_var(tc, "descr", 807 "Test tstohz(9)"); 808 } 809 ATF_TC_BODY(tstohz, tc) 810 { 811 size_t i; 812 813 for (i = 0; i < __arraycount(tstohz_cases); i++) { 814 const struct tstohz_case *ts = &tstohz_cases[i]; 815 int ticks; 816 817 /* set system parameters */ 818 hz = ts->ts_hz; 819 tick = 1000000/hz; 820 821 ticks = tstohz(&ts->ts_ts); 822 if (ts->ts_xfail) 823 atf_tc_expect_fail("%s", ts->ts_xfail); 824 825 /* 826 * Allow some slop of one part per thousand in the 827 * arithmetic, but ensure we round up, not down. 828 */ 829 ATF_CHECK_MSG(((unsigned)(ticks - ts->ts_ticks) <= 830 (unsigned)ts->ts_ticks/1000), 831 "[%zu] tstohz(%lld.%09ld sec) @ %d Hz:" 832 " expected %d, got %d", 833 i, 834 (long long)ts->ts_ts.tv_sec, 835 (long)ts->ts_ts.tv_nsec, 836 ts->ts_hz, 837 ts->ts_ticks, 838 ticks); 839 if (ts->ts_xfail) 840 atf_tc_expect_pass(); 841 } 842 } 843 844 /* 845 * { 0, if t <= 0; 846 * tvtohz(t sec) @ f Hz = { ceil(t/(1/f)), if that's below INT_MAX; 847 * { INT_MAX, otherwise. 848 */ 849 850 const struct tvtohz_case { 851 int tv_hz; 852 struct timeval tv_tv; 853 int tv_ticks; 854 const char *tv_xfail; 855 } tvtohz_cases[] = { 856 /* 857 * hz = 10 858 */ 859 860 /* negative inputs yield 0 ticks */ 861 [0] = {10, {.tv_sec = -1, .tv_usec = 0}, 0, NULL}, 862 [1] = {10, {.tv_sec = -1, .tv_usec = 999999}, 0, NULL}, 863 864 /* zero input yields 0 ticks */ 865 [2] = {10, {.tv_sec = 0, .tv_usec = 0}, 0, NULL}, 866 867 /* 868 * Nonzero input always yields >=2 ticks, because the time from 869 * now until the next tick may be arbitrarily short, and we 870 * need to wait one full tick, so we have to wait for two 871 * ticks. 872 */ 873 [3] = {10, {.tv_sec = 0, .tv_usec = 1}, 2, NULL}, 874 [4] = {10, {.tv_sec = 0, .tv_usec = 2}, 2, NULL}, 875 [5] = {10, {.tv_sec = 0, .tv_usec = 99999}, 2, NULL}, 876 [6] = {10, {.tv_sec = 0, .tv_usec = 100000}, 2, NULL}, 877 [7] = {10, {.tv_sec = 0, .tv_usec = 100001}, 3, NULL}, 878 [8] = {10, {.tv_sec = 0, .tv_usec = 100002}, 3, NULL}, 879 [9] = {10, {.tv_sec = 0, .tv_usec = 199999}, 3, NULL}, 880 [10] = {10, {.tv_sec = 0, .tv_usec = 200000}, 3, NULL}, 881 [11] = {10, {.tv_sec = 0, .tv_usec = 200001}, 4, NULL}, 882 [12] = {10, {.tv_sec = 0, .tv_usec = 200002}, 4, NULL}, 883 [13] = {10, {.tv_sec = 0, .tv_usec = 999999}, 11, NULL}, 884 [14] = {10, {.tv_sec = 1, .tv_usec = 0}, 11, NULL}, 885 [15] = {10, {.tv_sec = 1, .tv_usec = 1}, 12, NULL}, 886 [16] = {10, {.tv_sec = 1, .tv_usec = 2}, 12, NULL}, 887 /* .tv_sec ~ INT32_MAX/1000000 */ 888 [17] = {10, {.tv_sec = 2147, .tv_usec = 999999}, 21481, NULL}, 889 [18] = {10, {.tv_sec = 2148, .tv_usec = 0}, 21481, NULL}, 890 [19] = {10, {.tv_sec = 2148, .tv_usec = 1}, 21482, NULL}, 891 [20] = {10, {.tv_sec = 2148, .tv_usec = 2}, 21482, NULL}, 892 /* .tv_sec ~ INT32_MAX/hz */ 893 [21] = {10, {.tv_sec = 214748364, .tv_usec = 499999}, 2147483646, 894 NULL}, 895 /* saturate at INT_MAX = 2^31 - 1 ticks */ 896 [22] = {10, {.tv_sec = 214748364, .tv_usec = 500000}, 2147483646, 897 NULL}, 898 [23] = {10, {.tv_sec = 214748364, .tv_usec = 500001}, 2147483647, 899 NULL}, 900 [24] = {10, {.tv_sec = 214748364, .tv_usec = 500002}, 2147483647, 901 NULL}, 902 [25] = {10, {.tv_sec = 214748364, .tv_usec = 599999}, 2147483647, 903 NULL}, 904 [26] = {10, {.tv_sec = 214748364, .tv_usec = 600000}, 2147483647, 905 NULL}, 906 [27] = {10, {.tv_sec = 214748364, .tv_usec = 999999}, 2147483647, 907 NULL}, 908 [28] = {10, {.tv_sec = 214748365, .tv_usec = 0}, 2147483647, 909 NULL}, 910 [29] = {10, {.tv_sec = 214748365, .tv_usec = 1}, 2147483647, 911 NULL}, 912 [30] = {10, {.tv_sec = 214748365, .tv_usec = 2}, 2147483647, 913 NULL}, 914 [31] = {10, {.tv_sec = (time_t)INT_MAX + 1, .tv_usec = 123456}, 915 INT_MAX, NULL}, 916 /* .tv_sec ~ INT64_MAX/1000000, overflows to INT_MAX ticks */ 917 [32] = {10, {.tv_sec = 9223372036854, .tv_usec = 999999}, 918 INT_MAX, NULL}, 919 [33] = {10, {.tv_sec = 9223372036855, .tv_usec = 0}, 920 INT_MAX, NULL}, 921 [34] = {10, {.tv_sec = 9223372036855, .tv_usec = 1}, 922 INT_MAX, NULL}, 923 [35] = {10, {.tv_sec = 9223372036855, .tv_usec = 2}, 924 INT_MAX, NULL}, 925 /* .tv_sec ~ INT64_MAX/hz, overflows to INT_MAX ticks */ 926 [36] = {10, {.tv_sec = 922337203685477580, .tv_usec = 999999}, 927 INT_MAX, NULL}, 928 [37] = {10, {.tv_sec = 922337203685477581, .tv_usec = 0}, 929 INT_MAX, NULL}, 930 [38] = {10, {.tv_sec = 922337203685477581, .tv_usec = 1}, 931 INT_MAX, NULL}, 932 [39] = {10, {.tv_sec = 922337203685477581, .tv_usec = 2}, 933 INT_MAX, NULL}, 934 [40] = {10, {.tv_sec = (time_t)INT_MAX + 1, .tv_usec = 123456}, 935 INT_MAX, NULL}, 936 937 /* 938 * hz = 100 939 */ 940 941 [41] = {100, {.tv_sec = -1, .tv_usec = 0}, 0, NULL}, 942 [42] = {100, {.tv_sec = -1, .tv_usec = 999999}, 0, NULL}, 943 [43] = {100, {.tv_sec = 0, .tv_usec = 0}, 0, NULL}, 944 [44] = {100, {.tv_sec = 0, .tv_usec = 1}, 2, NULL}, 945 [45] = {100, {.tv_sec = 0, .tv_usec = 2}, 2, NULL}, 946 [46] = {100, {.tv_sec = 0, .tv_usec = 9999}, 2, NULL}, 947 [47] = {100, {.tv_sec = 0, .tv_usec = 10000}, 2, NULL}, 948 [48] = {100, {.tv_sec = 0, .tv_usec = 10001}, 3, NULL}, 949 [49] = {100, {.tv_sec = 0, .tv_usec = 10002}, 3, NULL}, 950 [50] = {100, {.tv_sec = 0, .tv_usec = 19999}, 3, NULL}, 951 [51] = {100, {.tv_sec = 0, .tv_usec = 20000}, 3, NULL}, 952 [52] = {100, {.tv_sec = 0, .tv_usec = 20001}, 4, NULL}, 953 [53] = {100, {.tv_sec = 0, .tv_usec = 20002}, 4, NULL}, 954 [54] = {100, {.tv_sec = 0, .tv_usec = 99999}, 11, NULL}, 955 [55] = {100, {.tv_sec = 0, .tv_usec = 100000}, 11, NULL}, 956 [56] = {100, {.tv_sec = 0, .tv_usec = 100001}, 12, NULL}, 957 [57] = {100, {.tv_sec = 0, .tv_usec = 100002}, 12, NULL}, 958 [58] = {100, {.tv_sec = 0, .tv_usec = 999999}, 101, NULL}, 959 [59] = {100, {.tv_sec = 1, .tv_usec = 0}, 101, NULL}, 960 [60] = {100, {.tv_sec = 1, .tv_usec = 1}, 102, NULL}, 961 [61] = {100, {.tv_sec = 1, .tv_usec = 2}, 102, NULL}, 962 /* .tv_sec ~ INT32_MAX/1000000 */ 963 [62] = {100, {.tv_sec = 2147, .tv_usec = 999999}, 214801, NULL}, 964 [63] = {100, {.tv_sec = 2148, .tv_usec = 0}, 214801, NULL}, 965 [64] = {100, {.tv_sec = 2148, .tv_usec = 1}, 214802, NULL}, 966 [65] = {100, {.tv_sec = 2148, .tv_usec = 2}, 214802, NULL}, 967 /* .tv_sec ~ INT32_MAX/hz */ 968 [66] = {100, {.tv_sec = 21474836, .tv_usec = 439999}, 2147483645, 969 NULL}, 970 [67] = {100, {.tv_sec = 21474836, .tv_usec = 440000}, 2147483645, 971 NULL}, 972 [68] = {100, {.tv_sec = 21474836, .tv_usec = 440001}, 2147483646, 973 NULL}, 974 [69] = {100, {.tv_sec = 21474836, .tv_usec = 440002}, 2147483646, 975 NULL}, 976 [70] = {100, {.tv_sec = 21474836, .tv_usec = 449999}, 2147483646, 977 NULL}, 978 [71] = {100, {.tv_sec = 21474836, .tv_usec = 450000}, 2147483646, 979 NULL}, 980 /* saturate at INT_MAX = 2^31 - 1 ticks */ 981 [72] = {100, {.tv_sec = 21474836, .tv_usec = 450001}, 2147483647, 982 NULL}, 983 [73] = {100, {.tv_sec = 21474836, .tv_usec = 450002}, 2147483647, 984 NULL}, 985 [74] = {100, {.tv_sec = 21474836, .tv_usec = 459999}, 2147483647, 986 NULL}, 987 [75] = {100, {.tv_sec = 21474836, .tv_usec = 460000}, 2147483647, 988 NULL}, 989 [76] = {100, {.tv_sec = 21474836, .tv_usec = 460001}, 2147483647, 990 NULL}, 991 [77] = {100, {.tv_sec = 21474836, .tv_usec = 460002}, 2147483647, 992 NULL}, 993 [78] = {100, {.tv_sec = 21474836, .tv_usec = 999999}, 2147483647, 994 NULL}, 995 [79] = {100, {.tv_sec = 21474837, .tv_usec = 0}, 2147483647, 996 NULL}, 997 [80] = {100, {.tv_sec = 21474837, .tv_usec = 1}, 2147483647, 998 NULL}, 999 [81] = {100, {.tv_sec = 21474837, .tv_usec = 2}, 2147483647, 1000 NULL}, 1001 [82] = {100, {.tv_sec = 21474837, .tv_usec = 2}, 2147483647, 1002 NULL}, 1003 /* .tv_sec ~ INT64_MAX/1000000 */ 1004 [83] = {100, {.tv_sec = 9223372036854, .tv_usec = 999999}, 1005 INT_MAX, NULL}, 1006 [84] = {100, {.tv_sec = 9223372036855, .tv_usec = 0}, 1007 INT_MAX, NULL}, 1008 [85] = {100, {.tv_sec = 9223372036855, .tv_usec = 1}, 1009 INT_MAX, NULL}, 1010 [86] = {100, {.tv_sec = 9223372036855, .tv_usec = 2}, 1011 INT_MAX, NULL}, 1012 /* .tv_sec ~ INT64_MAX/hz, overflows to INT_MAX ticks */ 1013 [87] = {100, {.tv_sec = 92233720368547758, .tv_usec = 999999}, 1014 INT_MAX, NULL}, 1015 [88] = {100, {.tv_sec = 92233720368547758, .tv_usec = 0}, 1016 INT_MAX, NULL}, 1017 [89] = {100, {.tv_sec = 92233720368547758, .tv_usec = 1}, 1018 INT_MAX, NULL}, 1019 [90] = {100, {.tv_sec = 92233720368547758, .tv_usec = 2}, 1020 INT_MAX, NULL}, 1021 [91] = {100, {.tv_sec = (time_t)INT_MAX + 1, .tv_usec = 123456}, 1022 INT_MAX, NULL}, 1023 1024 /* 1025 * hz = 1000 1026 */ 1027 1028 [92] = {1000, {.tv_sec = -1, .tv_usec = 0}, 0, NULL}, 1029 [93] = {1000, {.tv_sec = -1, .tv_usec = 999999}, 0, NULL}, 1030 [94] = {1000, {.tv_sec = 0, .tv_usec = 0}, 0, NULL}, 1031 [95] = {1000, {.tv_sec = 0, .tv_usec = 1}, 2, NULL}, 1032 [96] = {1000, {.tv_sec = 0, .tv_usec = 2}, 2, NULL}, 1033 [97] = {1000, {.tv_sec = 0, .tv_usec = 999}, 2, NULL}, 1034 [98] = {1000, {.tv_sec = 0, .tv_usec = 1000}, 2, NULL}, 1035 [99] = {1000, {.tv_sec = 0, .tv_usec = 1001}, 3, NULL}, 1036 [100] = {1000, {.tv_sec = 0, .tv_usec = 1002}, 3, NULL}, 1037 [101] = {1000, {.tv_sec = 0, .tv_usec = 1999}, 3, NULL}, 1038 [102] = {1000, {.tv_sec = 0, .tv_usec = 2000}, 3, NULL}, 1039 [103] = {1000, {.tv_sec = 0, .tv_usec = 2001}, 4, NULL}, 1040 [104] = {1000, {.tv_sec = 0, .tv_usec = 2002}, 4, NULL}, 1041 [105] = {1000, {.tv_sec = 0, .tv_usec = 999999}, 1001, NULL}, 1042 [106] = {1000, {.tv_sec = 1, .tv_usec = 0}, 1001, NULL}, 1043 [107] = {1000, {.tv_sec = 1, .tv_usec = 1}, 1002, NULL}, 1044 [108] = {1000, {.tv_sec = 1, .tv_usec = 2}, 1002, NULL}, 1045 /* .tv_sec ~ INT_MAX/1000000 */ 1046 [109] = {1000, {.tv_sec = 2147, .tv_usec = 999999}, 2148001, NULL}, 1047 [110] = {1000, {.tv_sec = 2148, .tv_usec = 0}, 2148001, NULL}, 1048 [111] = {1000, {.tv_sec = 2148, .tv_usec = 1}, 2148002, NULL}, 1049 [112] = {1000, {.tv_sec = 2148, .tv_usec = 2}, 2148002, NULL}, 1050 /* .tv_sec ~ INT_MAX/hz */ 1051 [113] = {1000, {.tv_sec = 2147483, .tv_usec = 643999}, 2147483645, 1052 NULL}, 1053 [114] = {1000, {.tv_sec = 2147483, .tv_usec = 644000}, 2147483645, 1054 NULL}, 1055 [115] = {1000, {.tv_sec = 2147483, .tv_usec = 644001}, 2147483646, 1056 NULL}, 1057 [116] = {1000, {.tv_sec = 2147483, .tv_usec = 644002}, 2147483646, 1058 NULL}, 1059 [117] = {1000, {.tv_sec = 2147483, .tv_usec = 644999}, 2147483646, 1060 NULL}, 1061 [118] = {1000, {.tv_sec = 2147483, .tv_usec = 645000}, 2147483646, 1062 NULL}, 1063 /* saturate at INT_MAX = 2^31 - 1 ticks */ 1064 [119] = {1000, {.tv_sec = 2147483, .tv_usec = 645001}, 2147483647, 1065 NULL}, 1066 [120] = {1000, {.tv_sec = 2147483, .tv_usec = 645002}, 2147483647, 1067 NULL}, 1068 [121] = {1000, {.tv_sec = 2147483, .tv_usec = 645999}, 2147483647, 1069 NULL}, 1070 [122] = {1000, {.tv_sec = 2147483, .tv_usec = 646000}, 2147483647, 1071 NULL}, 1072 [123] = {1000, {.tv_sec = 2147483, .tv_usec = 646001}, 2147483647, 1073 NULL}, 1074 [124] = {1000, {.tv_sec = 2147483, .tv_usec = 646002}, 2147483647, 1075 NULL}, 1076 [125] = {1000, {.tv_sec = 2147483, .tv_usec = 699999}, 2147483647, 1077 NULL}, 1078 [126] = {1000, {.tv_sec = 2147484, .tv_usec = 0}, 2147483647, 1079 NULL}, 1080 [127] = {1000, {.tv_sec = 2147484, .tv_usec = 1}, 2147483647, 1081 NULL}, 1082 [128] = {1000, {.tv_sec = 2147484, .tv_usec = 2}, 2147483647, 1083 NULL}, 1084 [129] = {1000, {.tv_sec = 2147484, .tv_usec = 2}, 2147483647, 1085 NULL}, 1086 /* .tv_sec ~ INT64_MAX/1000000, overflows to INT_MAX ticks */ 1087 [130] = {1000, {.tv_sec = 9223372036854, .tv_usec = 999999}, 1088 INT_MAX, NULL}, 1089 [131] = {1000, {.tv_sec = 9223372036855, .tv_usec = 0}, 1090 INT_MAX, NULL}, 1091 [132] = {1000, {.tv_sec = 9223372036855, .tv_usec = 1}, 1092 INT_MAX, NULL}, 1093 [133] = {1000, {.tv_sec = 9223372036855, .tv_usec = 2}, 1094 INT_MAX, NULL}, 1095 /* .tv_sec ~ INT64_MAX/hz, overflows to INT_MAX ticks */ 1096 [134] = {1000, {.tv_sec = 92233720368547758, .tv_usec = 999999}, 1097 INT_MAX, NULL}, 1098 [135] = {1000, {.tv_sec = 92233720368547758, .tv_usec = 0}, 1099 INT_MAX, NULL}, 1100 [136] = {1000, {.tv_sec = 92233720368547758, .tv_usec = 1}, 1101 INT_MAX, NULL}, 1102 [137] = {1000, {.tv_sec = 92233720368547758, .tv_usec = 2}, 1103 INT_MAX, NULL}, 1104 [138] = {1000, {.tv_sec = (time_t)INT_MAX + 1, .tv_usec = 123456}, 1105 INT_MAX, NULL}, 1106 1107 /* 1108 * hz = 8191, prime non-divisor of 10^k or 2^k 1109 */ 1110 1111 [139] = {8191, {.tv_sec = -1, .tv_usec = 0}, 0, NULL}, 1112 [140] = {8191, {.tv_sec = -1, .tv_usec = 999999}, 0, NULL}, 1113 [141] = {8191, {.tv_sec = 0, .tv_usec = 0}, 0, NULL}, 1114 [142] = {8191, {.tv_sec = 0, .tv_usec = 1}, 2, NULL}, 1115 [143] = {8191, {.tv_sec = 0, .tv_usec = 2}, 2, NULL}, 1116 [144] = {8191, {.tv_sec = 0, .tv_usec = 121}, 2, NULL}, 1117 [145] = {8191, {.tv_sec = 0, .tv_usec = 122}, 2, NULL}, 1118 [146] = {8191, {.tv_sec = 0, .tv_usec = 123}, 3, NULL}, 1119 [147] = {8191, {.tv_sec = 0, .tv_usec = 242}, 3, NULL}, 1120 [148] = {8191, {.tv_sec = 0, .tv_usec = 243}, 3, NULL}, 1121 [149] = {8191, {.tv_sec = 0, .tv_usec = 244}, 3, NULL}, 1122 [150] = {8191, {.tv_sec = 0, .tv_usec = 245}, 4, NULL}, 1123 [151] = {8191, {.tv_sec = 0, .tv_usec = 246}, 4, NULL}, 1124 [152] = {8191, {.tv_sec = 0, .tv_usec = 999999}, 8192, NULL}, 1125 [153] = {8191, {.tv_sec = 1, .tv_usec = 0}, 8192, NULL}, 1126 [154] = {8191, {.tv_sec = 1, .tv_usec = 1}, 8193, NULL}, 1127 [155] = {8191, {.tv_sec = 1, .tv_usec = 2}, 8193, NULL}, 1128 /* .tv_sec ~ INT_MAX/1000000 */ 1129 [156] = {8191, {.tv_sec = 2147, .tv_usec = 999999}, 17594269, NULL}, 1130 [157] = {8191, {.tv_sec = 2148, .tv_usec = 0}, 17594269, NULL}, 1131 [158] = {8191, {.tv_sec = 2148, .tv_usec = 1}, 17594270, NULL}, 1132 [159] = {8191, {.tv_sec = 2148, .tv_usec = 2}, 17594270, NULL}, 1133 /* .tv_sec ~ INT_MAX/hz */ 1134 [160] = {8191, {.tv_sec = 262176, .tv_usec = 3540}, 2147483646, 1135 NULL}, 1136 [161] = {8191, {.tv_sec = 262176, .tv_usec = 3541}, 2147483647, 1137 NULL}, 1138 [162] = {8191, {.tv_sec = 262176, .tv_usec = 3542}, 2147483647, 1139 NULL}, 1140 /* saturate at INT_MAX = 2^31 - 1 ticks */ 1141 [163] = {8191, {.tv_sec = 262176, .tv_usec = 3662}, 2147483647, 1142 NULL}, 1143 [164] = {8191, {.tv_sec = 262176, .tv_usec = 3663}, 2147483647, 1144 NULL}, 1145 [165] = {8191, {.tv_sec = 262176, .tv_usec = 3664}, 2147483647, 1146 NULL}, 1147 [166] = {8191, {.tv_sec = 262176, .tv_usec = 999999}, 2147483647, 1148 NULL}, 1149 /* .tv_sec ~ INT64_MAX/1000000, overflows to INT_MAX ticks */ 1150 [167] = {8191, {.tv_sec = 9223372036854, .tv_usec = 999999}, 1151 INT_MAX, NULL}, 1152 [168] = {8191, {.tv_sec = 9223372036855, .tv_usec = 0}, 1153 INT_MAX, NULL}, 1154 [169] = {8191, {.tv_sec = 9223372036855, .tv_usec = 1}, 1155 INT_MAX, NULL}, 1156 [170] = {8191, {.tv_sec = 9223372036855, .tv_usec = 2}, 1157 INT_MAX, NULL}, 1158 /* .tv_sec ~ INT64_MAX/hz, overflows to INT_MAX ticks */ 1159 [171] = {8191, {.tv_sec = 92233720368547758, .tv_usec = 999999}, 1160 INT_MAX, NULL}, 1161 [172] = {8191, {.tv_sec = 92233720368547758, .tv_usec = 0}, 1162 INT_MAX, NULL}, 1163 [173] = {8191, {.tv_sec = 92233720368547758, .tv_usec = 1}, 1164 INT_MAX, NULL}, 1165 [174] = {8191, {.tv_sec = 92233720368547758, .tv_usec = 2}, 1166 INT_MAX, NULL}, 1167 [175] = {8191, {.tv_sec = (time_t)INT_MAX + 1, .tv_usec = 123456}, 1168 INT_MAX, NULL}, 1169 }; 1170 1171 ATF_TC(tvtohz); 1172 ATF_TC_HEAD(tvtohz, tc) 1173 { 1174 atf_tc_set_md_var(tc, "descr", 1175 "Test tvtohz(9)"); 1176 } 1177 ATF_TC_BODY(tvtohz, tc) 1178 { 1179 size_t i; 1180 1181 for (i = 0; i < __arraycount(tvtohz_cases); i++) { 1182 const struct tvtohz_case *tv = &tvtohz_cases[i]; 1183 int ticks; 1184 1185 /* set system parameters */ 1186 hz = tv->tv_hz; 1187 tick = 1000000/hz; 1188 1189 ticks = tvtohz(&tv->tv_tv); 1190 if (tv->tv_xfail) 1191 atf_tc_expect_fail("%s", tv->tv_xfail); 1192 1193 /* 1194 * Allow some slop of one part per thousand in the 1195 * arithmetic, but ensure we round up, not down. 1196 * 1197 * XXX Analytically determine error bounds on the 1198 * formulae we use and assess them. 1199 */ 1200 ATF_CHECK_MSG(((unsigned)(ticks - tv->tv_ticks) <= 1201 (unsigned)tv->tv_ticks/1000), 1202 "[%zu] tvtohz(%lld.%06ld sec) @ %d Hz:" 1203 " expected %d, got %d", 1204 i, 1205 (long long)tv->tv_tv.tv_sec, 1206 (long)tv->tv_tv.tv_usec, 1207 tv->tv_hz, 1208 tv->tv_ticks, 1209 ticks); 1210 if (tv->tv_xfail) 1211 atf_tc_expect_pass(); 1212 } 1213 } 1214 1215 ATF_TP_ADD_TCS(tp) 1216 { 1217 1218 ATF_TP_ADD_TC(tp, itimer_transitions); 1219 ATF_TP_ADD_TC(tp, tstohz); 1220 ATF_TP_ADD_TC(tp, tvtohz); 1221 1222 return atf_no_error(); 1223 } 1224 1225