Home | History | Annotate | Download | only in Support
      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 inline auto RetryAfterSignal(const FailT &Fail, const Fun &F,
     35                              const Args &... As) -> decltype(F(As...)) {
     36   decltype(F(As...)) Res;
     37   do
     38     Res = F(As...);
     39   while (Res == Fail && errno == EINTR);
     40   return Res;
     41 }
     42 
     43 }  // namespace sys
     44 }  // namespace llvm
     45 
     46 #endif  // LLVM_SYSTEM_ERRNO_H
     47