From 84cf541b279f0beb2162aff46c85aefbab60a77c Mon Sep 17 00:00:00 2001 From: Rob Bradford Date: Thu, 9 Aug 2012 15:35:49 +0100 Subject: [PATCH] spring: Avoid excessive calculation loops for the spring values To handle the case where wall clock time jumps forwards by a large amount or backwards limit the execution of the spring calculation loop. We do this by forcing the spring update timestamp to being no older that 1s of the most current time we've been given. We also present a log message if the timestamp jumps more than expected. --- src/util.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/util.c b/src/util.c index fa360c24..4ff451ab 100644 --- a/src/util.c +++ b/src/util.c @@ -46,12 +46,15 @@ weston_spring_update(struct weston_spring *spring, uint32_t msec) { double force, v, current, step; - /* Avoid entering into an infinite loop */ - if (msec - spring->timestamp > UINT32_MAX / 2) { - weston_log("timestamps going backwards (from %u to %u)\n", - spring->timestamp, msec); - spring->current = spring->previous = spring->target; - return; + /* Limit the number of executions of the loop below by ensuring that + * the timestamp for last update of the spring is no more than 1s ago. + * This handles the case where time moves backwards or forwards in + * large jumps. + */ + if (msec - spring->timestamp > 1000) { + weston_log("unexpectedly large timestamp jump (from %u to %u)\n", + spring->timestamp, msec); + spring->timestamp = msec - 1000; } step = 0.01;