gfile: Add Linux kernel headers compatibility kludge

So we can still run at full speed on modern kernels in cases where an
old toolchain was used to build GLib. This is often done deliberately
to allow shipping binaries that need to run on a wide range of systems.
This commit is contained in:
Ole André Vadla Ravnås 2018-04-01 01:54:48 +02:00
parent 9d40b0ceb9
commit 94a8a60a7e

View File

@ -35,6 +35,20 @@
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
/*
* We duplicate the following Linux kernel header defines here so we can still
* run at full speed on modern kernels in cases where an old toolchain was used
* to build GLib. This is often done deliberately to allow shipping binaries
* that need to run on a wide range of systems.
*/
#ifndef F_SETPIPE_SZ
#define F_SETPIPE_SZ 1031
#endif
#ifndef F_GETPIPE_SZ
#define F_GETPIPE_SZ 1032
#endif
#endif
#include <string.h>
@ -3015,31 +3029,22 @@ splice_stream_with_progress (GInputStream *in,
if (!g_unix_open_pipe (buffer, FD_CLOEXEC, error))
return FALSE;
#if defined(F_SETPIPE_SZ) && defined(F_GETPIPE_SZ)
/* Try a 1MiB buffer for improved throughput. If that fails, use the default
* pipe size. See: https://bugzilla.gnome.org/791457 */
buffer_size = fcntl (buffer[1], F_SETPIPE_SZ, 1024 * 1024);
if (buffer_size <= 0)
{
int errsv;
buffer_size = fcntl (buffer[1], F_GETPIPE_SZ);
errsv = errno;
if (buffer_size <= 0)
{
g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errsv),
_("Error splicing file: %s"), g_strerror (errsv));
res = FALSE;
goto out;
/* If #F_GETPIPE_SZ isnt available, assume were on Linux < 2.6.35,
* but 2.6.11, meaning the pipe capacity is 64KiB. Ignore the
* possibility of running on Linux < 2.6.11 (where the capacity was
* the system page size, typically 4KiB) because its ancient.
* See pipe(7). */
buffer_size = 1024 * 64;
}
}
#else
/* If #F_GETPIPE_SZ isnt available, assume were on Linux < 2.6.35,
* but 2.6.11, meaning the pipe capacity is 64KiB. Ignore the possibility of
* running on Linux < 2.6.11 (where the capacity was the system page size,
* typically 4KiB) because its ancient. See pipe(7). */
buffer_size = 1024 * 64;
#endif
g_assert (buffer_size > 0);