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