| 263 | } |
| 264 | |
| 265 | static void runtime_wait_tick(uint64_t deadline_ms) { |
| 266 | uint64_t now_ms = cbm_now_ms(); |
| 267 | if (now_ms >= deadline_ms) { |
| 268 | return; |
| 269 | } |
| 270 | uint64_t remaining_ms = deadline_ms - now_ms; |
| 271 | struct timespec pause = { |
| 272 | .tv_sec = 0, |
| 273 | .tv_nsec = remaining_ms > 1 ? RUNTIME_WAIT_POLL_NS : (long)(remaining_ms * 1000000ULL), |
| 274 | }; |
| 275 | (void)cbm_nanosleep(&pause, NULL); |
| 276 | } |
| 277 | |
| 278 | static void runtime_put_u32(uint8_t *out, uint32_t value) { |
| 279 | out[0] = (uint8_t)(value >> 24); |
no test coverage detected