From: RĂ©mi Denis-Courmont Date: Wed, 10 Dec 2008 20:20:25 +0000 (+0200) Subject: Still try to splice as many memory pages as possible X-Git-Tag: 1.0.0-pre1~1853 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=6f029c3e7551e729e0cecda0a89503fcafa5d63f;p=vlc Still try to splice as many memory pages as possible --- diff --git a/modules/stream_filter/decomp.c b/modules/stream_filter/decomp.c index d57192083a..d6b991156a 100644 --- a/modules/stream_filter/decomp.c +++ b/modules/stream_filter/decomp.c @@ -83,7 +83,7 @@ static void *Thread (void *data) stream_t *stream = data; stream_sys_t *p_sys = stream->p_sys; #ifdef __linux__ - uintptr_t page_mask = sysconf (_SC_PAGE_SIZE) - 1; + ssize_t page_mask = sysconf (_SC_PAGE_SIZE) - 1; #endif int fd = p_sys->write_fd; bool error = false; @@ -108,14 +108,16 @@ static void *Thread (void *data) for (ssize_t i = 0, j; i < len; i += j) { - struct iovec iov[1] = { { buf + i, len - i, } }; - #ifdef __linux__ - if (((len | i) & page_mask) == 0) - j = vmsplice (fd, iov, 1, SPLICE_F_GIFT); + if ((len - i) <= page_mask) /* incomplete last page */ + j = write (fd, buf + i, len - i); else + { + struct iovec iov = { buf + i, (len - i) & ~page_mask, }; + j = vmsplice (fd, &iov, 1, SPLICE_F_GIFT); + } #else - j = writev (fd, iov, 1); + j = write (fd, buf + i, len - i); #endif if (j <= 0) {