Skip to content

Conversation

@spytheman
Copy link
Member

@spytheman spytheman commented Jan 6, 2026

Checked with running this script on a windows laptop, which failed on master:

import time

wait_times := [
        5 * time.minute + 52 * time.second,
        3 * time.minute + 14 * time.second,
        44 * time.second,
        26 * time.second,
        1 * time.minute + 58 * time.second,
        4 * time.second,
        4 * time.minute + 27 * time.second,
        3 * time.minute + 24 * time.second,
        5 * time.minute + 3 * time.second,
        1 * time.minute + 56 * time.second,
        1 * time.minute + 8 * time.second,
        12 * time.second,
        10 * time.minute + 8 * time.second,
]

mut wt := 0
mut sw := time.new_stopwatch()
for wt != wait_times.len {
        println('wt: ${wt} | wait_times.len: ${wait_times.len} | sleeping for: ${wait_times[wt]} | SW: ${sw}')
        time.sleep(wait_times[wt])
        sw.stop()
        if sw.end < sw.start {
                println('Negative: ${sw}')
                println('>>>> wt was: ${wt}')
                break
        }
        println('Elapsed: ${sw.elapsed()}')
        sw.start()
        wt++
}
println('Success, wt: ${wt}')

On this PR, it produced:

#0 14:14:24 ᛋ fix_overflow_in__time_sys_mono_now__on_windows /d/programs/v❱v run /d/programs/misc/2026_01_06__14/x.v
wt: 0 | wait_times.len: 13 | sleeping for: 352000000000 | SW: time.StopWatch{
    elapsed: 0
    start: 6500
    end: 0
}
Elapsed: 5:52.003
wt: 1 | wait_times.len: 13 | sleeping for: 194000000000 | SW: time.StopWatch{
    elapsed: 0
    start: 352003608500
    end: 0
}
Elapsed: 3:14.007
wt: 2 | wait_times.len: 13 | sleeping for: 44000000000 | SW: time.StopWatch{
    elapsed: 0
    start: 546011778000
    end: 0
}
Elapsed: 44.005s
wt: 3 | wait_times.len: 13 | sleeping for: 26000000000 | SW: time.StopWatch{
    elapsed: 0
    start: 590017421300
    end: 0
}
Elapsed: 26.004s
wt: 4 | wait_times.len: 13 | sleeping for: 118000000000 | SW: time.StopWatch{
    elapsed: 0
    start: 616021871000
    end: 0
}
Elapsed: 1:58.003
wt: 5 | wait_times.len: 13 | sleeping for: 4000000000 | SW: time.StopWatch{
    elapsed: 0
    start: 734025659500
    end: 0
}
Elapsed: 4.015s
wt: 6 | wait_times.len: 13 | sleeping for: 267000000000 | SW: time.StopWatch{
    elapsed: 0
    start: 738040947600
    end: 0
}
Elapsed: 4:27.003
wt: 7 | wait_times.len: 13 | sleeping for: 204000000000 | SW: time.StopWatch{
    elapsed: 0
    start: 1005044610600
    end: 0
}
Elapsed: 3:24.006
wt: 8 | wait_times.len: 13 | sleeping for: 303000000000 | SW: time.StopWatch{
    elapsed: 0
    start: 1209051341600
    end: 0
}
Elapsed: 5:03.011
wt: 9 | wait_times.len: 13 | sleeping for: 116000000000 | SW: time.StopWatch{
    elapsed: 0
    start: 1512063166200
    end: 0
}
Elapsed: 1:56.012
wt: 10 | wait_times.len: 13 | sleeping for: 68000000000 | SW: time.StopWatch{
    elapsed: 0
    start: 1628076211100
    end: 0
}
Elapsed: 1:08.002
wt: 11 | wait_times.len: 13 | sleeping for: 12000000000 | SW: time.StopWatch{
    elapsed: 0
    start: 1696079343500
    end: 0
}
Elapsed: 12.006s
wt: 12 | wait_times.len: 13 | sleeping for: 608000000000 | SW: time.StopWatch{
    elapsed: 0
    start: 1708086601900
    end: 0
}
Elapsed: 10:08.007
Success, wt: 13
#0 14:53:08 ᛋ fix_overflow_in__time_sys_mono_now__on_windows /d/programs/v❱

which is consistent with the output on a macos and linux machines.

Fixes: 26265

TLDR: avoid overflow produced by multiplying by 1000000000, just to delete after that by 10000000 . In essence, that is now replaced by multiplying by 100 (for the windows machines we tested on).

@spytheman
Copy link
Member Author

Drawbacks: with this approach, a potential overflow could happen, for a stopwatch running for more than 5.8 years:

0[15:04:53]@m1: (master) /opt/v $ bc
>>> scale=16
>>> ((2^64 / 100 ) / 1000000000) / (3600*24*365)
5.8494241735507203
>>>

however I think it is an acceptable compromise (the same can happen on macos, that uses a conversion by multiplying/dividing too), and stopwatches are used for measuring a lot shorter durations normally.

@spytheman
Copy link
Member Author

(the CI failures are not related)

@spytheman spytheman merged commit 9e10ffa into vlang:master Jan 6, 2026
70 of 82 checks passed
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.

time module: Return value of sys_mono_now is not the counter value.

1 participant