mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-05 10:17:37 +00:00
For PR351:
* Ensure #includes are wrapped with appropriate HAVE_ guards * Account for variations in time.h and sys/time.h inclusion. * Add macros for getting wait(2) exit status correctly (per autoconf sugg.) * Implement ThrowErrno in terms of strerror_r, strerror or none based on what is available on the platform. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19161 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
51b9f62462
commit
7c1e2f96cd
@ -11,24 +11,78 @@
|
|||||||
//
|
//
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef LLVM_SYSTEM_UNIX_UNIX_H
|
||||||
|
#define LLVM_SYSTEM_UNIX_UNIX_H
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
//=== WARNING: Implementation here must contain only generic UNIX code that
|
//=== WARNING: Implementation here must contain only generic UNIX code that
|
||||||
//=== is guaranteed to work on all UNIX variants.
|
//=== is guaranteed to work on all UNIX variants.
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
#include "llvm/Config/config.h" // Get autoconf configuration settings
|
#include "llvm/Config/config.h" // Get autoconf configuration settings
|
||||||
#include <unistd.h>
|
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <cerrno>
|
#include <cerrno>
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_SYS_PARAM_H
|
||||||
|
#include <sys/param.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_ASSERT_H
|
||||||
|
#include <assert.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef TIME_WITH_SYS_TIME
|
||||||
|
# include <sys/time.h>
|
||||||
|
# include <time.h>
|
||||||
|
#else
|
||||||
|
# ifdef HAVE_SYS_TIME_H
|
||||||
|
# include <sys/time.h>
|
||||||
|
# else
|
||||||
|
# include <time.h>
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_SYS_WAIT_H
|
||||||
|
# include <sys/wait.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef WEXITSTATUS
|
||||||
|
# define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef WIFEXITED
|
||||||
|
# define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
|
||||||
|
#endif
|
||||||
|
|
||||||
inline void ThrowErrno(const std::string& prefix) {
|
inline void ThrowErrno(const std::string& prefix) {
|
||||||
char buffer[MAXPATHLEN];
|
char buffer[MAXPATHLEN];
|
||||||
throw prefix + ": " + strerror(errno);
|
#ifdef HAVE_STRERROR_R
|
||||||
|
// strerror_r is thread-safe.
|
||||||
|
strerror_r(errno,buffer,MAXPATHLEN-1);
|
||||||
|
#elif HAVE_STRERROR
|
||||||
|
// Copy the thread un-safe result of strerror into
|
||||||
|
// the buffer as fast as possible to minimize impact
|
||||||
|
// of collision of strerror in multiple threads.
|
||||||
|
strncpy(buffer,strerror(errno),MAXPATHLEN-1);
|
||||||
|
buffer[MAXPATHLEN-1] = 0;
|
||||||
|
#else
|
||||||
|
// Strange that this system doesn't even have strerror
|
||||||
|
// but, oh well, just use a generic message
|
||||||
|
sprintf(buffer, "Error #%d", errno);
|
||||||
|
#endif
|
||||||
|
throw prefix + ": " + buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user