|  | //===- llvm/Support/Unix/Unix.h - Common Unix Include File -------*- C++ -*-===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // This file defines things specific to Unix implementations. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef LLVM_LIB_SUPPORT_UNIX_UNIX_H | 
|  | #define LLVM_LIB_SUPPORT_UNIX_UNIX_H | 
|  |  | 
|  | //===----------------------------------------------------------------------===// | 
|  | //=== WARNING: Implementation here must contain only generic UNIX code that | 
|  | //===          is guaranteed to work on all UNIX variants. | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "llvm/Config/config.h" // Get autoconf configuration settings | 
|  | #include "llvm/Support/Chrono.h" | 
|  | #include "llvm/Support/Errno.h" | 
|  | #include <algorithm> | 
|  | #include <assert.h> | 
|  | #include <cerrno> | 
|  | #include <cstdio> | 
|  | #include <cstdlib> | 
|  | #include <cstring> | 
|  | #include <string> | 
|  | #include <sys/types.h> | 
|  | #include <sys/wait.h> | 
|  |  | 
|  | #ifdef HAVE_UNISTD_H | 
|  | #include <unistd.h> | 
|  | #endif | 
|  |  | 
|  | #ifdef HAVE_SYS_PARAM_H | 
|  | #include <sys/param.h> | 
|  | #endif | 
|  |  | 
|  | #ifdef HAVE_SYS_TIME_H | 
|  | # include <sys/time.h> | 
|  | #endif | 
|  | #include <time.h> | 
|  |  | 
|  | #ifdef HAVE_DLFCN_H | 
|  | # include <dlfcn.h> | 
|  | #endif | 
|  |  | 
|  | #ifdef HAVE_FCNTL_H | 
|  | # include <fcntl.h> | 
|  | #endif | 
|  |  | 
|  | /// This function builds an error message into \p ErrMsg using the \p prefix | 
|  | /// string and the Unix error number given by \p errnum. If errnum is -1, the | 
|  | /// default then the value of errno is used. | 
|  | /// @brief Make an error message | 
|  | /// | 
|  | /// If the error number can be converted to a string, it will be | 
|  | /// separated from prefix by ": ". | 
|  | static inline bool MakeErrMsg( | 
|  | std::string* ErrMsg, const std::string& prefix, int errnum = -1) { | 
|  | if (!ErrMsg) | 
|  | return true; | 
|  | if (errnum == -1) | 
|  | errnum = errno; | 
|  | *ErrMsg = prefix + ": " + llvm::sys::StrError(errnum); | 
|  | return true; | 
|  | } | 
|  |  | 
|  | namespace llvm { | 
|  | namespace sys { | 
|  |  | 
|  | /// Convert a struct timeval to a duration. Note that timeval can be used both | 
|  | /// as a time point and a duration. Be sure to check what the input represents. | 
|  | inline std::chrono::microseconds toDuration(const struct timeval &TV) { | 
|  | return std::chrono::seconds(TV.tv_sec) + | 
|  | std::chrono::microseconds(TV.tv_usec); | 
|  | } | 
|  |  | 
|  | /// Convert a time point to struct timespec. | 
|  | inline struct timespec toTimeSpec(TimePoint<> TP) { | 
|  | using namespace std::chrono; | 
|  |  | 
|  | struct timespec RetVal; | 
|  | RetVal.tv_sec = toTimeT(TP); | 
|  | RetVal.tv_nsec = (TP.time_since_epoch() % seconds(1)).count(); | 
|  | return RetVal; | 
|  | } | 
|  |  | 
|  | /// Convert a time point to struct timeval. | 
|  | inline struct timeval toTimeVal(TimePoint<std::chrono::microseconds> TP) { | 
|  | using namespace std::chrono; | 
|  |  | 
|  | struct timeval RetVal; | 
|  | RetVal.tv_sec = toTimeT(TP); | 
|  | RetVal.tv_usec = (TP.time_since_epoch() % seconds(1)).count(); | 
|  | return RetVal; | 
|  | } | 
|  |  | 
|  | } // namespace sys | 
|  | } // namespace llvm | 
|  |  | 
|  | #endif |