]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commit - gdb/ser-unix.c
Fix inconsistent handling of EINTR in ser-*.c backends
authorPedro Alves <palves@redhat.com>
Tue, 12 Apr 2016 15:49:31 +0000 (16:49 +0100)
committerPedro Alves <palves@redhat.com>
Tue, 12 Apr 2016 15:57:33 +0000 (16:57 +0100)
commit75ee59252d49dffb017905125cdf826f89a6baf9
tree0b083ce32e0dd3fba3fe169f3fbc15a0232dde81
parent93692b589dc7017d5a2fbdffdfad5f84f597d8f1
Fix inconsistent handling of EINTR in ser-*.c backends

- If serial->write_prim returns EINTR, ser_bas_write returns it to the
  caller.  This just looks wrong to me -- part of the output may have
  already been sent, and there's no way for the caller to know that,
  and thus no way for a caller to handle a partial write correctly.

- While ser-unix.c:ser_unix_read_prim retries on EINTR,
  ser-tcp.c:net_read_prim does not.

This commit moves EINTR handling to the ser_base_write and
ser_base_readchar level, so all serial backends (at least those that
use it) end up handling EINTR consistently.

gdb/ChangeLog:
2016-04-12  Pedro Alves  <palves@redhat.com>

* ser-base.c (fd_event): Retry read_prim on EINTR.
(do_ser_base_readchar): Retry read_prim on EINTR.
(ser_base_write): Retry write_prim on EINTR.
* ser-unix.c (ser_unix_read_prim): Don't retry on EINTR here.
(ser_unix_write_prim): Remove comment.
gdb/ChangeLog
gdb/ser-base.c
gdb/ser-unix.c