jolly has uploaded this change for review.
Prevent poll() in select.c to timeout too early
Adjust osmo_timers_nearest_ms() to round up the remaining time.
Note that poll() has a granularity of 1 millisecond.
Previously, when rounding down the remaining time, osmo_select_main()
would return too early, before the nearest timer timed out.
Consequently, the main loop repeatedly called osmo_select_main() until
the timer actually timed out, resulting in excessive CPU usage.
By modifying osmo_timers_nearest_ms() to round up the remaining time,
we ensure accurate timeout calculations, preventing unnecessary CPU
consumption during the main loop.
Related: OS#6339
Change-Id: I79de77c79af4d50d1eb9ca0c5417123ff760dca3
---
M src/core/timer.c
1 file changed, 28 insertions(+), 1 deletion(-)
git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/72/35672/1
diff --git a/src/core/timer.c b/src/core/timer.c
index 20d87a0..4229c5a 100644
--- a/src/core/timer.c
+++ b/src/core/timer.c
@@ -190,8 +190,13 @@
if (!nearest_p)
return -1;
+ /* By adding 999 milliseconds, we ensure rounding up to the nearest
+ * whole millisecond. This approach prevents the return of 0 when the
+ * timer is still active, and it guarantees that the calling process
+ * does not wait for a duration shorter than the time remaining on the
+ * timer. */
nearest_ms = nearest_p->tv_sec * 1000;
- nearest_ms += nearest_p->tv_usec / 1000;
+ nearest_ms += (nearest_p->tv_usec + 999) / 1000;
return nearest_ms;
}
To view, visit change 35672. To unsubscribe, or for help writing mail filters, visit settings.