diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2004-12-27 06:17:50 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2004-12-27 06:17:50 +0000 |
commit | 7c1e2f96cdf87592736091ca9ec164c7e9d08d6d (patch) | |
tree | 4acec43a7625e24af6cea4f16aee471fc2920dfc /lib/System/Unix | |
parent | 51b9f62462f81dd380da0fdef98a218976931b53 (diff) | |
download | external_llvm-7c1e2f96cdf87592736091ca9ec164c7e9d08d6d.zip external_llvm-7c1e2f96cdf87592736091ca9ec164c7e9d08d6d.tar.gz external_llvm-7c1e2f96cdf87592736091ca9ec164c7e9d08d6d.tar.bz2 |
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
Diffstat (limited to 'lib/System/Unix')
-rw-r--r-- | lib/System/Unix/Unix.h | 62 |
1 files changed, 58 insertions, 4 deletions
diff --git a/lib/System/Unix/Unix.h b/lib/System/Unix/Unix.h index 7144509..6dc7554 100644 --- a/lib/System/Unix/Unix.h +++ b/lib/System/Unix/Unix.h @@ -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 <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> -#include <string> -#include <algorithm> +#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 |