• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef FLUTTER_FML_EINTR_WRAPPER_H_
6 #define FLUTTER_FML_EINTR_WRAPPER_H_
7 
8 #include "flutter/fml/build_config.h"
9 
10 #include <errno.h>
11 
12 #if defined(OS_WIN)
13 
14 // Windows has no concept of EINTR.
15 #define FML_HANDLE_EINTR(x) (x)
16 #define FML_IGNORE_EINTR(x) (x)
17 
18 #else
19 
20 #if defined(NDEBUG)
21 
22 #define FML_HANDLE_EINTR(x)                                 \
23   ({                                                        \
24     decltype(x) eintr_wrapper_result;                       \
25     do {                                                    \
26       eintr_wrapper_result = (x);                           \
27     } while (eintr_wrapper_result == -1 && errno == EINTR); \
28     eintr_wrapper_result;                                   \
29   })
30 
31 #else
32 
33 #define FML_HANDLE_EINTR(x)                                  \
34   ({                                                         \
35     int eintr_wrapper_counter = 0;                           \
36     decltype(x) eintr_wrapper_result;                        \
37     do {                                                     \
38       eintr_wrapper_result = (x);                            \
39     } while (eintr_wrapper_result == -1 && errno == EINTR && \
40              eintr_wrapper_counter++ < 100);                 \
41     eintr_wrapper_result;                                    \
42   })
43 
44 #endif  // NDEBUG
45 
46 #define FML_IGNORE_EINTR(x)                               \
47   ({                                                      \
48     decltype(x) eintr_wrapper_result;                     \
49     do {                                                  \
50       eintr_wrapper_result = (x);                         \
51       if (eintr_wrapper_result == -1 && errno == EINTR) { \
52         eintr_wrapper_result = 0;                         \
53       }                                                   \
54     } while (0);                                          \
55     eintr_wrapper_result;                                 \
56   })
57 
58 #endif  // defined(OS_WIN)
59 
60 #endif  // FLUTTER_FML_EINTR_WRAPPER_H_
61