1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker // This provides a wrapper around system calls which may be interrupted by a 6*6777b538SAndroid Build Coastguard Worker // signal and return EINTR. See man 7 signal. 7*6777b538SAndroid Build Coastguard Worker // To prevent long-lasting loops (which would likely be a bug, such as a signal 8*6777b538SAndroid Build Coastguard Worker // that should be masked) to go unnoticed, there is a limit after which the 9*6777b538SAndroid Build Coastguard Worker // caller will nonetheless see an EINTR in Debug builds. 10*6777b538SAndroid Build Coastguard Worker // 11*6777b538SAndroid Build Coastguard Worker // On Windows and Fuchsia, this wrapper macro does nothing because there are no 12*6777b538SAndroid Build Coastguard Worker // signals. 13*6777b538SAndroid Build Coastguard Worker // 14*6777b538SAndroid Build Coastguard Worker // Don't wrap close calls in HANDLE_EINTR. Use IGNORE_EINTR if the return 15*6777b538SAndroid Build Coastguard Worker // value of close is significant. See http://crbug.com/269623. 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker #ifndef BASE_POSIX_EINTR_WRAPPER_H_ 18*6777b538SAndroid Build Coastguard Worker #define BASE_POSIX_EINTR_WRAPPER_H_ 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h" 21*6777b538SAndroid Build Coastguard Worker 22*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_POSIX) 23*6777b538SAndroid Build Coastguard Worker 24*6777b538SAndroid Build Coastguard Worker #include <errno.h> 25*6777b538SAndroid Build Coastguard Worker 26*6777b538SAndroid Build Coastguard Worker #if defined(NDEBUG) 27*6777b538SAndroid Build Coastguard Worker 28*6777b538SAndroid Build Coastguard Worker #define HANDLE_EINTR(x) ({ \ 29*6777b538SAndroid Build Coastguard Worker decltype(x) eintr_wrapper_result; \ 30*6777b538SAndroid Build Coastguard Worker do { \ 31*6777b538SAndroid Build Coastguard Worker eintr_wrapper_result = (x); \ 32*6777b538SAndroid Build Coastguard Worker } while (eintr_wrapper_result == -1 && errno == EINTR); \ 33*6777b538SAndroid Build Coastguard Worker eintr_wrapper_result; \ 34*6777b538SAndroid Build Coastguard Worker }) 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker #else 37*6777b538SAndroid Build Coastguard Worker 38*6777b538SAndroid Build Coastguard Worker #define HANDLE_EINTR(x) ({ \ 39*6777b538SAndroid Build Coastguard Worker int eintr_wrapper_counter = 0; \ 40*6777b538SAndroid Build Coastguard Worker decltype(x) eintr_wrapper_result; \ 41*6777b538SAndroid Build Coastguard Worker do { \ 42*6777b538SAndroid Build Coastguard Worker eintr_wrapper_result = (x); \ 43*6777b538SAndroid Build Coastguard Worker } while (eintr_wrapper_result == -1 && errno == EINTR && \ 44*6777b538SAndroid Build Coastguard Worker eintr_wrapper_counter++ < 100); \ 45*6777b538SAndroid Build Coastguard Worker eintr_wrapper_result; \ 46*6777b538SAndroid Build Coastguard Worker }) 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard Worker #endif // NDEBUG 49*6777b538SAndroid Build Coastguard Worker 50*6777b538SAndroid Build Coastguard Worker #define IGNORE_EINTR(x) ({ \ 51*6777b538SAndroid Build Coastguard Worker decltype(x) eintr_wrapper_result; \ 52*6777b538SAndroid Build Coastguard Worker do { \ 53*6777b538SAndroid Build Coastguard Worker eintr_wrapper_result = (x); \ 54*6777b538SAndroid Build Coastguard Worker if (eintr_wrapper_result == -1 && errno == EINTR) { \ 55*6777b538SAndroid Build Coastguard Worker eintr_wrapper_result = 0; \ 56*6777b538SAndroid Build Coastguard Worker } \ 57*6777b538SAndroid Build Coastguard Worker } while (0); \ 58*6777b538SAndroid Build Coastguard Worker eintr_wrapper_result; \ 59*6777b538SAndroid Build Coastguard Worker }) 60*6777b538SAndroid Build Coastguard Worker 61*6777b538SAndroid Build Coastguard Worker #else // !BUILDFLAG(IS_POSIX) 62*6777b538SAndroid Build Coastguard Worker 63*6777b538SAndroid Build Coastguard Worker #define HANDLE_EINTR(x) (x) 64*6777b538SAndroid Build Coastguard Worker #define IGNORE_EINTR(x) (x) 65*6777b538SAndroid Build Coastguard Worker 66*6777b538SAndroid Build Coastguard Worker #endif // !BUILDFLAG(IS_POSIX) 67*6777b538SAndroid Build Coastguard Worker 68*6777b538SAndroid Build Coastguard Worker #endif // BASE_POSIX_EINTR_WRAPPER_H_ 69