1 1.3 riastrad /* $NetBSD: t_time_arith.c,v 1.3 2025/04/01 23:14:23 riastradh Exp $ */ 2 1.1 riastrad 3 1.1 riastrad /*- 4 1.2 riastrad * Copyright (c) 2024-2025 The NetBSD Foundation, Inc. 5 1.1 riastrad * All rights reserved. 6 1.1 riastrad * 7 1.1 riastrad * Redistribution and use in source and binary forms, with or without 8 1.1 riastrad * modification, are permitted provided that the following conditions 9 1.1 riastrad * are met: 10 1.1 riastrad * 1. Redistributions of source code must retain the above copyright 11 1.1 riastrad * notice, this list of conditions and the following disclaimer. 12 1.1 riastrad * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 riastrad * notice, this list of conditions and the following disclaimer in the 14 1.1 riastrad * documentation and/or other materials provided with the distribution. 15 1.1 riastrad * 16 1.1 riastrad * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 17 1.1 riastrad * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18 1.1 riastrad * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 1.1 riastrad * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20 1.1 riastrad * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 1.1 riastrad * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 1.1 riastrad * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 1.1 riastrad * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 1.1 riastrad * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 1.1 riastrad * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 1.1 riastrad * POSSIBILITY OF SUCH DAMAGE. 27 1.1 riastrad */ 28 1.1 riastrad 29 1.1 riastrad #include <sys/cdefs.h> 30 1.3 riastrad __RCSID("$NetBSD: t_time_arith.c,v 1.3 2025/04/01 23:14:23 riastradh Exp $"); 31 1.1 riastrad 32 1.1 riastrad #include <sys/timearith.h> 33 1.1 riastrad 34 1.1 riastrad #include <atf-c.h> 35 1.1 riastrad #include <errno.h> 36 1.1 riastrad #include <limits.h> 37 1.1 riastrad #include <setjmp.h> 38 1.1 riastrad #include <signal.h> 39 1.1 riastrad #include <stdbool.h> 40 1.1 riastrad #include <stdint.h> 41 1.1 riastrad #include <stdio.h> 42 1.1 riastrad #include <stdlib.h> 43 1.1 riastrad #include <string.h> 44 1.1 riastrad #include <time.h> 45 1.1 riastrad #include <unistd.h> 46 1.1 riastrad #include <util.h> 47 1.1 riastrad 48 1.1 riastrad #include "h_macros.h" 49 1.1 riastrad 50 1.1 riastrad enum { HZ = 100 }; 51 1.1 riastrad 52 1.1 riastrad int hz = HZ; 53 1.1 riastrad int tick = 1000000/HZ; 54 1.1 riastrad 55 1.1 riastrad static sig_atomic_t jmp_en; 56 1.1 riastrad static int jmp_sig; 57 1.1 riastrad static jmp_buf jmp; 58 1.1 riastrad 59 1.1 riastrad static void 60 1.1 riastrad handle_signal(int signo) 61 1.1 riastrad { 62 1.1 riastrad const int errno_save = errno; 63 1.1 riastrad char buf[32]; 64 1.1 riastrad 65 1.1 riastrad snprintf_ss(buf, sizeof(buf), "signal %d\n", signo); 66 1.1 riastrad (void)write(STDERR_FILENO, buf, strlen(buf)); 67 1.1 riastrad 68 1.1 riastrad errno = errno_save; 69 1.1 riastrad 70 1.1 riastrad if (jmp_en) { 71 1.1 riastrad jmp_sig = signo; 72 1.1 riastrad jmp_en = 0; 73 1.1 riastrad longjmp(jmp, 1); 74 1.1 riastrad } else { 75 1.1 riastrad raise_default_signal(signo); 76 1.1 riastrad } 77 1.1 riastrad } 78 1.1 riastrad 79 1.1 riastrad const struct itimer_transition { 80 1.1 riastrad struct itimerspec it_time; 81 1.1 riastrad struct timespec it_now; 82 1.1 riastrad struct timespec it_next; 83 1.1 riastrad int it_overruns; 84 1.1 riastrad const char *it_xfail; 85 1.1 riastrad } itimer_transitions[] = { 86 1.1 riastrad /* 87 1.1 riastrad * Fired more than one interval early -- treat clock as wound 88 1.2 riastrad * backwards, not counting overruns. Advance to the next 89 1.2 riastrad * integral multiple of it_interval starting from it_value. 90 1.1 riastrad */ 91 1.1 riastrad [0] = {{.it_value = {3,0}, .it_interval = {1,0}}, 92 1.2 riastrad {0,1}, {1,0}, 0, 93 1.3 riastrad NULL}, 94 1.1 riastrad [1] = {{.it_value = {3,0}, .it_interval = {1,0}}, 95 1.2 riastrad {0,500000000}, {1,0}, 0, 96 1.3 riastrad NULL}, 97 1.1 riastrad [2] = {{.it_value = {3,0}, .it_interval = {1,0}}, 98 1.2 riastrad {0,999999999}, {1,0}, 0, 99 1.3 riastrad NULL}, 100 1.1 riastrad [3] = {{.it_value = {3,0}, .it_interval = {1,0}}, 101 1.1 riastrad {1,0}, {2,0}, 0, 102 1.3 riastrad NULL}, 103 1.1 riastrad [4] = {{.it_value = {3,0}, .it_interval = {1,0}}, 104 1.2 riastrad {1,1}, {2,0}, 0, 105 1.3 riastrad NULL}, 106 1.1 riastrad [5] = {{.it_value = {3,0}, .it_interval = {1,0}}, 107 1.2 riastrad {1,500000000}, {2,0}, 0, 108 1.3 riastrad NULL}, 109 1.1 riastrad [6] = {{.it_value = {3,0}, .it_interval = {1,0}}, 110 1.2 riastrad {1,999999999}, {2,0}, 0, 111 1.3 riastrad NULL}, 112 1.1 riastrad 113 1.1 riastrad /* 114 1.1 riastrad * Fired exactly one interval early. Treat this too as clock 115 1.1 riastrad * wound backwards. 116 1.1 riastrad */ 117 1.1 riastrad [7] = {{.it_value = {3,0}, .it_interval = {1,0}}, 118 1.1 riastrad {2,0}, {3,0}, 0, 119 1.3 riastrad NULL}, 120 1.1 riastrad 121 1.1 riastrad /* 122 1.1 riastrad * Fired less than one interval early -- callouts and real-time 123 1.1 riastrad * clock might not be perfectly synced, counted as zero 124 1.1 riastrad * overruns. Advance by one interval from the scheduled time. 125 1.1 riastrad */ 126 1.1 riastrad [8] = {{.it_value = {3,0}, .it_interval = {1,0}}, 127 1.2 riastrad {2,1}, {3,0}, 0, 128 1.3 riastrad NULL}, 129 1.1 riastrad [9] = {{.it_value = {3,0}, .it_interval = {1,0}}, 130 1.2 riastrad {2,500000000}, {3,0}, 0, 131 1.3 riastrad NULL}, 132 1.1 riastrad [10] = {{.it_value = {3,0}, .it_interval = {1,0}}, 133 1.2 riastrad {2,999999999}, {3,0}, 0, 134 1.3 riastrad NULL}, 135 1.1 riastrad 136 1.1 riastrad /* 137 1.1 riastrad * Fired exactly on time. Advance by one interval. 138 1.1 riastrad */ 139 1.1 riastrad [11] = {{.it_value = {3,0}, .it_interval = {1,0}}, 140 1.1 riastrad {3,0}, {4,0}, 0, NULL}, 141 1.1 riastrad 142 1.1 riastrad /* 143 1.1 riastrad * Fired late by less than one interval -- callouts and 144 1.1 riastrad * real-time clock might not be prefectly synced, counted as 145 1.1 riastrad * zero overruns. Advance by one interval from the scheduled 146 1.1 riastrad * time (even if it's very close to a full interval). 147 1.1 riastrad */ 148 1.1 riastrad [12] = {{.it_value = {3,0}, .it_interval = {1,0}}, 149 1.1 riastrad {3,1}, {4,0}, 0, NULL}, 150 1.1 riastrad [14] = {{.it_value = {3,0}, .it_interval = {1,0}}, 151 1.1 riastrad {3,500000000}, {4,0}, 0, NULL}, 152 1.1 riastrad [15] = {{.it_value = {3,0}, .it_interval = {1,0}}, 153 1.1 riastrad {3,999999999}, {4,0}, 0, NULL}, 154 1.1 riastrad 155 1.1 riastrad /* 156 1.1 riastrad * Fired late by exactly one interval -- treat it as overrun. 157 1.1 riastrad */ 158 1.1 riastrad [16] = {{.it_value = {3,0}, .it_interval = {1,0}}, 159 1.2 riastrad {4,0}, {5,0}, 1, 160 1.3 riastrad NULL}, 161 1.1 riastrad 162 1.1 riastrad /* 163 1.1 riastrad * Fired late by more than one interval but less than two -- 164 1.1 riastrad * overrun. 165 1.1 riastrad */ 166 1.1 riastrad [17] = {{.it_value = {3,0}, .it_interval = {1,0}}, 167 1.1 riastrad {4,1}, {5,0}, 1, 168 1.3 riastrad NULL}, 169 1.1 riastrad [18] = {{.it_value = {3,0}, .it_interval = {1,0}}, 170 1.1 riastrad {4,500000000}, {5,0}, 1, 171 1.3 riastrad NULL}, 172 1.1 riastrad [19] = {{.it_value = {3,0}, .it_interval = {1,0}}, 173 1.1 riastrad {4,999999999}, {5,0}, 1, 174 1.3 riastrad NULL}, 175 1.1 riastrad 176 1.1 riastrad /* 177 1.1 riastrad * Fired late by exactly two intervals -- two overruns. 178 1.1 riastrad */ 179 1.1 riastrad [20] = {{.it_value = {3,0}, .it_interval = {1,0}}, 180 1.1 riastrad {5,0}, {6,0}, 2, 181 1.3 riastrad NULL}, 182 1.1 riastrad 183 1.1 riastrad /* 184 1.1 riastrad * Fired late by more intervals plus slop, up to 32. 185 1.1 riastrad * 186 1.1 riastrad * XXX Define DELAYTIMER_MAX so we can write it in terms of 187 1.1 riastrad * that. 188 1.1 riastrad */ 189 1.1 riastrad [21] = {{.it_value = {3,0}, .it_interval = {1,0}}, 190 1.1 riastrad {13,123456789}, {14,0}, 10, 191 1.3 riastrad NULL}, 192 1.1 riastrad [22] = {{.it_value = {3,0}, .it_interval = {1,0}}, 193 1.2 riastrad {34,999999999}, {35,0}, 31, 194 1.3 riastrad NULL}, 195 1.1 riastrad 196 1.1 riastrad /* 197 1.1 riastrad * Fired late by roughly INT_MAX intervals. 198 1.1 riastrad */ 199 1.1 riastrad [23] = {{.it_value = {3,0}, .it_interval = {1,0}}, 200 1.1 riastrad {(time_t)3 + INT_MAX - 1, 0}, 201 1.1 riastrad {(time_t)3 + INT_MAX, 0}, 202 1.2 riastrad INT_MAX - 1, 203 1.3 riastrad NULL}, 204 1.1 riastrad [24] = {{.it_value = {3,0}, .it_interval = {1,0}}, 205 1.1 riastrad {(time_t)3 + INT_MAX, 0}, 206 1.1 riastrad {(time_t)3 + INT_MAX + 1, 0}, 207 1.1 riastrad INT_MAX, 208 1.3 riastrad NULL}, 209 1.1 riastrad [25] = {{.it_value = {3,0}, .it_interval = {1,0}}, 210 1.1 riastrad {(time_t)3 + INT_MAX + 1, 0}, 211 1.1 riastrad {(time_t)3 + INT_MAX + 2, 0}, 212 1.1 riastrad INT_MAX, 213 1.3 riastrad NULL}, 214 1.1 riastrad 215 1.1 riastrad /* (2^63 - 1) ns */ 216 1.1 riastrad [26] = {{.it_value = {3,0}, .it_interval = {9223372036,854775807}}, 217 1.1 riastrad {3,1}, {9223372039,854775807}, 0, NULL}, 218 1.1 riastrad /* 2^63 ns */ 219 1.1 riastrad [27] = {{.it_value = {3,0}, .it_interval = {9223372036,854775808}}, 220 1.1 riastrad {3,1}, {9223372039,854775808}, 0, NULL}, 221 1.1 riastrad /* (2^63 + 1) ns */ 222 1.1 riastrad [28] = {{.it_value = {3,0}, .it_interval = {9223372036,854775809}}, 223 1.1 riastrad {3,1}, {9223372039,854775809}, 0, NULL}, 224 1.1 riastrad 225 1.1 riastrad /* 226 1.1 riastrad * Overflows -- we should (XXX but currently don't) reject 227 1.1 riastrad * intervals of at least 2^64 nanoseconds up front, since this 228 1.1 riastrad * is more time than it is reasonable to wait (more than 584 229 1.1 riastrad * years). 230 1.1 riastrad */ 231 1.1 riastrad 232 1.1 riastrad /* (2^64 - 1) ns */ 233 1.1 riastrad [29] = {{.it_value = {3,0}, .it_interval = {18446744073,709551615}}, 234 1.1 riastrad {2,999999999}, {0,0}, 0, 235 1.3 riastrad NULL}, 236 1.1 riastrad /* 2^64 ns */ 237 1.1 riastrad [30] = {{.it_value = {3,0}, .it_interval = {18446744073,709551616}}, 238 1.1 riastrad {2,999999999}, {0,0}, 0, 239 1.3 riastrad NULL}, 240 1.1 riastrad /* (2^64 + 1) ns */ 241 1.1 riastrad [31] = {{.it_value = {3,0}, .it_interval = {18446744073,709551617}}, 242 1.1 riastrad {2,999999999}, {0,0}, 0, 243 1.3 riastrad NULL}, 244 1.1 riastrad 245 1.1 riastrad /* (2^63 - 1) us */ 246 1.1 riastrad [32] = {{.it_value = {3,0}, .it_interval = {9223372036854,775807}}, 247 1.1 riastrad {2,999999999}, {0,0}, 0, 248 1.3 riastrad NULL}, 249 1.1 riastrad /* 2^63 us */ 250 1.1 riastrad [33] = {{.it_value = {3,0}, .it_interval = {9223372036854,775808}}, 251 1.1 riastrad {2,999999999}, {0,0}, 0, 252 1.3 riastrad NULL}, 253 1.1 riastrad /* (2^63 + 1) us */ 254 1.1 riastrad [34] = {{.it_value = {3,0}, .it_interval = {9223372036854,775809}}, 255 1.1 riastrad {2,999999999}, {0,0}, 0, 256 1.3 riastrad NULL}, 257 1.1 riastrad 258 1.1 riastrad /* (2^64 - 1) us */ 259 1.1 riastrad [35] = {{.it_value = {3,0}, .it_interval = {18446744073709,551615}}, 260 1.1 riastrad {2,999999999}, {0,0}, 0, 261 1.3 riastrad NULL}, 262 1.1 riastrad /* 2^64 us */ 263 1.1 riastrad [36] = {{.it_value = {3,0}, .it_interval = {18446744073709,551616}}, 264 1.1 riastrad {2,999999999}, {0,0}, 0, 265 1.3 riastrad NULL}, 266 1.1 riastrad /* (2^64 + 1) us */ 267 1.1 riastrad [37] = {{.it_value = {3,0}, .it_interval = {18446744073709,551617}}, 268 1.1 riastrad {2,999999999}, {0,0}, 0, 269 1.3 riastrad NULL}, 270 1.1 riastrad 271 1.1 riastrad /* (2^63 - 1) ms */ 272 1.1 riastrad [38] = {{.it_value = {3,0}, .it_interval = {9223372036854775,807}}, 273 1.1 riastrad {2,999999999}, {0,0}, 0, 274 1.3 riastrad NULL}, 275 1.1 riastrad /* 2^63 ms */ 276 1.1 riastrad [39] = {{.it_value = {3,0}, .it_interval = {9223372036854775,808}}, 277 1.1 riastrad {2,999999999}, {0,0}, 0, 278 1.3 riastrad NULL}, 279 1.1 riastrad /* (2^63 + 1) ms */ 280 1.1 riastrad [40] = {{.it_value = {3,0}, .it_interval = {9223372036854775,809}}, 281 1.1 riastrad {2,999999999}, {0,0}, 0, 282 1.3 riastrad NULL}, 283 1.1 riastrad 284 1.1 riastrad /* (2^64 - 1) ms */ 285 1.1 riastrad [41] = {{.it_value = {3,0}, .it_interval = {18446744073709551,615}}, 286 1.1 riastrad {2,999999999}, {0,0}, 0, 287 1.3 riastrad NULL}, 288 1.1 riastrad /* 2^64 ms */ 289 1.1 riastrad [42] = {{.it_value = {3,0}, .it_interval = {18446744073709551,616}}, 290 1.1 riastrad {2,999999999}, {0,0}, 0, 291 1.3 riastrad NULL}, 292 1.1 riastrad /* (2^64 + 1) ms */ 293 1.1 riastrad [43] = {{.it_value = {3,0}, .it_interval = {18446744073709551,617}}, 294 1.1 riastrad {2,999999999}, {0,0}, 0, 295 1.3 riastrad NULL}, 296 1.1 riastrad 297 1.1 riastrad /* invalid intervals */ 298 1.1 riastrad [44] = {{.it_value = {3,0}, .it_interval = {-1,0}}, 299 1.1 riastrad {3,1}, {0,0}, 0, NULL}, 300 1.1 riastrad [45] = {{.it_value = {3,0}, .it_interval = {0,-1}}, 301 1.1 riastrad {3,1}, {0,0}, 0, NULL}, 302 1.1 riastrad [46] = {{.it_value = {3,0}, .it_interval = {0,1000000000}}, 303 1.1 riastrad {3,1}, {0,0}, 0, NULL}, 304 1.2 riastrad 305 1.2 riastrad /* 306 1.2 riastrad * Overflow nanosecond arithmetic. The magic interval number 307 1.2 riastrad * here is ceiling(INT64_MAX/2) nanoseconds. The interval 308 1.2 riastrad * start value will be rounded to an integral number of ticks, 309 1.2 riastrad * so rather than write exactly `4611686018,427387905', just 310 1.2 riastrad * round up the `now' value to the next second. This forces an 311 1.2 riastrad * overrun _and_ triggers int64_t arithmetic overflow. 312 1.2 riastrad */ 313 1.2 riastrad [47] = {{.it_value = {0,1}, 314 1.2 riastrad .it_interval = {4611686018,427387904}}, 315 1.2 riastrad /* XXX needless overflow */ 316 1.2 riastrad {4611686019,0}, {0,0}, 1, 317 1.3 riastrad NULL}, 318 1.2 riastrad 319 1.2 riastrad /* interval ~ 1/4 * (2^63 - 1) ns, now ~ 3/4 * (2^63 - 1) ns */ 320 1.2 riastrad [48] = {{.it_value = {0,1}, 321 1.2 riastrad .it_interval = {2305843009,213693952}}, 322 1.2 riastrad /* XXX needless overflow */ 323 1.2 riastrad {6917529028,0}, {0,0}, 3, 324 1.3 riastrad NULL}, 325 1.2 riastrad [49] = {{.it_value = {6917529027,0}, 326 1.2 riastrad .it_interval = {2305843009,213693952}}, 327 1.2 riastrad {6917529028,0}, {9223372036,213693952}, 0, NULL}, 328 1.2 riastrad [50] = {{.it_value = {6917529029,0}, 329 1.2 riastrad .it_interval = {2305843009,213693952}}, 330 1.2 riastrad {6917529028,0}, {6917529029,0}, 0, 331 1.3 riastrad NULL}, 332 1.2 riastrad 333 1.2 riastrad /* interval ~ 1/2 * (2^63 - 1) ns, now ~ 3/4 * (2^63 - 1) ns */ 334 1.2 riastrad [51] = {{.it_value = {0,1}, 335 1.2 riastrad .it_interval = {4611686018,427387904}}, 336 1.2 riastrad /* XXX needless overflow */ 337 1.2 riastrad {6917529028,0}, {0,0}, 1, 338 1.3 riastrad NULL}, 339 1.2 riastrad [52] = {{.it_value = {2305843009,213693951}, /* ~1/4 * (2^63 - 1) */ 340 1.2 riastrad .it_interval = {4611686018,427387904}}, 341 1.2 riastrad /* XXX needless overflow */ 342 1.2 riastrad {6917529028,0}, {0,0}, 1, 343 1.3 riastrad NULL}, 344 1.2 riastrad [54] = {{.it_value = {6917529027,0}, 345 1.2 riastrad .it_interval = {4611686018,427387904}}, 346 1.2 riastrad {6917529028,0}, {11529215045,427387904}, 0, NULL}, 347 1.2 riastrad [55] = {{.it_value = {6917529029,0}, 348 1.2 riastrad .it_interval = {4611686018,427387904}}, 349 1.2 riastrad {6917529028,0}, {6917529029,0}, 0, 350 1.3 riastrad NULL}, 351 1.2 riastrad 352 1.2 riastrad [56] = {{.it_value = {INT64_MAX - 1,0}, .it_interval = {1,0}}, 353 1.2 riastrad /* XXX needless overflow */ 354 1.2 riastrad {INT64_MAX - 2,999999999}, {0,0}, 0, 355 1.3 riastrad NULL}, 356 1.2 riastrad [57] = {{.it_value = {INT64_MAX - 1,0}, .it_interval = {1,0}}, 357 1.2 riastrad {INT64_MAX - 1,0}, {INT64_MAX,0}, 0, NULL}, 358 1.2 riastrad [58] = {{.it_value = {INT64_MAX - 1,0}, .it_interval = {1,0}}, 359 1.2 riastrad {INT64_MAX - 1,1}, {INT64_MAX,0}, 0, NULL}, 360 1.2 riastrad [59] = {{.it_value = {INT64_MAX - 1,0}, .it_interval = {1,0}}, 361 1.2 riastrad {INT64_MAX - 1,999999999}, {INT64_MAX,0}, 0, NULL}, 362 1.2 riastrad [60] = {{.it_value = {INT64_MAX - 1,0}, .it_interval = {1,0}}, 363 1.2 riastrad {INT64_MAX,0}, {0,0}, 0, 364 1.3 riastrad NULL}, 365 1.2 riastrad [61] = {{.it_value = {INT64_MAX - 1,0}, .it_interval = {1,0}}, 366 1.2 riastrad {INT64_MAX,1}, {0,0}, 0, 367 1.3 riastrad NULL}, 368 1.2 riastrad [62] = {{.it_value = {INT64_MAX - 1,0}, .it_interval = {1,0}}, 369 1.2 riastrad {INT64_MAX,999999999}, {0,0}, 0, 370 1.3 riastrad NULL}, 371 1.2 riastrad 372 1.2 riastrad [63] = {{.it_value = {INT64_MAX,0}, .it_interval = {1,0}}, 373 1.2 riastrad {INT64_MAX - 1,1}, {0,0}, 0, 374 1.3 riastrad NULL}, 375 1.2 riastrad [64] = {{.it_value = {INT64_MAX,0}, .it_interval = {1,0}}, 376 1.2 riastrad {INT64_MAX - 1,999999999}, {0,0}, 0, 377 1.3 riastrad NULL}, 378 1.2 riastrad [65] = {{.it_value = {INT64_MAX,0}, .it_interval = {1,0}}, 379 1.2 riastrad {INT64_MAX,0}, {0,0}, 0, 380 1.3 riastrad NULL}, 381 1.2 riastrad [66] = {{.it_value = {INT64_MAX,0}, .it_interval = {1,0}}, 382 1.2 riastrad {INT64_MAX,1}, {0,0}, 0, 383 1.3 riastrad NULL}, 384 1.2 riastrad [67] = {{.it_value = {INT64_MAX,0}, .it_interval = {1,0}}, 385 1.2 riastrad {INT64_MAX,999999999}, {0,0}, 0, 386 1.3 riastrad NULL}, 387 1.1 riastrad }; 388 1.1 riastrad 389 1.1 riastrad ATF_TC(itimer_transitions); 390 1.1 riastrad ATF_TC_HEAD(itimer_transitions, tc) 391 1.1 riastrad { 392 1.1 riastrad atf_tc_set_md_var(tc, "descr", 393 1.1 riastrad "Tests interval timer transitions"); 394 1.1 riastrad } 395 1.1 riastrad ATF_TC_BODY(itimer_transitions, tc) 396 1.1 riastrad { 397 1.1 riastrad volatile unsigned i; 398 1.1 riastrad 399 1.1 riastrad REQUIRE_LIBC(signal(SIGFPE, handle_signal), SIG_ERR); 400 1.1 riastrad REQUIRE_LIBC(signal(SIGABRT, handle_signal), SIG_ERR); 401 1.1 riastrad 402 1.1 riastrad for (i = 0; i < __arraycount(itimer_transitions); i++) { 403 1.1 riastrad struct itimer_transition it = itimer_transitions[i]; 404 1.1 riastrad struct timespec next; 405 1.1 riastrad int overruns; 406 1.1 riastrad volatile bool aborted = true; 407 1.1 riastrad volatile bool expect_abort = false; 408 1.1 riastrad 409 1.1 riastrad fprintf(stderr, "case %u\n", i); 410 1.1 riastrad 411 1.1 riastrad if (it.it_xfail) 412 1.1 riastrad atf_tc_expect_fail("%s", it.it_xfail); 413 1.1 riastrad 414 1.1 riastrad if (itimespecfix(&it.it_time.it_value) != 0 || 415 1.1 riastrad itimespecfix(&it.it_time.it_interval) != 0) { 416 1.1 riastrad fprintf(stderr, "rejected by itimerspecfix\n"); 417 1.1 riastrad expect_abort = true; 418 1.1 riastrad } 419 1.1 riastrad 420 1.1 riastrad if (setjmp(jmp) == 0) { 421 1.1 riastrad jmp_en = 1; 422 1.1 riastrad itimer_transition(&it.it_time, &it.it_now, 423 1.1 riastrad &next, &overruns); 424 1.1 riastrad jmp_en = 0; 425 1.1 riastrad aborted = false; 426 1.1 riastrad } 427 1.1 riastrad ATF_CHECK(!jmp_en); 428 1.1 riastrad jmp_en = 0; /* paranoia */ 429 1.1 riastrad if (expect_abort) { 430 1.1 riastrad fprintf(stderr, "expected abort\n"); 431 1.1 riastrad ATF_CHECK_MSG(aborted, 432 1.1 riastrad "[%u] missing invariant assertion", i); 433 1.1 riastrad ATF_CHECK_MSG(jmp_sig == SIGABRT, 434 1.1 riastrad "[%u] missing invariant assertion", i); 435 1.1 riastrad } else { 436 1.1 riastrad ATF_CHECK_MSG(!aborted, "[%u] raised signal %d: %s", i, 437 1.1 riastrad jmp_sig, strsignal(jmp_sig)); 438 1.1 riastrad } 439 1.1 riastrad 440 1.1 riastrad ATF_CHECK_MSG((next.tv_sec == it.it_next.tv_sec && 441 1.1 riastrad next.tv_nsec == it.it_next.tv_nsec), 442 1.1 riastrad "[%u] periodic intervals of %lld.%09d from %lld.%09d" 443 1.1 riastrad " last expired at %lld.%09d:" 444 1.1 riastrad " next expiry at %lld.%09d, expected %lld.%09d", i, 445 1.1 riastrad (long long)it.it_time.it_interval.tv_sec, 446 1.1 riastrad (int)it.it_time.it_interval.tv_nsec, 447 1.1 riastrad (long long)it.it_time.it_value.tv_sec, 448 1.1 riastrad (int)it.it_time.it_value.tv_nsec, 449 1.1 riastrad (long long)it.it_now.tv_sec, (int)it.it_now.tv_nsec, 450 1.1 riastrad (long long)next.tv_sec, (int)next.tv_nsec, 451 1.1 riastrad (long long)it.it_next.tv_sec, (int)it.it_next.tv_nsec); 452 1.1 riastrad ATF_CHECK_EQ_MSG(overruns, it.it_overruns, 453 1.1 riastrad "[%u] periodic intervals of %lld.%09d from %lld.%09d" 454 1.1 riastrad " last expired at %lld.%09d:" 455 1.1 riastrad " overruns %d, expected %d", i, 456 1.1 riastrad (long long)it.it_time.it_interval.tv_sec, 457 1.1 riastrad (int)it.it_time.it_interval.tv_nsec, 458 1.1 riastrad (long long)it.it_time.it_value.tv_sec, 459 1.1 riastrad (int)it.it_time.it_value.tv_nsec, 460 1.1 riastrad (long long)it.it_now.tv_sec, (int)it.it_now.tv_nsec, 461 1.1 riastrad overruns, it.it_overruns); 462 1.1 riastrad 463 1.1 riastrad if (it.it_xfail) 464 1.1 riastrad atf_tc_expect_pass(); 465 1.1 riastrad } 466 1.1 riastrad } 467 1.1 riastrad 468 1.1 riastrad ATF_TP_ADD_TCS(tp) 469 1.1 riastrad { 470 1.1 riastrad 471 1.1 riastrad ATF_TP_ADD_TC(tp, itimer_transitions); 472 1.1 riastrad 473 1.1 riastrad return atf_no_error(); 474 1.1 riastrad } 475 1.1 riastrad 476