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.
This commit is contained in:
parent
55c3ad8801
commit
d744f0f965
@ -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.
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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.
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user