[PATCH] compositor: fix overflow issue when calculate msecs of vblank
Kristian Høgsberg
hoegsberg at gmail.com
Wed Sep 5 12:27:45 PDT 2012
On Wed, Sep 05, 2012 at 03:35:32AM +0000, Wang, Quanxian wrote:
> From "Quanxian Wang" <quanxian.wang at intel.com<mailto:quanxian.wang at intel.com>>
>
> commit f7b156cef1ed8081df6f25cc0e66c8d7fbf414fc
> Author: Wang Quanxian <quanxian.wang at intel.com>
> Date: Wed Sep 5 11:30:38 2012 +0800
>
> Change int to long to avoid the overflow when calculation vblank msecs
>
> secs and nsecs are from vblank event, the number of secs is very big(134xxxxxxx),
> when turns secs to msecs(multiple 1000), it will exceed uint32
> max value.
>
> Signed-Off-By Quanxian Wang <quanxian.wang at intel.com>
No, the overflow is itentional. The timestamp is just a milisecond
value with an unspecified epoch, only differences between timestamps
are useful. It may overflow and that's expected. If you use uint32_t
math, you can subtract timestamps before and after an overflow and
still get the number of miliseconds elapsed.
Kristian
> diff --git a/src/compositor-drm.c b/src/compositor-drm.c
> index df81aba..8b6285c 100644
> --- a/src/compositor-drm.c
> +++ b/src/compositor-drm.c
> @@ -447,7 +447,7 @@ vblank_handler(int fd, unsigned int frame, unsigned int sec, unsigned int usec,
> struct drm_sprite *s = (struct drm_sprite *)data;
> struct drm_compositor *c = s->compositor;
> struct drm_output *output = s->output;
> - uint32_t msecs;
> + uint64_t msecs = 0;
>
> output->vblank_pending = 0;
>
> @@ -480,7 +480,7 @@ page_flip_handler(int fd, unsigned int frame,
> unsigned int sec, unsigned int usec, void *data)
> {
> struct drm_output *output = (struct drm_output *) data;
> - uint32_t msecs;
> + uint64_t msecs=0;
>
> output->page_flip_pending = 0;
>
> @@ -496,7 +496,7 @@ page_flip_handler(int fd, unsigned int frame,
> output->next = NULL;
>
> if (!output->vblank_pending) {
> - msecs = sec * 1000 + usec / 1000;
> + msecs = (uint64_t)sec * 1000 + (uint64_t)usec / 1000;
> weston_output_finish_frame(&output->base, msecs);
> }
> }
> diff --git a/src/compositor.c b/src/compositor.c
> index f4263ac..37c52bc 100644
> --- a/src/compositor.c
> +++ b/src/compositor.c
> @@ -1026,7 +1026,7 @@ weston_output_damage(struct weston_output *output)
>
> static void
> fade_frame(struct weston_animation *animation,
> - struct weston_output *output, uint32_t msecs)
> + struct weston_output *output, uint64_t msecs)
> {
> struct weston_compositor *compositor =
> container_of(animation,
> @@ -1129,7 +1129,7 @@ surface_accumulate_damage(struct weston_surface *surface,
> }
>
> static void
> -weston_output_repaint(struct weston_output *output, uint32_t msecs)
> +weston_output_repaint(struct weston_output *output, uint64_t msecs)
> {
> struct weston_compositor *ec = output->compositor;
> struct weston_surface *es;
> @@ -1222,7 +1222,7 @@ weston_compositor_read_input(int fd, uint32_t mask, void *data)
> }
>
> WL_EXPORT void
> -weston_output_finish_frame(struct weston_output *output, uint32_t msecs)
> +weston_output_finish_frame(struct weston_output *output, uint64_t msecs)
> {
> struct weston_compositor *compositor = output->compositor;
> struct wl_event_loop *loop =
> diff --git a/src/compositor.h b/src/compositor.h
> index 7a8058e..f49da84 100644
> --- a/src/compositor.h
> +++ b/src/compositor.h
> @@ -109,7 +109,7 @@ struct weston_spring {
> double current;
> double target;
> double previous;
> - uint32_t timestamp;
> + uint64_t timestamp;
> };
>
> enum {
> @@ -164,7 +164,7 @@ struct weston_output {
> struct weston_output_zoom zoom;
> int dirty;
> struct wl_signal frame_signal;
> - uint32_t frame_time;
> + uint64_t frame_time;
> int disable_planes;
>
> char *make, *model;
> @@ -493,7 +493,7 @@ void
> weston_spring_init(struct weston_spring *spring,
> double k, double current, double target);
> void
> -weston_spring_update(struct weston_spring *spring, uint32_t msec);
> +weston_spring_update(struct weston_spring *spring, uint64_t msec);
> int
> weston_spring_done(struct weston_spring *spring);
>
> @@ -543,7 +543,7 @@ void
> weston_plane_release(struct weston_plane *plane);
>
> void
> -weston_output_finish_frame(struct weston_output *output, uint32_t msecs);
> +weston_output_finish_frame(struct weston_output *output, uint64_t msecs);
> void
> weston_output_schedule_repaint(struct weston_output *output);
> void
> diff --git a/src/util.c b/src/util.c
> index 4ff451a..34b140e 100644
> --- a/src/util.c
> +++ b/src/util.c
> @@ -42,7 +42,7 @@ weston_spring_init(struct weston_spring *spring,
> }
>
> WL_EXPORT void
> -weston_spring_update(struct weston_spring *spring, uint32_t msec)
> +weston_spring_update(struct weston_spring *spring, uint64_t msec)
> {
> double force, v, current, step;
>
>
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
More information about the wayland-devel
mailing list