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 | |