gdb::handle_eintr, remove need to specify return type
authorPedro Alves <pedro@palves.net>
Tue, 8 Sep 2020 16:34:41 +0000 (17:34 +0100)
committerPedro Alves <pedro@palves.net>
Mon, 26 Oct 2020 18:57:40 +0000 (18:57 +0000)
This eliminates the need to specify the return type when using
handle_eintr.  We let the compiler deduce it for us.

Also, use lowercase for function parameter names.  Uppercase should
only be used on template parameters.

gdb/ChangeLog:

* nat/linux-waitpid.c: Include "gdbsupport/eintr.h".
(my_waitpid): Use gdb::handle_eintr.

gdbserver/ChangeLog:

* netbsd-low.cc (netbsd_waitpid, netbsd_process_target::kill)
(netbsd_qxfer_libraries_svr4): Use gdb::handle_eintr without
explicit type.

gdbsupport/ChangeLog:

* eintr.h (handle_eintr): Replace Ret template parameter with
ErrorValType.  Use it as type of the failure value.  Deduce the
function's return type using decltype.  Use lowercase for function
parameter names.

gdb/ChangeLog
gdb/nat/linux-waitpid.c
gdbserver/ChangeLog
gdbserver/netbsd-low.cc
gdbsupport/ChangeLog
gdbsupport/eintr.h

index d4d13c07b4c5fda253e88bb15da9e4a22bc72ee1..00920974c0b42520513bc700a17964d5124d83fa 100644 (file)
@@ -1,3 +1,8 @@
+2020-10-26  Pedro Alves  <pedro@palves.net>
+
+       * nat/linux-waitpid.c: Include "gdbsupport/eintr.h".
+       (my_waitpid): Use gdb::handle_eintr.
+
 2020-10-25  Simon Marchi  <simon.marchi@polymtl.ca>
 
        * acinclude.m4: Update ptrace.m4 path.
index f50e0c7bcff5575f0f5ed1ac63568efb1ce443d3..d066239220ab4c6ba173bd67906d1595d50ead4b 100644 (file)
@@ -22,6 +22,7 @@
 #include "linux-nat.h"
 #include "linux-waitpid.h"
 #include "gdbsupport/gdb_wait.h"
+#include "gdbsupport/eintr.h"
 
 /* Convert wait status STATUS to a string.  Used for printing debug
    messages only.  */
@@ -54,13 +55,5 @@ status_to_str (int status)
 int
 my_waitpid (int pid, int *status, int flags)
 {
-  int ret;
-
-  do
-    {
-      ret = waitpid (pid, status, flags);
-    }
-  while (ret == -1 && errno == EINTR);
-
-  return ret;
+  return gdb::handle_eintr (-1, ::waitpid, pid, status, flags);
 }
index a7eebfd7a712efe1ad8996ae96b1299acd4ebba8..0167163e4e3af48a0bbef1ed5690bc58ac737cd0 100644 (file)
@@ -1,3 +1,9 @@
+2020-10-26  Pedro Alves  <pedro@palves.net>
+
+       * netbsd-low.cc (netbsd_waitpid, netbsd_process_target::kill)
+       (netbsd_qxfer_libraries_svr4): Use gdb::handle_eintr without
+       explicit type.
+
 2020-10-25  Simon Marchi  <simon.marchi@polymtl.ca>
 
        * acinclude.m4: Update ptrace.m4 path.
index b9b8cafd94083e1eb37515d2fe9be4200fbe5ac5..af54041e7348be75ae5a9c5651169af449590b1d 100644 (file)
@@ -232,7 +232,7 @@ netbsd_waitpid (ptid_t ptid, struct target_waitstatus *ourstatus,
   int options = (target_options & TARGET_WNOHANG) ? WNOHANG : 0;
 
   pid_t pid
-    = gdb::handle_eintr<int> (-1, ::waitpid, ptid.pid (), &status, options);
+    = gdb::handle_eintr (-1, ::waitpid, ptid.pid (), &status, options);
 
   if (pid == -1)
     perror_with_name (_("Child process unexpectedly missing"));
@@ -443,7 +443,7 @@ netbsd_process_target::kill (process_info *process)
     return -1;
 
   int status;
-  if (gdb::handle_eintr<int> (-1, ::waitpid, pid, &status, 0) == -1)
+  if (gdb::handle_eintr (-1, ::waitpid, pid, &status, 0) == -1)
     return -1;
   mourn (process);
   return 0;
@@ -1136,15 +1136,15 @@ netbsd_qxfer_libraries_svr4 (const pid_t pid, const char *annex,
 static bool
 elf_64_file_p (const char *file)
 {
-  int fd = gdb::handle_eintr<int> (-1, ::open, file, O_RDONLY);
+  int fd = gdb::handle_eintr (-1, ::open, file, O_RDONLY);
   if (fd < 0)
     perror_with_name (("open"));
 
   Elf64_Ehdr header;
-  ssize_t ret = gdb::handle_eintr<ssize_t> (-1, ::read, fd, &header, sizeof (header));
+  ssize_t ret = gdb::handle_eintr (-1, ::read, fd, &header, sizeof (header));
   if (ret == -1)
     perror_with_name (("read"));
-  gdb::handle_eintr<int> (-1, ::close, fd);
+  gdb::handle_eintr (-1, ::close, fd);
   if (ret != sizeof (header))
     error ("Cannot read ELF file header: %s", file);
 
index 759eea1296b58a34c11230c658e26cf2236c767b..2b01a0ba8408bcced929066d1734343bbd231a7e 100644 (file)
@@ -1,3 +1,10 @@
+2020-10-26  Pedro Alves  <pedro@palves.net>
+
+       * eintr.h (handle_eintr): Replace Ret template parameter with
+       ErrorValType.  Use it as type of the failure value.  Deduce the
+       function's return type using decltype.  Use lowercase for function
+       parameter names.
+
 2020-10-25  Simon Marchi  <simon.marchi@polymtl.ca>
 
        * Makefile.in: Re-generate.
index 64ff5940b757126dce746af9b0db2f92a1e6457f..e09704718da9fc31d0c00c7c2a2c33f8c75f90b4 100644 (file)
@@ -43,25 +43,29 @@ namespace gdb
 
    You could wrap it by writing the wrapped form:
 
-   ssize_t ret = gdb::handle_eintr<ssize_t> (-1, ::write, pipe[1], "+", 1);
+   ssize_t ret = gdb::handle_eintr (-1, ::write, pipe[1], "+", 1);
 
-   The RET typename specifies the return type of the wrapped system call, which
-   is typically int or ssize_t.  The R argument specifies the failure value
-   indicating the interrupted syscall when calling the F function with
-   the A... arguments.  */
+   ERRVAL specifies the failure value indicating that the call to the
+   F function with ARGS... arguments was possibly interrupted with a
+   signal.  */
 
-template <typename Ret, typename Fun, typename... Args>
-inline Ret handle_eintr (const Ret &R, const Fun &F, const Args &... A)
+template<typename ErrorValType, typename Fun, typename... Args>
+inline auto
+handle_eintr (ErrorValType errval, const Fun &f, const Args &... args)
+  -> decltype (f (args...))
 {
-  Ret ret;
+  decltype (f (args...)) ret;
+
   do
     {
       errno = 0;
-      ret = F (A...);
+      ret = f (args...);
     }
-  while (ret == R && errno == EINTR);
+  while (ret == errval && errno == EINTR);
+
   return ret;
 }
-}
+
+} /* namespace gdb */
 
 #endif /* GDBSUPPORT_EINTR_H */
This page took 0.040561 seconds and 4 git commands to generate.