forked from OSchip/llvm-project
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. llvm-svn: 19161
This commit is contained in:
parent
efda887fe2
commit
e925d8b8b2
|
@ -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
|
||||
//=== is guaranteed to work on all UNIX variants.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/Config/config.h" // Get autoconf configuration settings
|
||||
#include <unistd.h>
|
||||
#include <cstdlib>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <cerrno>
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#include <assert.h>
|
||||
#include <string>
|
||||
#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) {
|
||||
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