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