mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
ff2168bb61
The difference from the previous version is the use of decltype, as the implementation of std::result_of in libc++ did not work correctly for variadic function like open(2). Original summary: This function retries an operation if it was interrupted by a signal (failed with EINTR). It's inspired by the TEMP_FAILURE_RETRY macro in glibc, but I've turned that into a template function. I've also added a fail-value argument, to enable the function to be used with e.g. fopen(3), which is documented to fail for any reason that open(2) can fail (which includes EINTR). The main user of this function will be lldb, but there were also a couple of uses within llvm that I could simplify using this function. Reviewers: zturner, silvas, joerg Subscribers: mgorny, llvm-commits Differential Revision: https://reviews.llvm.org/D33895 llvm-svn: 306671
47 lines
1.4 KiB
C++
47 lines
1.4 KiB
C++
//===- llvm/Support/Errno.h - Portable+convenient errno handling -*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file declares some portable and convenient functions to deal with errno.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_SUPPORT_ERRNO_H
|
|
#define LLVM_SUPPORT_ERRNO_H
|
|
|
|
#include <cerrno>
|
|
#include <string>
|
|
#include <type_traits>
|
|
|
|
namespace llvm {
|
|
namespace sys {
|
|
|
|
/// Returns a string representation of the errno value, using whatever
|
|
/// thread-safe variant of strerror() is available. Be sure to call this
|
|
/// immediately after the function that set errno, or errno may have been
|
|
/// overwritten by an intervening call.
|
|
std::string StrError();
|
|
|
|
/// Like the no-argument version above, but uses \p errnum instead of errno.
|
|
std::string StrError(int errnum);
|
|
|
|
template <typename FailT, typename Fun, typename... Args>
|
|
inline auto RetryAfterSignal(const FailT &Fail, const Fun &F,
|
|
const Args &... As) -> decltype(F(As...)) {
|
|
decltype(F(As...)) Res;
|
|
do
|
|
Res = F(As...);
|
|
while (Res == Fail && errno == EINTR);
|
|
return Res;
|
|
}
|
|
|
|
} // namespace sys
|
|
} // namespace llvm
|
|
|
|
#endif // LLVM_SYSTEM_ERRNO_H
|