Exemplo n.º 1
0
    std::string demangle(TypeDescriptor const & type)
      {
      int status{};
      auto demangled = std::unique_ptr<char, void(*)(void *)>{
        abi::__cxa_demangle(type.name(), nullptr, nullptr, &status),
        std::free
        };

      if(status)
        {
        return type.name();
        }

      return demangled.get();
      }
Exemplo n.º 2
0
[[noreturn]] void singletonThrowGetInvokedAfterDestruction(
    const TypeDescriptor& type) {
  throw std::runtime_error(
      "Raw pointer to a singleton requested after its destruction."
      " Singleton type is: " +
      type.name());
}
Exemplo n.º 3
0
[[noreturn]] void singletonWarnLeakyInstantiatingNotRegisteredAndAbort(
    const TypeDescriptor& type) {
  auto trace = detail::getSingletonStackTrace();
  LOG(FATAL) << "Creating instance for unregistered singleton: " << type.name()
             << "\n"
             << "Stacktrace:\n" << (trace != "" ? trace : "(not available)");
}
Exemplo n.º 4
0
[[noreturn]] void singletonWarnLeakyInstantiatingNotRegisteredAndAbort(
    const TypeDescriptor& type) {
  auto ptr = SingletonVault::stackTraceGetter().load();
  LOG(FATAL) << "Creating instance for unregistered singleton: "
             << type.name() << "\n"
             << "Stacktrace:"
             << "\n" << (ptr ? (*ptr)() : "(not available)");
}
Exemplo n.º 5
0
[[noreturn]] void singletonWarnLeakyDoubleRegistrationAndAbort(
    const TypeDescriptor& type) {
  // Ensure the availability of std::cerr
  std::ios_base::Init ioInit;
  std::cerr << "Double registration of singletons of the same "
               "underlying type; check for multiple definitions "
               "of type folly::LeakySingleton<"
            << type.name() << ">\n";
  std::abort();
}
Exemplo n.º 6
0
[[noreturn]] void singletonWarnCreateBeforeRegistrationCompleteAndAbort(
    const TypeDescriptor& type) {
  auto trace = detail::getSingletonStackTrace();
  LOG(FATAL) << "Singleton " << type.name() << " requested before "
             << "registrationComplete() call.\n"
             << "This usually means that either main() never called "
             << "folly::init, or singleton was requested before main() "
             << "(which is not allowed).\n"
             << "Stacktrace:\n" << (trace != "" ? trace : "(not available)");
}
Exemplo n.º 7
0
void singletonWarnDestroyInstanceLeak(
    const TypeDescriptor& type,
    const void* ptr) {
  LOG(ERROR) << "Singleton of type " << type.name() << " has a "
             << "living reference at destroyInstances time; beware! Raw "
             << "pointer is " << ptr << ". It is very likely "
             << "that some other singleton is holding a shared_ptr to it. "
             << "This singleton will be leaked (even if a shared_ptr to it "
             << "is eventually released)."
             << "Make sure dependencies between these singletons are "
             << "properly defined.";
}
Exemplo n.º 8
0
void singletonPrintDestructionStackTrace(const TypeDescriptor& type) {
  std::string output = "Singleton " + type.name() + " was released.\n";

  auto stack_trace_getter = SingletonVault::stackTraceGetter().load();
  auto stack_trace = stack_trace_getter ? stack_trace_getter() : "";
  if (stack_trace.empty()) {
    output += "Failed to get release stack trace.";
  } else {
    output += "Release stack trace:\n";
    output += stack_trace;
  }

  LOG(ERROR) << output;
}
Exemplo n.º 9
0
[[noreturn]] void singletonWarnCreateBeforeRegistrationCompleteAndAbort(
    const TypeDescriptor& type) {
  auto stack_trace_getter = SingletonVault::stackTraceGetter().load();
  auto stack_trace = stack_trace_getter ? stack_trace_getter() : "";
  if (!stack_trace.empty()) {
    stack_trace = "Stack trace:\n" + stack_trace;
  }

  LOG(FATAL) << "Singleton " << type.name() << " requested before "
             << "registrationComplete() call.\n"
             << "This usually means that either main() never called "
             << "folly::init, or singleton was requested before main() "
             << "(which is not allowed).\n"
             << stack_trace;
}
Exemplo n.º 10
0
[[noreturn]] void singletonWarnCreateCircularDependencyAndAbort(
    const TypeDescriptor& type) {
  LOG(FATAL) << "circular singleton dependency: " << type.name();
}
Exemplo n.º 11
0
[[noreturn]] void singletonWarnRegisterMockEarlyAndAbort(
    const TypeDescriptor& type) {
  LOG(FATAL) << "Registering mock before singleton was registered: "
             << type.name();
}
Exemplo n.º 12
0
void singletonPrintDestructionStackTrace(const TypeDescriptor& type) {
  auto trace = detail::getSingletonStackTrace();
  LOG(ERROR) << "Singleton " << type.name() << " was released.\n"
             << "Stacktrace:\n" << (trace != "" ? trace : "(not available)");
}