folly: Symbolizer: don't allocate from function which is supposed to be signal safe
authorLucian Grijincu <lucian@fb.com>
Fri, 16 Oct 2015 02:17:30 +0000 (19:17 -0700)
committerfacebook-github-bot-4 <folly-bot@fb.com>
Fri, 16 Oct 2015 05:20:20 +0000 (22:20 -0700)
Reviewed By: @philippv, @dcolascione

Differential Revision: D2548023

fb-gh-sync-id: d2b0571d5db03e38ed17a5de6a13d2194a05b2b9

folly/experimental/symbolizer/Symbolizer.cpp
folly/experimental/symbolizer/Symbolizer.h

index f7e8e6025070a3c99f02b7e11785d25338644e08..cc98c12451b212b6b88e08bbd48022713677a4ee 100644 (file)
@@ -19,7 +19,6 @@
 #include <limits.h>
 #include <cstdio>
 #include <iostream>
-#include <map>
 
 #ifdef __GNUC__
 #include <ext/stdio_filebuf.h>
@@ -266,6 +265,8 @@ constexpr auto kFileColor = SymbolizePrinter::Color::DEFAULT;
 }  // namespace
 
 constexpr char AddressFormatter::bufTemplate[];
+constexpr std::array<const char*, SymbolizePrinter::Color::NUM>
+    SymbolizePrinter::kColorMap;
 
 AddressFormatter::AddressFormatter() {
   memcpy(buf_, bufTemplate, sizeof(buf_));
@@ -348,26 +349,14 @@ void SymbolizePrinter::print(uintptr_t address, const SymbolizedFrame& frame) {
 }
 
 void SymbolizePrinter::color(SymbolizePrinter::Color color) {
-  static const std::map<SymbolizePrinter::Color, std::string> kColorMap = {
-    { SymbolizePrinter::Color::DEFAULT,  "\x1B[0m" },
-    { SymbolizePrinter::Color::RED,  "\x1B[31m" },
-    { SymbolizePrinter::Color::GREEN,  "\x1B[32m" },
-    { SymbolizePrinter::Color::YELLOW,  "\x1B[33m" },
-    { SymbolizePrinter::Color::BLUE,  "\x1B[34m" },
-    { SymbolizePrinter::Color::CYAN,  "\x1B[36m" },
-    { SymbolizePrinter::Color::WHITE,  "\x1B[37m" },
-    { SymbolizePrinter::Color::PURPLE,  "\x1B[35m" },
-  };
-
   if ((options_ & COLOR) == 0 &&
       ((options_ & COLOR_IF_TTY) == 0 || !isTty_)) {
     return;
   }
-  auto it = kColorMap.find(color);
-  if (it == kColorMap.end()) {
+  if (color < 0 || color >= kColorMap.size()) {
     return;
   }
-  doPrint(it->second);
+  doPrint(kColorMap[color]);
 }
 
 void SymbolizePrinter::println(uintptr_t address,
index 4c30fa79b898df3e8b82e9365a38a48b362a9c4f..d8060330fb9559f27640adf893507fb2661ab8f0 100644 (file)
 #ifndef FOLLY_EXPERIMENTAL_SYMBOLIZER_SYMBOLIZER_H_
 #define FOLLY_EXPERIMENTAL_SYMBOLIZER_SYMBOLIZER_H_
 
+#include <array>
 #include <cstdint>
+#include <memory>
 #include <string>
-#include <unordered_map>
 
 #include <folly/FBString.h>
 #include <folly/Range.h>
@@ -39,14 +40,13 @@ class Symbolizer;
  * Frame information: symbol name and location.
  */
 struct SymbolizedFrame {
-  SymbolizedFrame() : found(false), name(nullptr) { }
+  SymbolizedFrame() { }
 
   void set(const std::shared_ptr<ElfFile>& file, uintptr_t address);
   void clear() { *this = SymbolizedFrame(); }
 
-  bool isSignalFrame;
-  bool found;
-  const char* name;
+  bool found = false;
+  const char* name = nullptr;
   Dwarf::LocationInfo location;
 
   /**
@@ -61,9 +61,9 @@ struct SymbolizedFrame {
 
 template <size_t N>
 struct FrameArray {
-  FrameArray() : frameCount(0) { }
+  FrameArray() { }
 
-  size_t frameCount;
+  size_t frameCount = 0;
   uintptr_t addresses[N];
   SymbolizedFrame frames[N];
 };
@@ -131,7 +131,7 @@ class Symbolizer {
   }
 
  private:
-  ElfCacheBase* cache_;
+  ElfCacheBase* const cache_ = nullptr;
 };
 
 /**
@@ -206,7 +206,8 @@ class SymbolizePrinter {
     COLOR_IF_TTY = 1 << 3,
   };
 
-  enum Color { DEFAULT, RED, GREEN, YELLOW, BLUE, CYAN, WHITE, PURPLE };
+  // NOTE: enum values used as indexes in kColorMap.
+  enum Color { DEFAULT, RED, GREEN, YELLOW, BLUE, CYAN, WHITE, PURPLE, NUM };
   void color(Color c);
 
  protected:
@@ -221,6 +222,17 @@ class SymbolizePrinter {
  private:
   void printTerse(uintptr_t address, const SymbolizedFrame& frame);
   virtual void doPrint(StringPiece sp) = 0;
+
+  static constexpr std::array<const char*, Color::NUM> kColorMap = {{
+      "\x1B[0m",
+      "\x1B[31m",
+      "\x1B[32m",
+      "\x1B[33m",
+      "\x1B[34m",
+      "\x1B[36m",
+      "\x1B[37m",
+      "\x1B[35m",
+  }};
 };
 
 /**
@@ -248,7 +260,7 @@ class FDSymbolizePrinter : public SymbolizePrinter {
  private:
   void doPrint(StringPiece sp) override;
 
-  int fd_;
+  const int fd_;
   std::unique_ptr<IOBuf> buffer_;
 };
 
@@ -261,7 +273,7 @@ class FILESymbolizePrinter : public SymbolizePrinter {
   explicit FILESymbolizePrinter(FILE* file, int options=0);
  private:
   void doPrint(StringPiece sp) override;
-  FILE* file_;
+  FILE* const file_ = nullptr;
 };
 
 /**