diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2021-02-16 20:13:02 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2021-02-16 20:13:02 +0000 |
| commit | b60736ec1405bb0a8dd40989f67ef4c93da068ab (patch) | |
| tree | 5c43fbb7c9fc45f0f87e0e6795a86267dbd12f9d /llvm/lib/Support/Unix | |
| parent | cfca06d7963fa0909f90483b42a6d7d194d01e08 (diff) | |
Diffstat (limited to 'llvm/lib/Support/Unix')
| -rw-r--r-- | llvm/lib/Support/Unix/Path.inc | 76 | ||||
| -rw-r--r-- | llvm/lib/Support/Unix/Process.inc | 6 | ||||
| -rw-r--r-- | llvm/lib/Support/Unix/Program.inc | 6 | ||||
| -rw-r--r-- | llvm/lib/Support/Unix/Signals.inc | 29 | ||||
| -rw-r--r-- | llvm/lib/Support/Unix/Threading.inc | 9 |
5 files changed, 105 insertions, 21 deletions
diff --git a/llvm/lib/Support/Unix/Path.inc b/llvm/lib/Support/Unix/Path.inc index d91b269cc6d3..77f3f54bd881 100644 --- a/llvm/lib/Support/Unix/Path.inc +++ b/llvm/lib/Support/Unix/Path.inc @@ -33,6 +33,7 @@ #include <dirent.h> #include <pwd.h> +#include <sys/file.h> #ifdef __APPLE__ #include <mach-o/dyld.h> @@ -146,6 +147,9 @@ test_dir(char ret[PATH_MAX], const char *dir, const char *bin) static char * getprogpath(char ret[PATH_MAX], const char *bin) { + if (bin == nullptr) + return nullptr; + /* First approach: absolute path. */ if (bin[0] == '/') { if (test_dir(ret, "/", bin) == 0) @@ -681,8 +685,6 @@ void expand_tilde(const Twine &path, SmallVectorImpl<char> &dest) { path.toVector(dest); expandTildeExpr(dest); - - return; } static file_type typeForMode(mode_t Mode) { @@ -791,6 +793,16 @@ std::error_code setLastAccessAndModificationTime(int FD, TimePoint<> AccessTime, if (::futimes(FD, Times)) return std::error_code(errno, std::generic_category()); return std::error_code(); +#elif defined(__MVS__) + attrib_t Attr; + memset(&Attr, 0, sizeof(Attr)); + Attr.att_atimechg = 1; + Attr.att_atime = sys::toTimeT(AccessTime); + Attr.att_mtimechg = 1; + Attr.att_mtime = sys::toTimeT(ModificationTime); + if (::__fchattr(FD, &Attr, sizeof(Attr)) != 0) + return std::error_code(errno, std::generic_category()); + return std::error_code(); #else #warning Missing futimes() and futimens() return make_error_code(errc::function_not_supported); @@ -1055,8 +1067,13 @@ file_t getStdoutHandle() { return 1; } file_t getStderrHandle() { return 2; } Expected<size_t> readNativeFile(file_t FD, MutableArrayRef<char> Buf) { +#if defined(__APPLE__) + size_t Size = std::min<size_t>(Buf.size(), INT32_MAX); +#else + size_t Size = Buf.size(); +#endif ssize_t NumRead = - sys::RetryAfterSignal(-1, ::read, FD, Buf.data(), Buf.size()); + sys::RetryAfterSignal(-1, ::read, FD, Buf.data(), Size); if (ssize_t(NumRead) == -1) return errorCodeToError(std::error_code(errno, std::generic_category())); return NumRead; @@ -1064,20 +1081,69 @@ Expected<size_t> readNativeFile(file_t FD, MutableArrayRef<char> Buf) { Expected<size_t> readNativeFileSlice(file_t FD, MutableArrayRef<char> Buf, uint64_t Offset) { +#if defined(__APPLE__) + size_t Size = std::min<size_t>(Buf.size(), INT32_MAX); +#else + size_t Size = Buf.size(); +#endif #ifdef HAVE_PREAD ssize_t NumRead = - sys::RetryAfterSignal(-1, ::pread, FD, Buf.data(), Buf.size(), Offset); + sys::RetryAfterSignal(-1, ::pread, FD, Buf.data(), Size, Offset); #else if (lseek(FD, Offset, SEEK_SET) == -1) return errorCodeToError(std::error_code(errno, std::generic_category())); ssize_t NumRead = - sys::RetryAfterSignal(-1, ::read, FD, Buf.data(), Buf.size()); + sys::RetryAfterSignal(-1, ::read, FD, Buf.data(), Size); #endif if (NumRead == -1) return errorCodeToError(std::error_code(errno, std::generic_category())); return NumRead; } +std::error_code tryLockFile(int FD, std::chrono::milliseconds Timeout) { + auto Start = std::chrono::steady_clock::now(); + auto End = Start + Timeout; + do { + struct flock Lock; + memset(&Lock, 0, sizeof(Lock)); + Lock.l_type = F_WRLCK; + Lock.l_whence = SEEK_SET; + Lock.l_start = 0; + Lock.l_len = 0; + if (::fcntl(FD, F_SETLK, &Lock) != -1) + return std::error_code(); + int Error = errno; + if (Error != EACCES && Error != EAGAIN) + return std::error_code(Error, std::generic_category()); + usleep(1000); + } while (std::chrono::steady_clock::now() < End); + return make_error_code(errc::no_lock_available); +} + +std::error_code lockFile(int FD) { + struct flock Lock; + memset(&Lock, 0, sizeof(Lock)); + Lock.l_type = F_WRLCK; + Lock.l_whence = SEEK_SET; + Lock.l_start = 0; + Lock.l_len = 0; + if (::fcntl(FD, F_SETLKW, &Lock) != -1) + return std::error_code(); + int Error = errno; + return std::error_code(Error, std::generic_category()); +} + +std::error_code unlockFile(int FD) { + struct flock Lock; + Lock.l_type = F_UNLCK; + Lock.l_whence = SEEK_SET; + Lock.l_start = 0; + Lock.l_len = 0; + if (::fcntl(FD, F_SETLK, &Lock) != -1) + return std::error_code(); + return std::error_code(errno, std::generic_category()); +} + std::error_code closeFile(file_t &F) { file_t TmpF = F; F = kInvalidFile; diff --git a/llvm/lib/Support/Unix/Process.inc b/llvm/lib/Support/Unix/Process.inc index 24f16b51af7b..7425d084da27 100644 --- a/llvm/lib/Support/Unix/Process.inc +++ b/llvm/lib/Support/Unix/Process.inc @@ -313,7 +313,7 @@ unsigned Process::StandardErrColumns() { return getColumns(); } -#ifdef HAVE_TERMINFO +#ifdef LLVM_ENABLE_TERMINFO // We manually declare these extern functions because finding the correct // headers from various terminfo, curses, or other sources is harder than // writing their specs down. @@ -323,12 +323,12 @@ extern "C" int del_curterm(struct term *termp); extern "C" int tigetnum(char *capname); #endif -#ifdef HAVE_TERMINFO +#ifdef LLVM_ENABLE_TERMINFO static ManagedStatic<std::mutex> TermColorMutex; #endif static bool terminalHasColors(int fd) { -#ifdef HAVE_TERMINFO +#ifdef LLVM_ENABLE_TERMINFO // First, acquire a global lock because these C routines are thread hostile. std::lock_guard<std::mutex> G(*TermColorMutex); diff --git a/llvm/lib/Support/Unix/Program.inc b/llvm/lib/Support/Unix/Program.inc index 8f41fc015163..fb56fa4b0d1d 100644 --- a/llvm/lib/Support/Unix/Program.inc +++ b/llvm/lib/Support/Unix/Program.inc @@ -174,7 +174,8 @@ toNullTerminatedCStringArray(ArrayRef<StringRef> Strings, StringSaver &Saver) { static bool Execute(ProcessInfo &PI, StringRef Program, ArrayRef<StringRef> Args, Optional<ArrayRef<StringRef>> Env, ArrayRef<Optional<StringRef>> Redirects, - unsigned MemoryLimit, std::string *ErrMsg) { + unsigned MemoryLimit, std::string *ErrMsg, + BitVector *AffinityMask) { if (!llvm::sys::fs::exists(Program)) { if (ErrMsg) *ErrMsg = std::string("Executable \"") + Program.str() + @@ -182,6 +183,9 @@ static bool Execute(ProcessInfo &PI, StringRef Program, return false; } + assert(!AffinityMask && "Starting a process with an affinity mask is " + "currently not supported on Unix!"); + BumpPtrAllocator Allocator; StringSaver Saver(Allocator); std::vector<const char *> ArgVector, EnvVector; diff --git a/llvm/lib/Support/Unix/Signals.inc b/llvm/lib/Support/Unix/Signals.inc index f68374d29f02..3d7b5d2fe5aa 100644 --- a/llvm/lib/Support/Unix/Signals.inc +++ b/llvm/lib/Support/Unix/Signals.inc @@ -36,6 +36,7 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/Config/config.h" #include "llvm/Demangle/Demangle.h" +#include "llvm/Support/ExitCodes.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/FileUtilities.h" #include "llvm/Support/Format.h" @@ -46,7 +47,6 @@ #include "llvm/Support/raw_ostream.h" #include <algorithm> #include <string> -#include <sysexits.h> #ifdef HAVE_BACKTRACE # include BACKTRACE_HEADER // For backtrace(). #endif @@ -331,7 +331,7 @@ static void RegisterHandlers() { // Not signal-safe. registerHandler(S, SignalKind::IsInfo); } -static void UnregisterHandlers() { +void sys::unregisterHandlers() { // Restore all of the signal handlers to how they were before we showed up. for (unsigned i = 0, e = NumRegisteredSignals.load(); i != e; ++i) { sigaction(RegisteredSignalInfo[i].SigNo, @@ -367,7 +367,7 @@ static RETSIGTYPE SignalHandler(int Sig) { // crashes when we return and the signal reissues. This also ensures that if // we crash in our signal handler that the program will terminate immediately // instead of recursing in the signal handler. - UnregisterHandlers(); + sys::unregisterHandlers(); // Unmask all potentially blocked kill signals. sigset_t SigMask; @@ -382,14 +382,15 @@ static RETSIGTYPE SignalHandler(int Sig) { OneShotPipeSignalFunction.exchange(nullptr)) return OldOneShotPipeFunction(); - if (std::find(std::begin(IntSigs), std::end(IntSigs), Sig) - != std::end(IntSigs)) { + bool IsIntSig = llvm::is_contained(IntSigs, Sig); + if (IsIntSig) if (auto OldInterruptFunction = InterruptFunction.exchange(nullptr)) return OldInterruptFunction(); - raise(Sig); // Execute the default handler. + if (Sig == SIGPIPE || IsIntSig) { + raise(Sig); // Execute the default handler. return; - } + } } // Otherwise if it is a fault (like SEGV) run any handler. @@ -554,7 +555,7 @@ static int unwindBacktrace(void **StackTrace, int MaxEntries) { // // On glibc systems we have the 'backtrace' function, which works nicely, but // doesn't demangle symbols. -void llvm::sys::PrintStackTrace(raw_ostream &OS) { +void llvm::sys::PrintStackTrace(raw_ostream &OS, int Depth) { #if ENABLE_BACKTRACES static void *StackTrace[256]; int depth = 0; @@ -571,9 +572,15 @@ void llvm::sys::PrintStackTrace(raw_ostream &OS) { #endif if (!depth) return; - - if (printSymbolizedStackTrace(Argv0, StackTrace, depth, OS)) + // If "Depth" is not provided by the caller, use the return value of + // backtrace() for printing a symbolized stack trace. + if (!Depth) + Depth = depth; + if (printSymbolizedStackTrace(Argv0, StackTrace, Depth, OS)) return; + OS << "Stack dump without symbol names (ensure you have llvm-symbolizer in " + "your PATH or set the environment var `LLVM_SYMBOLIZER_PATH` to point " + "to it):\n"; #if HAVE_DLFCN_H && HAVE_DLADDR int width = 0; for (int i = 0; i < depth; ++i) { @@ -615,7 +622,7 @@ void llvm::sys::PrintStackTrace(raw_ostream &OS) { OS << '\n'; } #elif defined(HAVE_BACKTRACE) - backtrace_symbols_fd(StackTrace, depth, STDERR_FILENO); + backtrace_symbols_fd(StackTrace, Depth, STDERR_FILENO); #endif #endif } diff --git a/llvm/lib/Support/Unix/Threading.inc b/llvm/lib/Support/Unix/Threading.inc index 2d0aacabf092..667d023fc134 100644 --- a/llvm/lib/Support/Unix/Threading.inc +++ b/llvm/lib/Support/Unix/Threading.inc @@ -28,6 +28,7 @@ #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) #include <errno.h> +#include <sys/cpuset.h> #include <sys/sysctl.h> #include <sys/user.h> #include <unistd.h> @@ -282,7 +283,13 @@ SetThreadPriorityResult llvm::set_thread_priority(ThreadPriority Priority) { #include <thread> int computeHostNumHardwareThreads() { -#ifdef __linux__ +#if defined(__FreeBSD__) + cpuset_t mask; + CPU_ZERO(&mask); + if (cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID, -1, sizeof(mask), + &mask) == 0) + return CPU_COUNT(&mask); +#elif defined(__linux__) cpu_set_t Set; if (sched_getaffinity(0, sizeof(Set), &Set) == 0) return CPU_COUNT(&Set); |
