* [tig PATCH] continue updates when pipe read has errno "Success"
@ 2008-08-21 1:40 Jeff King
2008-08-22 10:10 ` Jonas Fonseca
0 siblings, 1 reply; 3+ messages in thread
From: Jeff King @ 2008-08-21 1:40 UTC (permalink / raw)
To: Jonas Fonseca; +Cc: git
When we are reading from a pipe and receive a signal, our
read call fails and ferror() returns true. The current
behavior is to call end_update and report failure. However,
we can detect this situation by checking that errno is set
to success and continue the reading process.
You can provoke this behavior by running a "tig blame" that
takes a few seconds and then resizing the terminal that tig
is running in (you should get an incomplete blame output and
the error "Failed to read: Success").
Signed-off-by: Jeff King <peff@peff.net>
---
I am not convinced this is the right solution. Specifically:
- there are a few other calls to ferror. Maybe they should be
converted, too, which implies that perhaps there is a better idiom
for checking this.
- I have no idea how portable this is. Do all stdio implementations
fail to restart on signal? Do they all set ferror and have errno ==
0 (I would have expected EINTR, or at the very least a 0-read
without ferror set)?
But it works for me (Linux, glibc 2.7).
tig.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/tig.c b/tig.c
index 6b111e4..8362ecf 100644
--- a/tig.c
+++ b/tig.c
@@ -2392,7 +2392,7 @@ update_view(struct view *view)
update_view_title(view);
check_pipe:
- if (ferror(view->pipe)) {
+ if (ferror(view->pipe) && errno != 0) {
report("Failed to read: %s", strerror(errno));
end_update(view, TRUE);
--
1.6.0.98.g0d3cc
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [tig PATCH] continue updates when pipe read has errno "Success"
2008-08-21 1:40 [tig PATCH] continue updates when pipe read has errno "Success" Jeff King
@ 2008-08-22 10:10 ` Jonas Fonseca
2008-08-22 15:59 ` Jeff King
0 siblings, 1 reply; 3+ messages in thread
From: Jonas Fonseca @ 2008-08-22 10:10 UTC (permalink / raw)
To: Jeff King; +Cc: git
On Thu, Aug 21, 2008 at 03:40, Jeff King <peff@peff.net> wrote:
> When we are reading from a pipe and receive a signal, our
> read call fails and ferror() returns true. The current
> behavior is to call end_update and report failure. However,
> we can detect this situation by checking that errno is set
> to success and continue the reading process.
Thanks for the fix/workaround!
> I am not convinced this is the right solution. Specifically:
>
> - there are a few other calls to ferror. Maybe they should be
> converted, too, which implies that perhaps there is a better idiom
> for checking this.
Well, perhaps something like this can work around the issue for tig-0.12:
bool check_ferror(FILE *file) { return ferror(file) && errno != 0; }
For a possible "better" fix, I have been working on moving tig to use
the run-command.[ch] code from git, which means that ferror() will no
longer be needed. It is still not ready but looks promising.
> - I have no idea how portable this is. Do all stdio implementations
> fail to restart on signal? Do they all set ferror and have errno ==
> 0 (I would have expected EINTR, or at the very least a 0-read
> without ferror set)?
>
> But it works for me (Linux, glibc 2.7).
I have tested it on FreeBSD which doesn't seem to have this problem
with ferror(). Anyway, the workaround doesn't break anything so
applied.
--
Jonas Fonseca
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [tig PATCH] continue updates when pipe read has errno "Success"
2008-08-22 10:10 ` Jonas Fonseca
@ 2008-08-22 15:59 ` Jeff King
0 siblings, 0 replies; 3+ messages in thread
From: Jeff King @ 2008-08-22 15:59 UTC (permalink / raw)
To: Jonas Fonseca; +Cc: git
On Fri, Aug 22, 2008 at 12:10:35PM +0200, Jonas Fonseca wrote:
> Thanks for the fix/workaround!
Thank you for making tig. ;)
> For a possible "better" fix, I have been working on moving tig to use
> the run-command.[ch] code from git, which means that ferror() will no
> longer be needed. It is still not ready but looks promising.
I think that would be much cleaner, as the semantics of system calls and
signals tend to be better defined.
-Peff
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2008-08-22 16:00 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-08-21 1:40 [tig PATCH] continue updates when pipe read has errno "Success" Jeff King
2008-08-22 10:10 ` Jonas Fonseca
2008-08-22 15:59 ` Jeff King
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).