eintr_wrapper.h (2333B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 4 // Use of this source code is governed by a BSD-style license that can be 5 // found in the LICENSE file. 6 7 // This provides a wrapper around system calls which may be interrupted by a 8 // signal and return EINTR. See man 7 signal. 9 // 10 // On Windows, this wrapper macro does nothing because there are no 11 // signals. 12 // 13 // Don't wrap close calls in HANDLE_EINTR. Use IGNORE_EINTR if the return 14 // value of close is significant. See http://crbug.com/269623. 15 16 #ifndef BASE_EINTR_WRAPPER_H_ 17 #define BASE_EINTR_WRAPPER_H_ 18 19 #if defined(XP_UNIX) 20 21 # include <errno.h> 22 23 # define HANDLE_EINTR(x) \ 24 ({ \ 25 decltype(x) eintr_wrapper_result; \ 26 do { \ 27 eintr_wrapper_result = (x); \ 28 } while (eintr_wrapper_result == -1 && errno == EINTR); \ 29 eintr_wrapper_result; \ 30 }) 31 32 # define IGNORE_EINTR(x) \ 33 ({ \ 34 decltype(x) eintr_wrapper_result; \ 35 do { \ 36 eintr_wrapper_result = (x); \ 37 if (eintr_wrapper_result == -1 && errno == EINTR) { \ 38 eintr_wrapper_result = 0; \ 39 } \ 40 } while (0); \ 41 eintr_wrapper_result; \ 42 }) 43 44 # define HANDLE_RV_EINTR(x) \ 45 ({ \ 46 decltype(x) eintr_wrapper_result; \ 47 do { \ 48 eintr_wrapper_result = (x); \ 49 } while (eintr_wrapper_result == EINTR); \ 50 eintr_wrapper_result; \ 51 }) 52 53 #else 54 55 # define HANDLE_EINTR(x) (x) 56 # define IGNORE_EINTR(x) (x) 57 # define HANDLE_RV_EINTR(x) (x) 58 59 #endif // XP_UNIX 60 61 #endif // !BASE_EINTR_WRAPPER_H_