diff options
author | Kristian Høgsberg <krh@redhat.com> | 2008-11-02 15:28:22 -0500 |
---|---|---|
committer | Kristian Høgsberg <krh@redhat.com> | 2008-11-06 10:53:02 -0500 |
commit | d3fa34ca298e734d4e7f14a7023848ff13360109 (patch) | |
tree | 3b5f5715dd8ef499bb474d107955d3342cf05eef /flower.c | |
parent | 5a27f3e6a787be874e0415eda184b0ee01b95a39 (diff) | |
download | wayland-d3fa34ca298e734d4e7f14a7023848ff13360109.tar.gz wayland-d3fa34ca298e734d4e7f14a7023848ff13360109.tar.xz wayland-d3fa34ca298e734d4e7f14a7023848ff13360109.zip |
Don't use poll timeout for timing animation.
Receiving events breaks out of the poll and resets the time out.
Effectively, this blocks the animation when the client receives events.
As a quick fix, use timerfd for timing the animation.
Diffstat (limited to 'flower.c')
-rw-r--r-- | flower.c | 32 |
1 files changed, 27 insertions, 5 deletions
@@ -5,6 +5,8 @@ #include <i915_drm.h> #include <sys/ioctl.h> #include <sys/poll.h> +#include <sys/timerfd.h> +#include <time.h> #include <fcntl.h> #include <unistd.h> #include <math.h> @@ -151,9 +153,10 @@ int main(int argc, char *argv[]) int fd, i, ret; uint32_t name, mask; cairo_surface_t *s; - struct pollfd p[1]; - - srandom(time(NULL)); + struct pollfd p[2]; + struct timespec ts; + struct itimerspec its; + uint64_t expires; fd = open(gem_device, O_RDWR); if (fd < 0) { @@ -171,6 +174,24 @@ int main(int argc, char *argv[]) surface = wl_display_create_surface(display); + p[1].fd = timerfd_create(CLOCK_MONOTONIC, 0); + if (p[1].fd < 0) { + fprintf(stderr, "could not create timerfd\n: %m"); + return -1; + } + + p[1].events = POLLIN; + clock_gettime(CLOCK_MONOTONIC, &ts); + its.it_value = ts; + its.it_interval.tv_sec = 0; + its.it_interval.tv_nsec = 20 * 1000000; + if (timerfd_settime(p[1].fd, TFD_TIMER_ABSTIME, &its, NULL) < 0) { + fprintf(stderr, "could not set timerfd\n: %m"); + return -1; + } + + srandom(ts.tv_nsec); + s = draw_stuff(width, height); name = name_cairo_surface(fd, s); @@ -178,8 +199,9 @@ int main(int argc, char *argv[]) cairo_image_surface_get_stride(s)); i = 0; - while (ret = poll(p, 1, 20), ret >= 0) { - if (ret == 0) { + while (ret = poll(p, 2, -1), ret >= 0) { + if (p[1].revents & POLLIN) { + read(p[1].fd, &expires, sizeof expires); wl_surface_map(surface, x + cos(i / 30.0) * 200, y + sin(i / 31.0) * 200, |