Re: [PATCH v2 01/10] Add handle_eintr to wrap EINTR handling in syscalls

Kamil Rytarowski
2020-09-07T15:02:46Z

[-- Attachment #1.1: Type: text/plain, Size: 2772 bytes --]

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 <n54@gmx.com>
>> +
>> + * eintr.h: New file.
>> +
>> 2020-08-13 Simon Marchi <simon.marchi@polymtl.ca>
>>
>> * 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 <http://www.gnu.org/licenses/>. */
>> +
>> +#ifndef GDBSUPPORT_EINTR_H
>> +#define GDBSUPPORT_EINTR_H
>> +
>> +#include <cerrno>
>> +
>> +namespace gdb
>> +{
>> +template <typename Ret, typename Fun, typename... Args>
>> +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<ssize_t> (-1, ::write, linux_nat_event_pipe[1], "+", 1);

> Simon
>

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]