On Wed, Sep 5, 2012 at 9:28 PM, Wang, Quanxian <[email protected]> wrote:
>
>
>> -----Original Message-----
>> From: Kristian Høgsberg [mailto:[email protected]]
>> Sent: Thursday, September 06, 2012 3:28 AM
>> To: Wang, Quanxian
>> Cc: [email protected]; Guo, Chaohong; Bradford, Robert
>> Subject: Re: [PATCH] compositor: fix overflow issue when calculate msecs of
>> vblank
>>
>> On Wed, Sep 05, 2012 at 03:35:32AM +0000, Wang, Quanxian wrote:
>> > From "Quanxian Wang"
>> > <[email protected]<mailto:[email protected]>>
>> >
>> > commit f7b156cef1ed8081df6f25cc0e66c8d7fbf414fc
>> > Author: Wang Quanxian <[email protected]>
>> > 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 <[email protected]>
>>
>> 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.
> [Wang, Quanxian] I agree your point partly. My different point is for
> example, take 100 as the limit, you have 101 and 99 number, the diff is 2. To
> 101, after conversion, the number is 01 and to 99 is 99. The diff turns to be
> 98 and compared with previous 2 it turns to bigger. In the limit, it is the
> safe, cross the border is not safe.
No unsigned integer math in C is defined so that this actually works.
Assume four bit integers (that is, our range is 0-15). Suppose you
have timestamps 14 and 17. The difference is 17 - 14 = 3. But with 4
bit unsigned integers, the values are truncated to 14 and 1. However,
1 - 14 still gives the right result.
Kristian
>>
>> 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
>> > [email protected]
>> > http://lists.freedesktop.org/mailman/listinfo/wayland-devel
>
_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel