This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

GNU C Library master sources branch master updated. glibc-2.23-423-gaf5fdf5


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  af5fdf5a358329161cc3960f5e54fac16dbb8063 (commit)
       via  4e7781517397b4eabbd012f161ee4bfd9bb734a9 (commit)
      from  af0cfbaf1df1549ca0bc70bd6b4bc54004d11680 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=af5fdf5a358329161cc3960f5e54fac16dbb8063

commit af5fdf5a358329161cc3960f5e54fac16dbb8063
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Date:   Mon Apr 11 15:07:12 2016 -0300

    Consolidate pwritev/pwritev64 implementations
    
    This patch consolidates all the pwritev{64} implementation for Linux
    in only one (sysdeps/unix/sysv/linux/pwritev{64}.c).  It also removes the
    syscall from the auto-generation using assembly macros.
    
    It was based on previous pwrite/pwrite64 consolidation patch.  The new macro
    SYSCALL_LL{64} is used to handle the offset argument and alias is created
    for __ASSUME_OFF_DIFF_OFF64 in case of pread64.
    
    Checked on x86_64, i386, aarch64, and powerpc64le.
    
    	* misc/Makefile (CFLAGS-pwritev.c): New variable: add cancellation
    	required flags.
    	(CFLAGS-pwritev64.c): Likewise.
    	* sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev.c: Remove file.
    	* sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev64.c: Likewise.
    	* sysdeps/unix/sysv/linux/mips/mips64/n64/pwritev64.c: Likewise.
    	* sysdeps/unix/sysv/linux/wordsize-64/pwritev.c: Likewise.
    	* sysdeps/unix/sysv/linux/wordsize-64/pwritev64.: Likwise.
    	* sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list (pwritev): Remove
    	syscall from auto-generation.
    	* sysdeps/unix/sysv/linux/pwritev.c: Rewrite implementation.
    	[WORDSIZE == 64] (pwritev64): Remove macro.
    	[!PWRITEV] (PWRITEV): Likewise.
    	[!PWRITEV] (PWRITEV_REPLACEMENT): Likewise.
    	[!PWRITEV] (PWRITE): Likewise.
    	[!PWRITEV] (OFF_T): Likewise.
    	[!__ASSUME_PWRITEV] (PWRITEV_REPLACEMENT): Likewise.
    	(LO_HI_LONG): Remove macro.
    	[__WORDSIZE != 64 || __ASSUME_OFF_DIFF_OFF64] (pwritev): Add function.
    	* sysdeps/unix/sysv/linux/pwritev64.c: Rewrite implementation.
    	(PWRITEV): Remove macro.
    	(PWRITEV_REPLACEMENTE): Likewise.
    	(PWRITE): Likewise.
    	(OFF_T): Likewise.
    	(pwritev64): New function.
    	* nptl/tst-cancel4.c (tf_writev): Add test.

diff --git a/ChangeLog b/ChangeLog
index b541737..e207a71 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,32 @@
 2016-06-06  Adhemerval Zanella  <adhemerval.zanella@linaro.org>
 
+	* misc/Makefile (CFLAGS-pwritev.c): New variable: add cancellation
+	required flags.
+	(CFLAGS-pwritev64.c): Likewise.
+	* sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev.c: Remove file.
+	* sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev64.c: Likewise.
+	* sysdeps/unix/sysv/linux/mips/mips64/n64/pwritev64.c: Likewise.
+	* sysdeps/unix/sysv/linux/wordsize-64/pwritev.c: Likewise.
+	* sysdeps/unix/sysv/linux/wordsize-64/pwritev64.: Likwise.
+	* sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list (pwritev): Remove
+	syscall from auto-generation.
+	* sysdeps/unix/sysv/linux/pwritev.c: Rewrite implementation.
+	[WORDSIZE == 64] (pwritev64): Remove macro.
+	[!PWRITEV] (PWRITEV): Likewise.
+	[!PWRITEV] (PWRITEV_REPLACEMENT): Likewise.
+	[!PWRITEV] (PWRITE): Likewise.
+	[!PWRITEV] (OFF_T): Likewise.
+	[!__ASSUME_PWRITEV] (PWRITEV_REPLACEMENT): Likewise.
+	(LO_HI_LONG): Remove macro.
+	[__WORDSIZE != 64 || __ASSUME_OFF_DIFF_OFF64] (pwritev): Add function.
+	* sysdeps/unix/sysv/linux/pwritev64.c: Rewrite implementation.
+	(PWRITEV): Remove macro.
+	(PWRITEV_REPLACEMENTE): Likewise.
+	(PWRITE): Likewise.
+	(OFF_T): Likewise.
+	(pwritev64): New function.
+	* nptl/tst-cancel4.c (tf_writev): Add test.
+
 	* misc/Makefile (CFLAGS-preadv.c): New variable: add cancellation
 	required flags.
 	(CFLAGS-preadv64.c): Likewise.
diff --git a/misc/Makefile b/misc/Makefile
index 658d4ba..6498adc 100644
--- a/misc/Makefile
+++ b/misc/Makefile
@@ -90,6 +90,8 @@ CFLAGS-readv.c = -fexceptions -fasynchronous-unwind-tables
 CFLAGS-writev.c = -fexceptions -fasynchronous-unwind-tables
 CFLAGS-preadv.c = -fexceptions -fasynchronous-unwind-tables
 CFLAGS-preadv64.c = -fexceptions -fasynchronous-unwind-tables
+CFLAGS-pwritev.c = -fexceptions -fasynchronous-unwind-tables
+CFLAGS-pwritev64.c = -fexceptions -fasynchronous-unwind-tables
 CFLAGS-usleep.c = -fexceptions
 CFLAGS-syslog.c = -fexceptions
 CFLAGS-error.c = -fexceptions
diff --git a/nptl/tst-cancel4.c b/nptl/tst-cancel4.c
index f3c4b0c..60f7ead 100644
--- a/nptl/tst-cancel4.c
+++ b/nptl/tst-cancel4.c
@@ -1600,6 +1600,52 @@ tf_preadv (void *arg)
 }
 
 static void *
+tf_pwritev (void *arg)
+{
+  int fd;
+  int r;
+
+  if (arg == NULL)
+    /* XXX If somebody can provide a portable test case in which pwritev
+       blocks we can enable this test to run in both rounds.  */
+    abort ();
+
+  char fname[] = "/tmp/tst-cancel4-fd-XXXXXX";
+  tempfd = fd = mkstemp (fname);
+  if (fd == -1)
+    printf ("%s: mkstemp failed\n", __FUNCTION__);
+  unlink (fname);
+
+  r = pthread_barrier_wait (&b2);
+  if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
+    {
+      printf ("%s: barrier_wait failed\n", __FUNCTION__);
+      exit (1);
+    }
+
+  r = pthread_barrier_wait (&b2);
+  if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
+    {
+      printf ("%s: barrier_wait failed\n", __FUNCTION__);
+      exit (1);
+    }
+
+  ssize_t s;
+  pthread_cleanup_push (cl, NULL);
+
+  char buf[WRITE_BUFFER_SIZE];
+  memset (buf, '\0', sizeof (buf));
+  struct iovec iov[1] = { [0] = { .iov_base = buf, .iov_len = sizeof (buf) } };
+  s = pwritev (fd, iov, 1, 0);
+
+  pthread_cleanup_pop (0);
+
+  printf ("%s: pwritev returns with %zd\n", __FUNCTION__, s);
+
+  exit (1);
+}
+
+static void *
 tf_fsync (void *arg)
 {
   if (arg == NULL)
@@ -2185,6 +2231,7 @@ static struct
   ADD_TEST (recvfrom, 2, 0),
   ADD_TEST (recvmsg, 2, 0),
   ADD_TEST (preadv, 2, 1),
+  ADD_TEST (pwritev, 2, 1),
   ADD_TEST (open, 2, 1),
   ADD_TEST (close, 2, 1),
   ADD_TEST (pread, 2, 1),
diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev.c
deleted file mode 100644
index 9ef11b5..0000000
--- a/sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Copyright (C) 2011-2016 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011.
-   Based on work contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library.  If not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <assert.h>
-#include <errno.h>
-#include <endian.h>
-#include <unistd.h>
-#include <sys/uio.h>
-
-#include <sysdep-cancel.h>
-#include <sys/syscall.h>
-
-ssize_t
-__libc_pwritev (int fd, const struct iovec *vector, int count, off_t offset)
-{
-  assert (sizeof (offset) == 4);
-  return SYSCALL_CANCEL (pwritev, fd, vector, count, __ALIGNMENT_ARG
-                         __LONG_LONG_PAIR (offset >> 31, offset));
-}
-strong_alias (__libc_pwritev, __pwritev)
-weak_alias (__libc_pwritev, pwritev)
diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev64.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev64.c
deleted file mode 100644
index 49b723d..0000000
--- a/sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev64.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Copyright (C) 2011-2016 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011.
-   Based on work contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library.  If not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <errno.h>
-#include <endian.h>
-#include <unistd.h>
-#include <sys/uio.h>
-
-#include <sysdep-cancel.h>
-#include <sys/syscall.h>
-
-ssize_t
-__libc_pwritev64 (int fd, const struct iovec *vector, int count,
-                  off64_t offset)
-{
-  return SYSCALL_CANCEL (pwritev, fd,
-                         vector, count, __ALIGNMENT_ARG
-                         __LONG_LONG_PAIR ((off_t) (offset >> 32),
-                                           (off_t) (offset & 0xffffffff)));
-}
-strong_alias (__libc_pwritev64, pwritev64)
-weak_alias (__libc_pwritev64, __pwritev64)
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/pwritev64.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/pwritev64.c
deleted file mode 100644
index 8b72a29..0000000
--- a/sysdeps/unix/sysv/linux/mips/mips64/n64/pwritev64.c
+++ /dev/null
@@ -1 +0,0 @@
-/* Empty since the pwritev syscall is equivalent.  */
diff --git a/sysdeps/unix/sysv/linux/pwritev.c b/sysdeps/unix/sysv/linux/pwritev.c
index e66f08e..b11606c 100644
--- a/sysdeps/unix/sysv/linux/pwritev.c
+++ b/sysdeps/unix/sysv/linux/pwritev.c
@@ -15,67 +15,40 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <errno.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <sys/param.h>
-#if __WORDSIZE == 64 && !defined PWRITEV
-/* Hide the pwritev64 declaration.  */
-# define pwritev64 __redirect_pwritev64
-#endif
 #include <sys/uio.h>
-
 #include <sysdep-cancel.h>
-#include <sys/syscall.h>
-#include <kernel-features.h>
 
+#if __WORDSIZE != 64 || defined (__ASSUME_OFF_DIFF_OFF64)
 
-#ifndef PWRITEV
-# define PWRITEV pwritev
-# define PWRITEV_REPLACEMENT __atomic_pwritev_replacement
-# define PWRITE __pwrite
-# define OFF_T off_t
-#endif
-
-#define LO_HI_LONG(val) \
-  (off_t) val,								\
-  (off_t) ((((uint64_t) (val)) >> (sizeof (long) * 4)) >> (sizeof (long) * 4))
-
-#ifndef __ASSUME_PWRITEV
-static ssize_t PWRITEV_REPLACEMENT (int, const struct iovec *,
-				    int, OFF_T) internal_function;
-#endif
+# ifdef __ASSUME_PREADV
 
+#  ifndef __NR_pwritev
+#   define __NR_pwritev __NR_pwritev64
+#  endif
 
 ssize_t
-PWRITEV (int fd, const struct iovec *vector, int count, OFF_T offset)
+pwritev (int fd, const struct iovec *vector, int count, off_t offset)
 {
-#ifdef __NR_pwritev
-  ssize_t result;
-
-  result = SYSCALL_CANCEL (pwritev, fd, vector, count, LO_HI_LONG (offset));
-
-# ifdef __ASSUME_PWRITEV
-  return result;
-# endif
-#endif
-
-#ifndef __ASSUME_PWRITEV
-# ifdef __NR_pwritev
+  return SYSCALL_CANCEL (pwritev, fd, vector, count,
+			 __ALIGNMENT_ARG SYSCALL_LL (offset));
+}
+# else
+static ssize_t __atomic_pwritev_replacement (int, const struct iovec *,
+					     int, off_t) internal_function;
+ssize_t
+pwritev (int fd, const struct iovec *vector, int count, off_t offset)
+{
+#  ifdef __NR_pwritev
+  ssize_t result = SYSCALL_CANCEL (pwritev, fd, vector, count,
+				   __ALIGNMENT_ARG SYSCALL_LL (offset));
   if (result >= 0 || errno != ENOSYS)
     return result;
-# endif
-
-  return PWRITEV_REPLACEMENT (fd, vector, count, offset);
-#endif
+#  endif
+  return __atomic_pwritev_replacement (fd, vector, count, offset);
 }
-#if __WORDSIZE == 64 && defined pwritev64
-# undef pwritev64
-strong_alias (pwritev, pwritev64)
-#endif
-
-#ifndef __ASSUME_PWRITEV
-# undef PWRITEV
-# define PWRITEV static internal_function PWRITEV_REPLACEMENT
-# include <sysdeps/posix/pwritev.c>
+#  define PWRITEV static internal_function __atomic_pwritev_replacement
+#  define PWRITE __pwrite
+#  define OFF_T off_t
+#  include <sysdeps/posix/pwritev.c>
+# endif /* __ASSUME_PREADV  */
 #endif
diff --git a/sysdeps/unix/sysv/linux/pwritev64.c b/sysdeps/unix/sysv/linux/pwritev64.c
index 1e8168f..bed79b7 100644
--- a/sysdeps/unix/sysv/linux/pwritev64.c
+++ b/sysdeps/unix/sysv/linux/pwritev64.c
@@ -1,6 +1,55 @@
-#define PWRITEV pwritev64
-#define PWRITEV_REPLACEMENT __atomic_pwritev64_replacement
-#define PWRITE __pwrite64
-#define OFF_T off64_t
+/* Copyright (C) 2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
 
-#include "pwritev.c"
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sys/uio.h>
+#include <sysdep-cancel.h>
+
+#ifdef __ASSUME_PWRITEV
+
+# ifndef __NR_pwritev64
+#  define __NR_pwritev64 __NR_pwritev
+# endif
+
+ssize_t
+pwritev64 (int fd, const struct iovec *vector, int count, off64_t offset)
+{
+  return SYSCALL_CANCEL (pwritev64, fd, vector, count,
+			 __ALIGNMENT_ARG SYSCALL_LL64 (offset));
+}
+#else
+static ssize_t __atomic_pwritev64_replacement (int, const struct iovec *,
+					       int, off64_t) internal_function;
+ssize_t
+pwritev64 (int fd, const struct iovec *vector, int count, off64_t offset)
+{
+#ifdef __NR_pwrite64v
+  ssize_t result = SYSCALL_CANCEL (pwritev64, fd, vector, count,
+				   __ALIGNMENT_ARG SYSCALL_LL64 (offset));
+  if (result >= 0 || errno != ENOSYS)
+    return result;
+#endif
+  return __atomic_pwritev64_replacement (fd, vector, count, offset);
+}
+# define PWRITEV static internal_function __atomic_pwritev64_replacement
+# define PWRITE __pwrite64
+# define OFF_T off64_t
+# include <sysdeps/posix/pwritev.c>
+#endif
+
+#if __WORDSIZE == 64 && !defined (__ASSUME_OFF_DIFF_OFF64)
+strong_alias (pwritev64, pwritev)
+#endif
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/pwritev.c b/sysdeps/unix/sysv/linux/wordsize-64/pwritev.c
deleted file mode 100644
index 1fa6eb3..0000000
--- a/sysdeps/unix/sysv/linux/wordsize-64/pwritev.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/* 64-bit pwritev.
-   Copyright (C) 2012-2016 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <errno.h>
-#include <stddef.h>
-#include <sys/param.h>
-/* Hide the pwritev64 declaration.  */
-#define pwritev64 __redirect_pwritev64
-#include <sys/uio.h>
-
-#include <sysdep-cancel.h>
-#include <sys/syscall.h>
-#include <kernel-features.h>
-
-#ifndef __ASSUME_PWRITEV
-static ssize_t __atomic_pwritev_replacement (int, const struct iovec *,
-					     int, off_t) internal_function;
-#endif
-
-ssize_t
-pwritev (int fd, const struct iovec *vector, int count, off_t offset)
-{
-#ifdef __NR_pwritev
-  ssize_t result;
-
-  result = SYSCALL_CANCEL (pwritev, fd, vector, count, offset);
-# ifdef __ASSUME_PWRITEV
-  return result;
-# endif
-#endif
-
-#ifndef __ASSUME_PWRITEV
-# ifdef __NR_pwritev
-  if (result >= 0 || errno != ENOSYS)
-    return result;
-# endif
-
-  return __atomic_pwritev_replacement (fd, vector, count, offset);
-#endif
-}
-#undef pwritev64
-strong_alias (pwritev, pwritev64)
-
-#ifndef __ASSUME_PWRITEV
-# define PWRITE __pwrite
-# define PWRITEV static internal_function __atomic_pwritev_replacement
-# define OFF_T off_t
-# include <sysdeps/posix/pwritev.c>
-#endif
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/pwritev64.c b/sysdeps/unix/sysv/linux/wordsize-64/pwritev64.c
deleted file mode 100644
index 8b72a29..0000000
--- a/sysdeps/unix/sysv/linux/wordsize-64/pwritev64.c
+++ /dev/null
@@ -1 +0,0 @@
-/* Empty since the pwritev syscall is equivalent.  */
diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list b/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list
index 58cd7fc..dce4302 100644
--- a/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list
@@ -4,5 +4,4 @@ fallocate	-	fallocate	Ci:iiii	fallocate	fallocate64
 gettimeofday	-	gettimeofday:__vdso_gettimeofday@LINUX_2.6	i:pP	__gettimeofday	gettimeofday
 personality	EXTRA	personality	Ei:i	__personality	personality
 posix_fadvise	-	fadvise64	Vi:iiii	posix_fadvise	posix_fadvise64
-pwritev		-	pwritev		Ci:ipii	pwritev		pwritev64
 time		-	time:__vdso_time@LINUX_2.6			Ei:P	time

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=4e7781517397b4eabbd012f161ee4bfd9bb734a9

commit 4e7781517397b4eabbd012f161ee4bfd9bb734a9
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Date:   Mon Apr 11 15:06:17 2016 -0300

    Consolidate preadv/preadv64 implementation
    
    This patch consolidates all the preadv{64} implementation for Linux
    in only one (sysdeps/unix/sysv/linux/preadv{64}.c).  It also removes the
    syscall from the auto-generation using assembly macros.
    
    It was based on previous pread/pread64 consolidation patch.  The new macro
    SYSCALL_LL{64} is used to handle the offset argument and alias is created
    for __ASSUME_OFF_DIFF_OFF64 in case of pread64.
    
    Checked on x86_64, i386, aarch64, and powerpc64le.
    
    	* misc/Makefile (CFLAGS-preadv.c): New variable: add cancellation
    	required flags.
    	(CFLAGS-preadv64.c): Likewise.
    	* sysdeps/unix/sysv/linux/generic/wordsize-32/preadv.c: Remove file.
    	* sysdeps/unix/sysv/linux/generic/wordsize-32/preadv64.c: Likewise.
    	* sysdeps/unix/sysv/linux/mips/mips64/n64/preadv64.c: Likewise.
    	* sysdeps/unix/sysv/linux/wordsize-64/preadv.c: Likewise.
    	* sysdeps/unix/sysv/linux/wordsize-64/preadv64.: Likwise.
    	* sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list (preadv): Remove
    	syscall from auto-generation.
    	* sysdeps/unix/sysv/linux/preadv.c: Rewrite implementation.
    	[WORDSIZE == 64] (preadv64): Remove macro.
    	[!PREADV] (PREADV): Likewise.
    	[!PREADV] (PREADV_REPLACEMENT): Likewise.
    	[!PREADV] (PREAD): Likewise.
    	[!PREADV] (OFF_T): Likewise.
    	[!__ASSUME_PREADV] (PREADV_REPLACEMENT): Likewise.
    	(LO_HI_LONG): Remove macro.
    	[__WORDSIZE != 64 || __ASSUME_OFF_DIFF_OFF64] (preadv): Add function.
    	* sysdeps/unix/sysv/linux/preadv64.c: Rewrite implementation.
    	(PREADV): Remove macro.
    	(PREADV_REPLACEMENTE): Likewise.
    	(PREAD): Likewise.
    	(OFF_T): Likewise.
    	(preadv64): New function.
    	* nptl/tst-cancel4.c (tf_preadv): Add test.

diff --git a/ChangeLog b/ChangeLog
index 9930b5e..b541737 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,32 @@
+2016-06-06  Adhemerval Zanella  <adhemerval.zanella@linaro.org>
+
+	* misc/Makefile (CFLAGS-preadv.c): New variable: add cancellation
+	required flags.
+	(CFLAGS-preadv64.c): Likewise.
+	* sysdeps/unix/sysv/linux/generic/wordsize-32/preadv.c: Remove file.
+	* sysdeps/unix/sysv/linux/generic/wordsize-32/preadv64.c: Likewise.
+	* sysdeps/unix/sysv/linux/mips/mips64/n64/preadv64.c: Likewise.
+	* sysdeps/unix/sysv/linux/wordsize-64/preadv.c: Likewise.
+	* sysdeps/unix/sysv/linux/wordsize-64/preadv64.: Likwise.
+	* sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list (preadv): Remove
+	syscall from auto-generation.
+	* sysdeps/unix/sysv/linux/preadv.c: Rewrite implementation.
+	[WORDSIZE == 64] (preadv64): Remove macro.
+	[!PREADV] (PREADV): Likewise.
+	[!PREADV] (PREADV_REPLACEMENT): Likewise.
+	[!PREADV] (PREAD): Likewise.
+	[!PREADV] (OFF_T): Likewise.
+	[!__ASSUME_PREADV] (PREADV_REPLACEMENT): Likewise.
+	(LO_HI_LONG): Remove macro.
+	[__WORDSIZE != 64 || __ASSUME_OFF_DIFF_OFF64] (preadv): Add function.
+	* sysdeps/unix/sysv/linux/preadv64.c: Rewrite implementation.
+	(PREADV): Remove macro.
+	(PREADV_REPLACEMENTE): Likewise.
+	(PREAD): Likewise.
+	(OFF_T): Likewise.
+	(preadv64): New function.
+	* nptl/tst-cancel4.c (tf_preadv): Add test.
+
 2016-06-06  Joseph Myers  <joseph@codesourcery.com>
 
 	[BZ #20212]
diff --git a/misc/Makefile b/misc/Makefile
index d7bbc85..658d4ba 100644
--- a/misc/Makefile
+++ b/misc/Makefile
@@ -88,6 +88,8 @@ CFLAGS-lsearch.c = $(uses-callbacks)
 CFLAGS-pselect.c = -fexceptions
 CFLAGS-readv.c = -fexceptions -fasynchronous-unwind-tables
 CFLAGS-writev.c = -fexceptions -fasynchronous-unwind-tables
+CFLAGS-preadv.c = -fexceptions -fasynchronous-unwind-tables
+CFLAGS-preadv64.c = -fexceptions -fasynchronous-unwind-tables
 CFLAGS-usleep.c = -fexceptions
 CFLAGS-syslog.c = -fexceptions
 CFLAGS-error.c = -fexceptions
diff --git a/nptl/tst-cancel4.c b/nptl/tst-cancel4.c
index 1478174..f3c4b0c 100644
--- a/nptl/tst-cancel4.c
+++ b/nptl/tst-cancel4.c
@@ -1554,6 +1554,50 @@ tf_pwrite (void *arg)
   exit (1);
 }
 
+static void *
+tf_preadv (void *arg)
+{
+  int fd;
+  int r;
+
+  if (arg == NULL)
+    /* XXX If somebody can provide a portable test case in which preadv
+       blocks we can enable this test to run in both rounds.  */
+    abort ();
+
+  char fname[] = "/tmp/tst-cancel4-fd-XXXXXX";
+  tempfd = fd = mkstemp (fname);
+  if (fd == -1)
+    printf ("%s: mkstemp failed\n", __FUNCTION__);
+  unlink (fname);
+
+  r = pthread_barrier_wait (&b2);
+  if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
+    {
+      printf ("%s: barrier_wait failed\n", __FUNCTION__);
+      exit (1);
+    }
+
+  r = pthread_barrier_wait (&b2);
+  if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
+    {
+      printf ("%s: barrier_wait failed\n", __FUNCTION__);
+      exit (1);
+    }
+
+  ssize_t s;
+  pthread_cleanup_push (cl, NULL);
+
+  char buf[100];
+  struct iovec iov[1] = { [0] = { .iov_base = buf, .iov_len = sizeof (buf) } };
+  s = preadv (fd, iov, 1, 0);
+
+  pthread_cleanup_pop (0);
+
+  printf ("%s: preadv returns with %zd\n", __FUNCTION__, s);
+
+  exit (1);
+}
 
 static void *
 tf_fsync (void *arg)
@@ -2140,6 +2184,7 @@ static struct
   ADD_TEST (recv, 2, 0),
   ADD_TEST (recvfrom, 2, 0),
   ADD_TEST (recvmsg, 2, 0),
+  ADD_TEST (preadv, 2, 1),
   ADD_TEST (open, 2, 1),
   ADD_TEST (close, 2, 1),
   ADD_TEST (pread, 2, 1),
diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/preadv.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/preadv.c
deleted file mode 100644
index ec30d4c..0000000
--- a/sysdeps/unix/sysv/linux/generic/wordsize-32/preadv.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Copyright (C) 2011-2016 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011.
-   Based on work contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library.  If not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <assert.h>
-#include <errno.h>
-#include <endian.h>
-#include <unistd.h>
-#include <sys/uio.h>
-
-#include <sysdep-cancel.h>
-#include <sys/syscall.h>
-
-ssize_t
-__libc_preadv (int fd, const struct iovec *vector, int count, off_t offset)
-{
-  assert (sizeof (offset) == 4);
-  return SYSCALL_CANCEL (preadv, fd,
-                         vector, count, __ALIGNMENT_ARG
-                         __LONG_LONG_PAIR (offset >> 31, offset));
-}
-strong_alias (__libc_preadv, __preadv)
-weak_alias (__libc_preadv, preadv)
diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/preadv64.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/preadv64.c
deleted file mode 100644
index fc008c6..0000000
--- a/sysdeps/unix/sysv/linux/generic/wordsize-32/preadv64.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Copyright (C) 2011-2016 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011.
-   Based on work contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library.  If not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <errno.h>
-#include <endian.h>
-#include <unistd.h>
-#include <sys/uio.h>
-
-#include <sysdep-cancel.h>
-#include <sys/syscall.h>
-
-ssize_t
-__libc_preadv64 (int fd, const struct iovec *vector, int count, off64_t offset)
-{
-  return SYSCALL_CANCEL (preadv, fd,
-                         vector, count, __ALIGNMENT_ARG
-                         __LONG_LONG_PAIR ((off_t) (offset >> 32),
-                                           (off_t) (offset & 0xffffffff)));
-}
-
-strong_alias (__libc_preadv64, __preadv64)
-weak_alias (__libc_preadv64, preadv64)
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/preadv64.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/preadv64.c
deleted file mode 100644
index fd9320c..0000000
--- a/sysdeps/unix/sysv/linux/mips/mips64/n64/preadv64.c
+++ /dev/null
@@ -1 +0,0 @@
-/* Empty since the preadv syscall is equivalent.  */
diff --git a/sysdeps/unix/sysv/linux/preadv.c b/sysdeps/unix/sysv/linux/preadv.c
index ca8da33..f6958c3 100644
--- a/sysdeps/unix/sysv/linux/preadv.c
+++ b/sysdeps/unix/sysv/linux/preadv.c
@@ -15,67 +15,40 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <errno.h>
-#include <stddef.h>
-#include <sys/param.h>
-#include <stdint.h>
-#if __WORDSIZE == 64
-/* Hide the preadv64 declaration.  */
-# define preadv64 __redirect_preadv64
-#endif
 #include <sys/uio.h>
-
 #include <sysdep-cancel.h>
-#include <sys/syscall.h>
-#include <kernel-features.h>
-
-
-#ifndef PREADV
-# define PREADV preadv
-# define PREADV_REPLACEMENT __atomic_preadv_replacement
-# define PREAD __pread
-# define OFF_T off_t
-#endif
 
-#define LO_HI_LONG(val) \
-  (off_t) val,								\
-  (off_t) ((((uint64_t) (val)) >> (sizeof (long) * 4)) >> (sizeof (long) * 4))
+#if __WORDSIZE != 64 || defined (__ASSUME_OFF_DIFF_OFF64)
 
-#ifndef __ASSUME_PREADV
-static ssize_t PREADV_REPLACEMENT (int, const struct iovec *,
-				   int, OFF_T) internal_function;
-#endif
+# ifdef __ASSUME_PREADV
 
+#  ifndef __NR_preadv
+#   define __NR_preadv __NR_preadv64
+#  endif
 
 ssize_t
-PREADV (int fd, const struct iovec *vector, int count, OFF_T offset)
+preadv (int fd, const struct iovec *vector, int count, off_t offset)
 {
-#ifdef __NR_preadv
-  ssize_t result;
-
-  result = SYSCALL_CANCEL (preadv, fd, vector, count, LO_HI_LONG (offset));
-
-# ifdef __ASSUME_PREADV
-  return result;
-# endif
-#endif
-
-#ifndef __ASSUME_PREADV
-# ifdef __NR_preadv
+  return SYSCALL_CANCEL (preadv, fd, vector, count,
+			 __ALIGNMENT_ARG SYSCALL_LL (offset));
+}
+# else
+static ssize_t __atomic_preadv_replacement (int, const struct iovec *,
+					    int, off_t) internal_function;
+ssize_t
+preadv (int fd, const struct iovec *vector, int count, off_t offset)
+{
+#  ifdef __NR_preadv
+  ssize_t result = SYSCALL_CANCEL (preadv, fd, vector, count,
+				   __ALIGNMENT_ARG SYSCALL_LL (offset));
   if (result >= 0 || errno != ENOSYS)
     return result;
-# endif
-
-  return PREADV_REPLACEMENT (fd, vector, count, offset);
-#endif
+#  endif
+  return __atomic_preadv_replacement (fd, vector, count, offset);
 }
-#if __WORDSIZE == 64
-# undef preadv64
-strong_alias (preadv, preadv64)
-#endif
-
-#ifndef __ASSUME_PREADV
-# undef PREADV
-# define PREADV static internal_function PREADV_REPLACEMENT
-# include <sysdeps/posix/preadv.c>
+#  define PREADV static internal_function __atomic_preadv_replacement
+#  define PREAD __pread
+#  define OFF_T off_t
+#  include <sysdeps/posix/preadv.c>
+# endif /* __ASSUME_PREADV  */
 #endif
diff --git a/sysdeps/unix/sysv/linux/preadv64.c b/sysdeps/unix/sysv/linux/preadv64.c
index 936ff14..18f5550 100644
--- a/sysdeps/unix/sysv/linux/preadv64.c
+++ b/sysdeps/unix/sysv/linux/preadv64.c
@@ -1,6 +1,55 @@
-#define PREADV preadv64
-#define PREADV_REPLACEMENT __atomic_preadv64_replacement
-#define PREAD __libc_pread64
-#define OFF_T off64_t
+/* Copyright (C) 2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
 
-#include "preadv.c"
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sys/uio.h>
+#include <sysdep-cancel.h>
+
+#ifdef __ASSUME_PREADV
+
+# ifndef __NR_preadv64
+#  define __NR_preadv64 __NR_preadv
+# endif
+
+ssize_t
+preadv64 (int fd, const struct iovec *vector, int count, off64_t offset)
+{
+  return SYSCALL_CANCEL (preadv64, fd, vector, count,
+			 __ALIGNMENT_ARG SYSCALL_LL64 (offset));
+}
+#else
+static ssize_t __atomic_preadv64_replacement (int, const struct iovec *,
+					      int, off64_t) internal_function;
+ssize_t
+preadv64 (int fd, const struct iovec *vector, int count, off64_t offset)
+{
+#ifdef __NR_preadv64
+  ssize_t result = SYSCALL_CANCEL (preadv64, fd, vector, count,
+				   __ALIGNMENT_ARG SYSCALL_LL64 (offset));
+  if (result >= 0 || errno != ENOSYS)
+    return result;
+#endif
+  return __atomic_preadv64_replacement (fd, vector, count, offset);
+}
+# define PREADV static internal_function __atomic_preadv64_replacement
+# define PREAD __pread64
+# define OFF_T off64_t
+# include <sysdeps/posix/preadv.c>
+#endif
+
+#if __WORDSIZE == 64 && !defined (__ASSUME_OFF_DIFF_OFF64)
+strong_alias (preadv64, preadv)
+#endif
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/preadv.c b/sysdeps/unix/sysv/linux/wordsize-64/preadv.c
deleted file mode 100644
index e2924ac..0000000
--- a/sysdeps/unix/sysv/linux/wordsize-64/preadv.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/* 64-bit preadv.
-   Copyright (C) 2012-2016 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <errno.h>
-#include <stddef.h>
-#include <sys/param.h>
-/* Hide the preadv64 declaration.  */
-#define preadv64 __redirect_preadv64
-#include <sys/uio.h>
-
-#include <sysdep-cancel.h>
-#include <sys/syscall.h>
-#include <kernel-features.h>
-
-#ifndef __ASSUME_PREADV
-static ssize_t __atomic_preadv_replacement (int, const struct iovec *,
-					    int, off_t) internal_function;
-#endif
-
-ssize_t
-preadv (int fd, const struct iovec *vector, int count, off_t offset)
-{
-#ifdef __NR_preadv
-  ssize_t result;
-
-  result = SYSCALL_CANCEL (preadv, fd, vector, count, offset);
-# ifdef __ASSUME_PREADV
-  return result;
-# endif
-#endif
-
-#ifndef __ASSUME_PREADV
-# ifdef __NR_preadv
-  if (result >= 0 || errno != ENOSYS)
-    return result;
-# endif
-
-  return __atomic_preadv_replacement (fd, vector, count, offset);
-#endif
-}
-#undef preadv64
-strong_alias (preadv, preadv64)
-
-#ifndef __ASSUME_PREADV
-# define PREADV static internal_function __atomic_preadv_replacement
-# define PREAD __pread
-# define OFF_T off_t
-# include <sysdeps/posix/preadv.c>
-#endif
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/preadv64.c b/sysdeps/unix/sysv/linux/wordsize-64/preadv64.c
deleted file mode 100644
index fd9320c..0000000
--- a/sysdeps/unix/sysv/linux/wordsize-64/preadv64.c
+++ /dev/null
@@ -1 +0,0 @@
-/* Empty since the preadv syscall is equivalent.  */
diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list b/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list
index c98ac74..58cd7fc 100644
--- a/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list
@@ -4,6 +4,5 @@ fallocate	-	fallocate	Ci:iiii	fallocate	fallocate64
 gettimeofday	-	gettimeofday:__vdso_gettimeofday@LINUX_2.6	i:pP	__gettimeofday	gettimeofday
 personality	EXTRA	personality	Ei:i	__personality	personality
 posix_fadvise	-	fadvise64	Vi:iiii	posix_fadvise	posix_fadvise64
-preadv		-	preadv		Ci:ipii	preadv		preadv64
 pwritev		-	pwritev		Ci:ipii	pwritev		pwritev64
 time		-	time:__vdso_time@LINUX_2.6			Ei:P	time

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                                          |   56 ++++++++++++
 misc/Makefile                                      |    4 +
 nptl/tst-cancel4.c                                 |   92 ++++++++++++++++++++
 .../unix/sysv/linux/generic/wordsize-32/preadv.c   |   38 --------
 .../unix/sysv/linux/generic/wordsize-32/preadv64.c |   38 --------
 .../unix/sysv/linux/generic/wordsize-32/pwritev.c  |   37 --------
 .../sysv/linux/generic/wordsize-32/pwritev64.c     |   38 --------
 sysdeps/unix/sysv/linux/mips/mips64/n64/preadv64.c |    1 -
 .../unix/sysv/linux/mips/mips64/n64/pwritev64.c    |    1 -
 sysdeps/unix/sysv/linux/preadv.c                   |   77 ++++++-----------
 sysdeps/unix/sysv/linux/preadv64.c                 |   59 ++++++++++++-
 sysdeps/unix/sysv/linux/pwritev.c                  |   77 ++++++-----------
 sysdeps/unix/sysv/linux/pwritev64.c                |   59 ++++++++++++-
 sysdeps/unix/sysv/linux/wordsize-64/preadv.c       |   64 --------------
 sysdeps/unix/sysv/linux/wordsize-64/preadv64.c     |    1 -
 sysdeps/unix/sysv/linux/wordsize-64/pwritev.c      |   64 --------------
 sysdeps/unix/sysv/linux/wordsize-64/pwritev64.c    |    1 -
 sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list   |    2 -
 18 files changed, 310 insertions(+), 399 deletions(-)
 delete mode 100644 sysdeps/unix/sysv/linux/generic/wordsize-32/preadv.c
 delete mode 100644 sysdeps/unix/sysv/linux/generic/wordsize-32/preadv64.c
 delete mode 100644 sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev.c
 delete mode 100644 sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev64.c
 delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n64/preadv64.c
 delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n64/pwritev64.c
 delete mode 100644 sysdeps/unix/sysv/linux/wordsize-64/preadv.c
 delete mode 100644 sysdeps/unix/sysv/linux/wordsize-64/preadv64.c
 delete mode 100644 sysdeps/unix/sysv/linux/wordsize-64/pwritev.c
 delete mode 100644 sysdeps/unix/sysv/linux/wordsize-64/pwritev64.c


hooks/post-receive
-- 
GNU C Library master sources


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]