From 7c1e2f96cdf87592736091ca9ec164c7e9d08d6d Mon Sep 17 00:00:00 2001 From: Reid Spencer Date: Mon, 27 Dec 2004 06:17:50 +0000 Subject: [PATCH] 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 --- lib/System/Unix/Unix.h | 64 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 59 insertions(+), 5 deletions(-) diff --git a/lib/System/Unix/Unix.h b/lib/System/Unix/Unix.h index 71445094afd..6dc75545b66 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 #include #include #include #include -#include -#include -#include #include #include +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifdef HAVE_SYS_TYPES_H +#include +#endif + +#ifdef HAVE_SYS_PARAM_H +#include +#endif + +#ifdef HAVE_ASSERT_H +#include +#endif + +#ifdef TIME_WITH_SYS_TIME +# include +# include +#else +# ifdef HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif + +#ifdef HAVE_SYS_WAIT_H +# include +#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