diff options
author | A. Wilcox <AWilcox@Wilcox-Tech.com> | 2022-12-12 10:04:56 +0000 |
---|---|---|
committer | A. Wilcox <AWilcox@Wilcox-Tech.com> | 2022-12-12 10:04:56 +0000 |
commit | d13bc52fafc1abb0c8e9e51ad8c13ed77a0f2942 (patch) | |
tree | 099e6c8794cd65bacbc8afcb5a3a8c341ce83685 /user/gstreamer/time64.patch | |
parent | d85c1124ddc4e24cb5181e34753defc220206088 (diff) | |
download | packages-d13bc52fafc1abb0c8e9e51ad8c13ed77a0f2942.tar.gz packages-d13bc52fafc1abb0c8e9e51ad8c13ed77a0f2942.tar.bz2 packages-d13bc52fafc1abb0c8e9e51ad8c13ed77a0f2942.tar.xz packages-d13bc52fafc1abb0c8e9e51ad8c13ed77a0f2942.zip |
user/gstreamer: Fix for time64 issue
The patch fixes #853 (libs_gstnetclientclock).
The glib-2.72.4 update is actually what fixed #874, as futex was broken
on 32-bit architectures. It was affecting PowerPC harder because the
MSB was what the kernel was seeing, but in 2038 the other arches would
have started seeing the same failures.
Fixes: #853, #874
Diffstat (limited to 'user/gstreamer/time64.patch')
-rw-r--r-- | user/gstreamer/time64.patch | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/user/gstreamer/time64.patch b/user/gstreamer/time64.patch new file mode 100644 index 000000000..89c88c380 --- /dev/null +++ b/user/gstreamer/time64.patch @@ -0,0 +1,60 @@ +From 664fc63a246cba97e202f712aa48105f46a9ff69 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= <sebastian@centricular.com> +Date: Mon, 12 Dec 2022 11:34:51 +0200 +Subject: [PATCH] systemclock: Use `futex_time64` syscall on x32 and other + platforms that always use a 32-bit `struct timespec` for the normal `futex` + syscall + +See also https://gitlab.gnome.org/GNOME/glib/-/issues/2634 +--- + gst/gstsystemclock.c | 26 +++++++++++++++++++++- + 1 file changed, 25 insertions(+), 1 deletion(-) + +diff --git a/gst/gstsystemclock.c b/gst/gstsystemclock.c +index 6d0b6ec47b6..8c396d2c7b4 100644 +--- a/gst/gstsystemclock.c ++++ b/gst/gstsystemclock.c +@@ -130,7 +130,31 @@ gst_futex_cond_broadcast (guint * cond_val) + static gboolean + gst_futex_cond_wait_until (guint * cond_val, GMutex * mutex, gint64 end_time) + { ++ /* On x32 (ILP32 ABI on x86_64) and potentially sparc64, the raw futex() ++ * syscall takes a 32-bit timespan argument *regardless* of whether userspace ++ * is using 32-bit or 64-bit `struct timespec`. This means that we can’t ++ * unconditionally pass a `struct timespec` pointer into the syscall. ++ * ++ * Assume that any such platform is new enough to define the ++ * `__NR_futex_time64` workaround syscall (which accepts 64-bit timespecs, ++ * introduced in kernel 5.1), and use that to pass a 64-bit timespec instead. ++ * ++ * `clock_gettime()` on such systems will either return a 32-bit `struct ++ * timespec`, in which case the values we will get passed in here are ++ * already not y2038-safe, or `struct timespec` is using 64-bit `time_t` and ++ * everything is fine. ++ */ ++#ifdef __NR_futex_time64 ++ struct ++ { ++ gint64 tv_sec; ++ gint64 tv_nsec; ++ } end; ++ const long int futex_syscall_id = __NR_futex_time64; ++#else + struct timespec end; ++ const long int futex_syscall_id = __NR_futex; ++#endif + guint sampled; + int res; + gboolean success; +@@ -146,7 +170,7 @@ gst_futex_cond_wait_until (guint * cond_val, GMutex * mutex, gint64 end_time) + /* we use FUTEX_WAIT_BITSET_PRIVATE rather than FUTEX_WAIT_PRIVATE to be + * able to use absolute time */ + res = +- syscall (__NR_futex, cond_val, (gsize) FUTEX_WAIT_BITSET_PRIVATE, ++ syscall (futex_syscall_id, cond_val, (gsize) FUTEX_WAIT_BITSET_PRIVATE, + (gsize) sampled, &end, NULL, FUTEX_BITSET_MATCH_ANY); + success = (res < 0 && errno == ETIMEDOUT) ? FALSE : TRUE; + g_mutex_lock (mutex); +-- +GitLab + |