blob: 9f5313ccff216117b4d56a8fe25644d7c29e114d [file] [log] [blame]
Alexandros Frantzisc0e2f922018-10-19 12:14:11 +03001/*
2 * Copyright © 2018 Collabora, Ltd
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining
5 * a copy of this software and associated documentation files (the
6 * "Software"), to deal in the Software without restriction, including
7 * without limitation the rights to use, copy, modify, merge, publish,
8 * distribute, sublicense, and/or sell copies of the Software, and to
9 * permit persons to whom the Software is furnished to do so, subject to
10 * the following conditions:
11 *
12 * The above copyright notice and this permission notice (including the
13 * next paragraph) shall be included in all copies or substantial
14 * portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
20 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
21 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 * SOFTWARE.
24 */
25
26#include "config.h"
27
28#include <assert.h>
29#include <errno.h>
30#include <poll.h>
31#include <stddef.h>
32#include <sys/ioctl.h>
Pekka Paalanen4b572732019-04-04 17:11:53 +030033#include <wayland-server-core.h>
Alexandros Frantzisc0e2f922018-10-19 12:14:11 +030034
35#ifdef HAVE_LINUX_SYNC_FILE_H
36#include <linux/sync_file.h>
37#else
38#include "linux-sync-file-uapi.h"
39#endif
40
41#include "linux-sync-file.h"
42#include "shared/timespec-util.h"
43
44/* Check that a file descriptor represents a valid sync file
45 *
46 * \param fd[in] a file descriptor
47 * \return true if fd is a valid sync file, false otherwise
48 */
49bool
50linux_sync_file_is_valid(int fd)
51{
52 struct sync_file_info file_info = { { 0 } };
53
54 if (ioctl(fd, SYNC_IOC_FILE_INFO, &file_info) < 0)
55 return false;
56
57 return file_info.num_fences > 0;
58}
59
60/* Read the timestamp stored in a sync file
61 *
62 * \param fd[in] fd a file descriptor for a sync file
63 * \param ts[out] the timespec struct to fill with the timestamp
64 * \return 0 if a timestamp was read, -1 on error
65 */
Pekka Paalanen4b572732019-04-04 17:11:53 +030066WL_EXPORT int
67weston_linux_sync_file_read_timestamp(int fd, struct timespec *ts)
Alexandros Frantzisc0e2f922018-10-19 12:14:11 +030068{
69 struct sync_file_info file_info = { { 0 } };
70 struct sync_fence_info fence_info = { { 0 } };
71
72 assert(ts != NULL);
73
74 file_info.sync_fence_info = (uint64_t)(uintptr_t)&fence_info;
75 file_info.num_fences = 1;
76
77 if (ioctl(fd, SYNC_IOC_FILE_INFO, &file_info) < 0)
78 return -1;
79
80 timespec_from_nsec(ts, fence_info.timestamp_ns);
81
82 return 0;
83}