Skip to content

Support integer parts-per-second time unit#2227

Open
petermm wants to merge 3 commits intoatomvm:release-0.7from
petermm:feature/integer-time-unit
Open

Support integer parts-per-second time unit#2227
petermm wants to merge 3 commits intoatomvm:release-0.7from
petermm:feature/integer-time-unit

Conversation

@petermm
Copy link
Copy Markdown
Contributor

@petermm petermm commented Mar 23, 2026

Add support for positive integer time units ("parts per second") in erlang:monotonic_time/1, erlang:system_time/1, and calendar:system_time_to_universal_time/2.

Used in elixir DynamicSupervisor - completes the timeunit support.

Restrict integer-unit handling to int64 inputs in the affected NIF paths. Use checked int64 decomposition for monotonic/system time conversion to avoid signed overflow in intermediate arithmetic. For calendar integer units, floor negative fractional values to whole seconds before converting to UTC.

Add focused Erlang tests for integer-unit parity, badarg on non-positive integer units, and negative fractional calendar conversion for integer units.

These changes are made under both the "Apache 2.0" and the "GNU Lesser General
Public License 2.1 or later" license terms (dual license).

SPDX-License-Identifier: Apache-2.0 OR LGPL-2.1-or-later

@petermm petermm force-pushed the feature/integer-time-unit branch 2 times, most recently from dad612d to 1f640b2 Compare March 24, 2026 12:54
@petermm petermm force-pushed the feature/integer-time-unit branch from 1f640b2 to 821baec Compare April 2, 2026 10:17
petermm added 3 commits April 6, 2026 16:23
Add support for positive integer time units ("parts per second") in
erlang:monotonic_time/1, erlang:system_time/1, and
calendar:system_time_to_universal_time/2.

Restrict integer-unit handling to int64 inputs in the affected NIF paths.
Use checked int64 decomposition for monotonic/system time conversion to
avoid signed overflow in intermediate arithmetic. For calendar integer
units, floor negative fractional values to whole seconds before converting
to UTC.

Add focused Erlang tests for integer-unit parity, badarg on non-positive
integer units, and negative fractional calendar conversion for integer
units.

Signed-off-by: Peter M <petermm@gmail.com>
…ative rounding

Validate argv[0] is an integer before calling term_maybe_unbox_int64 to
prevent interpreting arbitrary term data as an int64.

Use floor division instead of C truncation for all time-unit branches so
negative sub-second values round toward negative infinity, matching OTP
semantics. For example calendar:system_time_to_universal_time(-1,
millisecond) now correctly returns {{1969,12,31},{23,59,59}}.

Add tests for negative calendar conversions and non-integer input.

Signed-off-by: Peter M <petermm@gmail.com>
Extract time_unit_to_parts_per_second, nanoseconds_to_parts_per_second,
timespec_to_parts_per_second, and make_time_in_unit helpers to eliminate
code duplication between monotonic_time and system_time BIFs.

The new timespec_to_parts_per_second correctly handles negative
timestamps with non-zero tv_nsec by using an adjusted-seconds approach
that avoids rejecting valid results whose intermediate sec*pps would
overflow but whose final floored value fits in int64.

Calendar function now reuses time_unit_to_parts_per_second for unit
dispatch.

Add tests for non-power-of-10 integer units (256, 48000), boundary
floor-division cases, and additional badarg coverage.

Signed-off-by: Peter M <petermm@gmail.com>
@petermm petermm force-pushed the feature/integer-time-unit branch from 821baec to 3892ce4 Compare April 6, 2026 14:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant