16d528ed9Sopenharmony_ci// Copyright (c) 2012 The Chromium Authors. All rights reserved. 26d528ed9Sopenharmony_ci// Use of this source code is governed by a BSD-style license that can be 36d528ed9Sopenharmony_ci// found in the LICENSE file. 46d528ed9Sopenharmony_ci 56d528ed9Sopenharmony_ci// This provides a wrapper around system calls which may be interrupted by a 66d528ed9Sopenharmony_ci// signal and return EINTR. See man 7 signal. 76d528ed9Sopenharmony_ci// To prevent long-lasting loops (which would likely be a bug, such as a signal 86d528ed9Sopenharmony_ci// that should be masked) to go unnoticed, there is a limit after which the 96d528ed9Sopenharmony_ci// caller will nonetheless see an EINTR in Debug builds. 106d528ed9Sopenharmony_ci// 116d528ed9Sopenharmony_ci// On Windows and Fuchsia, this wrapper macro does nothing because there are no 126d528ed9Sopenharmony_ci// signals. 136d528ed9Sopenharmony_ci// 146d528ed9Sopenharmony_ci// Don't wrap close calls in HANDLE_EINTR. Use IGNORE_EINTR if the return 156d528ed9Sopenharmony_ci// value of close is significant. See http://crbug.com/269623. 166d528ed9Sopenharmony_ci 176d528ed9Sopenharmony_ci#ifndef BASE_POSIX_EINTR_WRAPPER_H_ 186d528ed9Sopenharmony_ci#define BASE_POSIX_EINTR_WRAPPER_H_ 196d528ed9Sopenharmony_ci 206d528ed9Sopenharmony_ci#include "util/build_config.h" 216d528ed9Sopenharmony_ci 226d528ed9Sopenharmony_ci#if defined(OS_POSIX) && !defined(OS_FUCHSIA) 236d528ed9Sopenharmony_ci 246d528ed9Sopenharmony_ci#include <errno.h> 256d528ed9Sopenharmony_ci 266d528ed9Sopenharmony_ci#if defined(NDEBUG) 276d528ed9Sopenharmony_ci 286d528ed9Sopenharmony_ci#define HANDLE_EINTR(x) \ 296d528ed9Sopenharmony_ci ({ \ 306d528ed9Sopenharmony_ci decltype(x) eintr_wrapper_result; \ 316d528ed9Sopenharmony_ci do { \ 326d528ed9Sopenharmony_ci eintr_wrapper_result = (x); \ 336d528ed9Sopenharmony_ci } while (eintr_wrapper_result == -1 && errno == EINTR); \ 346d528ed9Sopenharmony_ci eintr_wrapper_result; \ 356d528ed9Sopenharmony_ci }) 366d528ed9Sopenharmony_ci 376d528ed9Sopenharmony_ci#else 386d528ed9Sopenharmony_ci 396d528ed9Sopenharmony_ci#define HANDLE_EINTR(x) \ 406d528ed9Sopenharmony_ci ({ \ 416d528ed9Sopenharmony_ci int eintr_wrapper_counter = 0; \ 426d528ed9Sopenharmony_ci decltype(x) eintr_wrapper_result; \ 436d528ed9Sopenharmony_ci do { \ 446d528ed9Sopenharmony_ci eintr_wrapper_result = (x); \ 456d528ed9Sopenharmony_ci } while (eintr_wrapper_result == -1 && errno == EINTR && \ 466d528ed9Sopenharmony_ci eintr_wrapper_counter++ < 100); \ 476d528ed9Sopenharmony_ci eintr_wrapper_result; \ 486d528ed9Sopenharmony_ci }) 496d528ed9Sopenharmony_ci 506d528ed9Sopenharmony_ci#endif // NDEBUG 516d528ed9Sopenharmony_ci 526d528ed9Sopenharmony_ci#define IGNORE_EINTR(x) \ 536d528ed9Sopenharmony_ci ({ \ 546d528ed9Sopenharmony_ci decltype(x) eintr_wrapper_result; \ 556d528ed9Sopenharmony_ci do { \ 566d528ed9Sopenharmony_ci eintr_wrapper_result = (x); \ 576d528ed9Sopenharmony_ci if (eintr_wrapper_result == -1 && errno == EINTR) { \ 586d528ed9Sopenharmony_ci eintr_wrapper_result = 0; \ 596d528ed9Sopenharmony_ci } \ 606d528ed9Sopenharmony_ci } while (0); \ 616d528ed9Sopenharmony_ci eintr_wrapper_result; \ 626d528ed9Sopenharmony_ci }) 636d528ed9Sopenharmony_ci 646d528ed9Sopenharmony_ci#else // !OS_POSIX || OS_FUCHSIA 656d528ed9Sopenharmony_ci 666d528ed9Sopenharmony_ci#define HANDLE_EINTR(x) (x) 676d528ed9Sopenharmony_ci#define IGNORE_EINTR(x) (x) 686d528ed9Sopenharmony_ci 696d528ed9Sopenharmony_ci#endif // !OS_POSIX || OS_FUCHSIA 706d528ed9Sopenharmony_ci 716d528ed9Sopenharmony_ci#endif // BASE_POSIX_EINTR_WRAPPER_H_ 72