On 07.09.2020 16:06, Simon Marchi wrote: > On 2020-09-03 8:28 p.m., Kamil Rytarowski wrote: >> gdbsupport/ChangeLog: >> >> * eintr.h: New file. >> --- >> gdbsupport/ChangeLog | 4 ++++ >> gdbsupport/eintr.h | 41 +++++++++++++++++++++++++++++++++++++++++ >> 2 files changed, 45 insertions(+) >> create mode 100644 gdbsupport/eintr.h >> >> diff --git a/gdbsupport/ChangeLog b/gdbsupport/ChangeLog >> index a1960537384..d26000e36ac 100644 >> --- a/gdbsupport/ChangeLog >> +++ b/gdbsupport/ChangeLog >> @@ -1,3 +1,7 @@ >> +2020-09-04 Kamil Rytarowski >> + >> + * eintr.h: New file. >> + >> 2020-08-13 Simon Marchi >> >> * selftest.h (run_tests): Change parameter to array_view. >> diff --git a/gdbsupport/eintr.h b/gdbsupport/eintr.h >> new file mode 100644 >> index 00000000000..74b7038da60 >> --- /dev/null >> +++ b/gdbsupport/eintr.h >> @@ -0,0 +1,41 @@ >> +/* Utility for handling interrupted syscalls by signals. >> + >> + Copyright (C) 2020 Free Software Foundation, Inc. >> + >> + This file is part of GDB. >> + >> + This program is free software; you can redistribute it and/or modify >> + it under the terms of the GNU General Public License as published by >> + the Free Software Foundation; either version 3 of the License, or >> + (at your option) any later version. >> + >> + This program 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 General Public License for more details. >> + >> + You should have received a copy of the GNU General Public License >> + along with this program. If not, see . */ >> + >> +#ifndef GDBSUPPORT_EINTR_H >> +#define GDBSUPPORT_EINTR_H >> + >> +#include >> + >> +namespace gdb >> +{ >> +template >> +inline Ret handle_eintr (const Ret &R, const Fun &F, const Args &... A) >> +{ >> + Ret ret; >> + do >> + { >> + errno = 0; >> + ret = F (A...); >> + } >> + while (ret == R && errno == EINTR); >> + return ret; >> +} >> +} > > Can you document this function a little bit, including a usage example? I tried > to apply it in gdb/linux-nat.c, function async_file_mark, but I'm not sure I'm > doing it correctly. In particular, what should I pass as the `R` parameter? Does > that make sense? > I'm going to add an example and some documentation. > gdb::handle_eintr (-1, ::write, linux_nat_event_pipe[1], "+", 1); > gdb::handle_eintr (-1, ::write, linux_nat_event_pipe[1], "+", 1); > Simon >