[cairo] [PATCH 2/2] Workaround for systems lacking clock_gettime()
Dave Yeo
dave.r.yeo at gmail.com
Thu Sep 1 21:07:32 PDT 2011
Fall back to gettimeofday() when system is missing clock_gettime().
Also include sys/time.h for systems such as OS/2 where the timeval struct is
located there.
Signed-off-by: Dave Yeo <dave.r.yeo at gmail.com>
---
build/configure.ac.system | 2 +-
src/cairo-surface-observer.c | 49 +++++++++++++++++++++++++++++++++++------
2 files changed, 42 insertions(+), 9 deletions(-)
diff --git a/build/configure.ac.system b/build/configure.ac.system
index b405740..f3d5483 100644
--- a/build/configure.ac.system
+++ b/build/configure.ac.system
@@ -112,7 +112,7 @@ AC_CHECK_HEADER(fenv.h,
[AC_CHECK_FUNCS(feenableexcept fedisableexcept feclearexcept)])
dnl check for misc headers and functions
-AC_CHECK_HEADERS([libgen.h byteswap.h signal.h setjmp.h fenv.h])
+AC_CHECK_HEADERS([libgen.h byteswap.h signal.h setjmp.h fenv.h sys/time.h])
AC_CHECK_FUNCS([vasnprintf link ctime_r drand48 flockfile funlockfile ffs])
dnl check for win32 headers (this detects mingw as well)
diff --git a/src/cairo-surface-observer.c b/src/cairo-surface-observer.c
index 3c4521f..e0cbaa1 100644
--- a/src/cairo-surface-observer.c
+++ b/src/cairo-surface-observer.c
@@ -48,6 +48,16 @@
#include "cairo-surface-subsurface-private.h"
#include "cairo-reference-count-private.h"
+#if HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+
+#if HAVE_CLOCK_TIME
+#define tspec timespec
+#else
+#define tspec timeval
+#endif
+
static const cairo_surface_backend_t _cairo_surface_observer_backend;
/* observation/stats */
@@ -623,16 +633,17 @@ add_record (cairo_observation_t *log,
assert (status == CAIRO_INT_STATUS_SUCCESS);
}
+#if HAVE_CLOCK_GETTIME
static void
-start_timer (struct timespec *ts)
+start_timer (struct tspec *ts)
{
clock_gettime (CLOCK_MONOTONIC, ts);
}
static double
-stop_timer (const struct timespec *then)
+stop_timer (const struct tspec *then)
{
- struct timespec now;
+ struct tspec now;
double elapsed;
clock_gettime (CLOCK_MONOTONIC, &now);
@@ -642,6 +653,28 @@ stop_timer (const struct timespec *then)
return elapsed;
}
+#else
+
+static void
+start_timer (struct tspec *ts)
+{
+ gettimeofday (ts, NULL);
+}
+
+static double
+stop_timer (const struct tspec *then)
+{
+ struct tspec now;
+ double elapsed;
+
+ gettimeofday (&now, NULL);
+
+ elapsed = now.tv_usec - then->tv_usec;
+ elapsed += 1e6 * (now.tv_sec - then->tv_sec);
+ return elapsed;
+}
+#endif
+
static void
sync (cairo_surface_t *target, int x, int y)
{
@@ -704,7 +737,7 @@ _cairo_surface_observer_paint (void *abstract_surface,
cairo_composite_rectangles_t composite;
cairo_rectangle_int_t extents;
cairo_int_status_t status;
- struct timespec ts;
+ struct tspec ts;
double elapsed;
int x, y;
@@ -790,7 +823,7 @@ _cairo_surface_observer_mask (void *abstract_surface,
cairo_composite_rectangles_t composite;
cairo_rectangle_int_t extents;
cairo_int_status_t status;
- struct timespec ts;
+ struct tspec ts;
double elapsed;
int x, y;
@@ -892,7 +925,7 @@ _cairo_surface_observer_fill (void *abstract_surface,
cairo_composite_rectangles_t composite;
cairo_rectangle_int_t extents;
cairo_int_status_t status;
- struct timespec ts;
+ struct tspec ts;
double elapsed;
int x, y;
@@ -1007,7 +1040,7 @@ _cairo_surface_observer_stroke (void *abstract_surface,
cairo_composite_rectangles_t composite;
cairo_rectangle_int_t extents;
cairo_int_status_t status;
- struct timespec ts;
+ struct tspec ts;
double elapsed;
int x, y;
@@ -1125,7 +1158,7 @@ _cairo_surface_observer_glyphs (void *abstract_surface,
cairo_rectangle_int_t extents;
cairo_int_status_t status;
cairo_glyph_t *dev_glyphs;
- struct timespec ts;
+ struct tspec ts;
double elapsed;
int x, y;
--
1.7.2.3
More information about the cairo
mailing list