Index: base/posix/eintr_wrapper.h |
diff --git a/base/posix/eintr_wrapper.h b/base/posix/eintr_wrapper.h |
index 8e26752337066162e14f0c65a1a06f41985d619f..854c43a67cba848f418cb4a3ad901393590b1d7b 100644 |
--- a/base/posix/eintr_wrapper.h |
+++ b/base/posix/eintr_wrapper.h |
@@ -9,6 +9,9 @@ |
// caller will nonetheless see an EINTR in Debug builds. |
// |
// On Windows, this wrapper macro does nothing. |
+// |
+// Don't wrap close calls in HANDLE_EINTR. Use IGNORE_EINTR if the return |
+// value of close is significant. See http://crbug.com/269623. |
#ifndef BASE_POSIX_EINTR_WRAPPER_H_ |
#define BASE_POSIX_EINTR_WRAPPER_H_ |
@@ -20,6 +23,7 @@ |
#include <errno.h> |
#if defined(NDEBUG) |
+ |
#define HANDLE_EINTR(x) ({ \ |
typeof(x) eintr_wrapper_result; \ |
do { \ |
@@ -42,9 +46,21 @@ |
#endif // NDEBUG |
+#define IGNORE_EINTR(x) ({ \ |
+ typeof(x) eintr_wrapper_result; \ |
+ do { \ |
+ eintr_wrapper_result = (x); \ |
+ if (eintr_wrapper_result == -1 && errno == EINTR) { \ |
+ eintr_wrapper_result = 0; \ |
+ } \ |
+ } while (0); \ |
+ eintr_wrapper_result; \ |
+}) |
+ |
#else |
#define HANDLE_EINTR(x) (x) |
+#define IGNORE_EINTR(x) (x) |
#endif // OS_POSIX |