Line data Source code
1 : //===- llvm/Support/Errno.h - Portable+convenient errno handling -*- C++ -*-===//
2 : //
3 : // The LLVM Compiler Infrastructure
4 : //
5 : // This file is distributed under the University of Illinois Open Source
6 : // License. See LICENSE.TXT for details.
7 : //
8 : //===----------------------------------------------------------------------===//
9 : //
10 : // This file declares some portable and convenient functions to deal with errno.
11 : //
12 : //===----------------------------------------------------------------------===//
13 :
14 : #ifndef LLVM_SUPPORT_ERRNO_H
15 : #define LLVM_SUPPORT_ERRNO_H
16 :
17 : #include <cerrno>
18 : #include <string>
19 : #include <type_traits>
20 :
21 : namespace llvm {
22 : namespace sys {
23 :
24 : /// Returns a string representation of the errno value, using whatever
25 : /// thread-safe variant of strerror() is available. Be sure to call this
26 : /// immediately after the function that set errno, or errno may have been
27 : /// overwritten by an intervening call.
28 : std::string StrError();
29 :
30 : /// Like the no-argument version above, but uses \p errnum instead of errno.
31 : std::string StrError(int errnum);
32 :
33 : template <typename FailT, typename Fun, typename... Args>
34 17914242 : inline auto RetryAfterSignal(const FailT &Fail, const Fun &F,
35 : const Args &... As) -> decltype(F(As...)) {
36 : decltype(F(As...)) Res;
37 : do {
38 17914247 : errno = 0;
39 15680552 : Res = F(As...);
40 17914248 : } while (Res == Fail && errno == EINTR);
41 17914247 : return Res;
42 : }
43 :
44 : } // namespace sys
45 : } // namespace llvm
46 :
47 : #endif // LLVM_SYSTEM_ERRNO_H
|