compositor, backends: weston_compositor_read_presentation_clock

Create a new function weston_compositor_read_presentation_clock() to
wrap the clock_gettime() call for the Presentation clock.

Reading the presentation clock is never supposed to fail, but if it
does, this will notify about it. I have not seen it fail yet, though.

This prepares for new testing features in the future that might allow
controlling the presentation clock. Right now it is just a convenience
function for clock_gettime().

All presentation clock readers are converted to call this new function
except rpi-backend's rpi_flippipe_update_complete(), because it gets its
clock id via a thread-safe mechanism. There shouldn't be anything really
thread-unsafe in weston_compositor_read_presentation_clock() at the
moment, but might be in the future, and weston core is not expected to
need to be thread-safe.

This is based on the original patch by
Cc: Derek Foreman <derekf@osg.samsung.com>

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
Reviewed-By: Derek Foreman <derekf@osg.samsung.com>
Reviewed-by: Bryce Harrington <bryce@osg.samsung.com>
diff --git a/src/compositor.c b/src/compositor.c
index 60b7ee4..e060be1 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -4618,6 +4618,39 @@
 	return -1;
 }
 
+/** Read the current time from the Presentation clock
+ *
+ * \param compositor
+ * \param ts[out] The current time.
+ *
+ * \note Reading the current time in user space is always imprecise to some
+ * degree.
+ *
+ * This function is never meant to fail. If reading the clock does fail,
+ * an error message is logged and a zero time is returned. Callers are not
+ * supposed to detect or react to failures.
+ */
+WL_EXPORT void
+weston_compositor_read_presentation_clock(
+			const struct weston_compositor *compositor,
+			struct timespec *ts)
+{
+	static bool warned;
+	int ret;
+
+	ret = clock_gettime(compositor->presentation_clock, ts);
+	if (ret < 0) {
+		ts->tv_sec = 0;
+		ts->tv_nsec = 0;
+
+		if (!warned)
+			weston_log("Error: failure to read "
+				   "the presentation clock %#x: '%m' (%d)\n",
+				   compositor->presentation_clock, errno);
+		warned = true;
+	}
+}
+
 WL_EXPORT void
 weston_version(int *major, int *minor, int *micro)
 {