From 7934a799e1041db9cff9753f4d87d7361f644450 Mon Sep 17 00:00:00 2001 From: David 'Digit' Turner Date: Fri, 16 Oct 2009 12:13:34 -0700 Subject: [PATCH] Prevent spurious EINTR to freeze process debugging --- linker/debugger.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/linker/debugger.c b/linker/debugger.c index 5bb065c6c..1bd3cc8cd 100644 --- a/linker/debugger.c +++ b/linker/debugger.c @@ -32,6 +32,7 @@ #include #include #include +#include #include "linker.h" @@ -40,6 +41,11 @@ void notify_gdb_of_libraries(); +#define RETRY_ON_EINTR(ret,cond) \ + do { \ + ret = (cond); \ + } while (ret < 0 && errno == EINTR) + void debugger_signal_handler(int n) { unsigned tid; @@ -58,10 +64,15 @@ void debugger_signal_handler(int n) * is paranoid and will verify that we are giving a tid * that's actually in our process */ - write(s, &tid, sizeof(unsigned)); + int ret; - read(s, &tid, 1); - notify_gdb_of_libraries(); + RETRY_ON_EINTR(ret, write(s, &tid, sizeof(unsigned))); + if (ret == sizeof(unsigned)) { + /* if the write failed, there is no point to read on + * the file descriptor. */ + RETRY_ON_EINTR(ret, read(s, &tid, 1)); + notify_gdb_of_libraries(); + } close(s); }