Files
tinygo/builder
Elias Naur 78914382c3 runtime: ensure time.Sleep(d) sleeps at least d
Account for the sleep queue base time in the computation of the wakeup
time.

Tested with the following program on pico2.

  func main() {
  	go func() {
  		for i := range 60 {
  			const delay = 20 * time.Millisecond
  			before := time.Now()
  			time.Sleep(delay)
  			if d := time.Since(before); true || d < delay {
  				log.Println(i, "actual", d, "delay", delay)
  			}
  		}
  	}()
  	time.Sleep(500 * time.Millisecond)
  	log.Println("******** done sleeping ********")
  	select {}
  }

Without this change, the program would print lines such as:

  17 actual 15.494ms delay 20ms
  18 actual 15.49ms delay 20ms
  19 actual 15.585ms delay 20ms
  20 actual 15.493ms delay 20ms
  21 actual 15.494ms delay 20ms
  22 actual 15.487ms delay 20ms
  23 actual 15.498ms delay 20ms
  ******** done sleeping ********
  24 actual 15.548ms delay 20ms
  25 actual 20.011ms delay 20ms
  26 actual 20.01ms delay 20ms
  27 actual 20.011ms delay 20ms
  28 actual 20.015ms delay 20ms

Note that while more than one sleeping goroutine is in the timer queue,
the sleep duration is 5ms short.
2025-08-08 01:32:42 +02:00
..
2025-06-13 14:42:23 +02:00
2025-06-13 14:42:23 +02:00
2025-01-20 06:15:33 +01:00
2025-01-20 06:15:33 +01:00
2023-02-26 19:22:10 +01:00
2025-08-06 17:08:26 +02:00
2023-04-18 22:51:49 +02:00
2024-09-24 17:42:30 +01:00
2025-06-13 14:42:23 +02:00
2025-06-13 14:42:23 +02:00
2025-06-13 14:42:23 +02:00
2025-06-13 14:42:23 +02:00
2024-12-19 15:08:37 +01:00
2025-06-13 14:42:23 +02:00
2025-06-13 14:42:23 +02:00