Home | History | Annotate | Download | only in Support
      1 //===-- Process.cpp - Implement OS Process Concept --------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 //  This file implements the operating system Process concept.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "llvm/ADT/StringExtras.h"
     15 #include "llvm/Config/config.h"
     16 #include "llvm/Support/ErrorHandling.h"
     17 #include "llvm/Support/FileSystem.h"
     18 #include "llvm/Support/Process.h"
     19 #include "llvm/Support/Program.h"
     20 
     21 using namespace llvm;
     22 using namespace sys;
     23 
     24 //===----------------------------------------------------------------------===//
     25 //=== WARNING: Implementation here must contain only TRULY operating system
     26 //===          independent code.
     27 //===----------------------------------------------------------------------===//
     28 
     29 // Empty virtual destructor to anchor the vtable for the process class.
     30 process::~process() {}
     31 
     32 self_process *process::get_self() {
     33   // Use a function local static for thread safe initialization and allocate it
     34   // as a raw pointer to ensure it is never destroyed.
     35   static self_process *SP = new self_process();
     36 
     37   return SP;
     38 }
     39 
     40 // The destructor for the self_process subclass must never actually be
     41 // executed. There should be at most one instance of this class, and that
     42 // instance should live until the process terminates to avoid the potential for
     43 // racy accesses during shutdown.
     44 self_process::~self_process() {
     45   llvm_unreachable("This destructor must never be executed!");
     46 }
     47 
     48 /// \brief A helper function to compute the elapsed wall-time since the program
     49 /// started.
     50 ///
     51 /// Note that this routine actually computes the elapsed wall time since the
     52 /// first time it was called. However, we arrange to have it called during the
     53 /// startup of the process to get approximately correct results.
     54 static TimeValue getElapsedWallTime() {
     55   static TimeValue &StartTime = *new TimeValue(TimeValue::now());
     56   return TimeValue::now() - StartTime;
     57 }
     58 
     59 /// \brief A special global variable to ensure we call \c getElapsedWallTime
     60 /// during global initialization of the program.
     61 ///
     62 /// Note that this variable is never referenced elsewhere. Doing so could
     63 /// create race conditions during program startup or shutdown.
     64 static volatile TimeValue DummyTimeValue = getElapsedWallTime();
     65 
     66 // Implement this routine by using the static helpers above. They're already
     67 // portable.
     68 TimeValue self_process::get_wall_time() const {
     69   return getElapsedWallTime();
     70 }
     71 
     72 Optional<std::string> Process::FindInEnvPath(const std::string& EnvName,
     73                                              const std::string& FileName)
     74 {
     75   Optional<std::string> FoundPath;
     76   Optional<std::string> OptPath = Process::GetEnv(EnvName);
     77   if (!OptPath.hasValue())
     78     return FoundPath;
     79 
     80   const char EnvPathSeparatorStr[] = {EnvPathSeparator, '\0'};
     81   SmallVector<StringRef, 8> Dirs;
     82   SplitString(OptPath.getValue(), Dirs, EnvPathSeparatorStr);
     83 
     84   for (const auto &Dir : Dirs) {
     85     if (Dir.empty())
     86       continue;
     87 
     88     SmallString<128> FilePath(Dir);
     89     path::append(FilePath, FileName);
     90     if (fs::exists(Twine(FilePath))) {
     91       FoundPath = FilePath.str();
     92       break;
     93     }
     94   }
     95 
     96   return FoundPath;
     97 }
     98 
     99 
    100 #define COLOR(FGBG, CODE, BOLD) "\033[0;" BOLD FGBG CODE "m"
    101 
    102 #define ALLCOLORS(FGBG,BOLD) {\
    103     COLOR(FGBG, "0", BOLD),\
    104     COLOR(FGBG, "1", BOLD),\
    105     COLOR(FGBG, "2", BOLD),\
    106     COLOR(FGBG, "3", BOLD),\
    107     COLOR(FGBG, "4", BOLD),\
    108     COLOR(FGBG, "5", BOLD),\
    109     COLOR(FGBG, "6", BOLD),\
    110     COLOR(FGBG, "7", BOLD)\
    111   }
    112 
    113 static const char colorcodes[2][2][8][10] = {
    114  { ALLCOLORS("3",""), ALLCOLORS("3","1;") },
    115  { ALLCOLORS("4",""), ALLCOLORS("4","1;") }
    116 };
    117 
    118 // Include the platform-specific parts of this class.
    119 #ifdef LLVM_ON_UNIX
    120 #include "Unix/Process.inc"
    121 #endif
    122 #ifdef LLVM_ON_WIN32
    123 #include "Windows/Process.inc"
    124 #endif
    125