From d744f0f9652ee8de839c09e4517b18c9b88aecb7 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Tue, 8 Sep 2020 17:34:41 +0100 Subject: [PATCH] gdb::handle_eintr, remove need to specify return type 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 | 5 +++++ gdb/nat/linux-waitpid.c | 11 ++--------- gdbserver/ChangeLog | 6 ++++++ gdbserver/netbsd-low.cc | 10 +++++----- gdbsupport/ChangeLog | 7 +++++++ gdbsupport/eintr.h | 26 +++++++++++++++----------- 6 files changed, 40 insertions(+), 25 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d4d13c07b4c..00920974c0b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2020-10-26 Pedro Alves + + * nat/linux-waitpid.c: Include "gdbsupport/eintr.h". + (my_waitpid): Use gdb::handle_eintr. + 2020-10-25 Simon Marchi * acinclude.m4: Update ptrace.m4 path. diff --git a/gdb/nat/linux-waitpid.c b/gdb/nat/linux-waitpid.c index f50e0c7bcff..d066239220a 100644 --- a/gdb/nat/linux-waitpid.c +++ b/gdb/nat/linux-waitpid.c @@ -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); } diff --git a/gdbserver/ChangeLog b/gdbserver/ChangeLog index a7eebfd7a71..0167163e4e3 100644 --- a/gdbserver/ChangeLog +++ b/gdbserver/ChangeLog @@ -1,3 +1,9 @@ +2020-10-26 Pedro Alves + + * 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 * acinclude.m4: Update ptrace.m4 path. diff --git a/gdbserver/netbsd-low.cc b/gdbserver/netbsd-low.cc index b9b8cafd940..af54041e734 100644 --- a/gdbserver/netbsd-low.cc +++ b/gdbserver/netbsd-low.cc @@ -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 (-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 (-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 (-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 (-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 (-1, ::close, fd); + gdb::handle_eintr (-1, ::close, fd); if (ret != sizeof (header)) error ("Cannot read ELF file header: %s", file); diff --git a/gdbsupport/ChangeLog b/gdbsupport/ChangeLog index 759eea1296b..2b01a0ba840 100644 --- a/gdbsupport/ChangeLog +++ b/gdbsupport/ChangeLog @@ -1,3 +1,10 @@ +2020-10-26 Pedro Alves + + * 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 * Makefile.in: Re-generate. diff --git a/gdbsupport/eintr.h b/gdbsupport/eintr.h index 64ff5940b75..e09704718da 100644 --- a/gdbsupport/eintr.h +++ b/gdbsupport/eintr.h @@ -43,25 +43,29 @@ namespace gdb You could wrap it by writing the wrapped form: - ssize_t ret = gdb::handle_eintr (-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 -inline Ret handle_eintr (const Ret &R, const Fun &F, const Args &... A) +template +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 */ -- 2.30.2