CMS 3D CMS Logo

List of all members | Classes | Public Member Functions | Static Public Member Functions | Static Public Attributes | Private Member Functions | Static Private Member Functions | Private Attributes | Static Private Attributes | Friends
edm::service::InitRootHandlers Class Reference
Inheritance diagram for edm::service::InitRootHandlers:
edm::RootHandlers

Classes

class  ThreadTracker
 

Public Member Functions

 InitRootHandlers (ParameterSet const &pset, ActivityRegistry &iReg)
 
 ~InitRootHandlers () override
 
- Public Member Functions inherited from edm::RootHandlers
template<typename F >
void ignoreWarningsWhileDoing (F iFunc, SeverityLevel level=SeverityLevel::kWarning)
 
virtual ~RootHandlers ()
 

Static Public Member Functions

static void fillDescriptions (ConfigurationDescriptions &descriptions)
 
static void stacktraceFromThread ()
 
static int stackTracePause ()
 
static const ThreadTracker::Container_typethreadIDs ()
 

Static Public Attributes

static std::atomic< std::size_t > doneModules_
 
static std::vector< std::array< char, moduleBufferSize > > moduleListBuffers_
 
static std::atomic< std::size_t > nextModule_
 

Private Member Functions

void cachePidInfo ()
 
void enableWarnings_ () override
 
void ignoreWarnings_ (edm::RootHandlers::SeverityLevel level) override
 
void willBeUsingThreads () override
 

Static Private Member Functions

static char const *const * getPstackArgv ()
 
static void stacktraceHelperThread ()
 

Private Attributes

bool autoClassParser_
 
bool autoLibraryLoader_
 
bool interactiveDebug_
 
bool loadAllDictionaries_
 
bool resetErrHandler_
 
std::shared_ptr< const void > sigAbrtHandler_
 
std::shared_ptr< const void > sigBusHandler_
 
std::shared_ptr< const void > sigFpeHandler_
 
std::shared_ptr< const void > sigIllHandler_
 
std::shared_ptr< const void > sigSegvHandler_
 
std::shared_ptr< const void > sigTermHandler_
 
bool unloadSigHandler_
 

Static Private Attributes

static int childToParent_ [2] = {-1, -1}
 
static std::unique_ptr< std::thread > helperThread_
 
static int parentToChild_ [2] = {-1, -1}
 
static char pidString_ [pidStringLength_] = {}
 
static constexpr int pidStringLength_ = 200
 
static char const *const pstackArgv_ [] = {pstackName, dashC, InitRootHandlers::pidString_, nullptr}
 
static int stackTracePause_ = 300
 
static std::unique_ptr< ThreadTrackerthreadTracker_
 

Friends

int cmssw_stacktrace (void *)
 

Additional Inherited Members

- Public Types inherited from edm::RootHandlers
enum  SeverityLevel {
  SeverityLevel::kInfo, SeverityLevel::kWarning, SeverityLevel::kError, SeverityLevel::kSysError,
  SeverityLevel::kFatal
}
 

Detailed Description

Definition at line 69 of file InitRootHandlers.cc.

Constructor & Destructor Documentation

◆ InitRootHandlers()

edm::service::InitRootHandlers::InitRootHandlers ( ParameterSet const &  pset,
ActivityRegistry iReg 
)
explicit

Definition at line 773 of file InitRootHandlers.cc.

References autoClassParser_, autoLibraryLoader_, edm::TypeWithDict::byName(), cachePidInfo(), HLT_2024v14_cff::debugLevel, edm::hasDictionary(), edm::installCustomHandler(), edm::service::SystemBounds::maxNumberOfThreads(), moduleListBuffers_, muonDTDigis_cfi::pset, resetErrHandler_, edm::setRefCoreStreamerInTClass(), sigAbrtHandler_, sigBusHandler_, sigFpeHandler_, sigIllHandler_, sigSegvHandler_, watchdog::SIGTERM, sigTermHandler_, stackTracePause_, threadTracker_, unloadSigHandler_, trackerHitRTTI::vector, edm::ActivityRegistry::watchPostEndJob(), edm::ActivityRegistry::watchPostModuleConstruction(), edm::ActivityRegistry::watchPreallocate(), and edm::ActivityRegistry::watchPreModuleConstruction().

774  : RootHandlers(),
775  unloadSigHandler_(pset.getUntrackedParameter<bool>("UnloadRootSigHandler")),
776  resetErrHandler_(pset.getUntrackedParameter<bool>("ResetRootErrHandler")),
777  loadAllDictionaries_(pset.getUntrackedParameter<bool>("LoadAllDictionaries")),
778  autoLibraryLoader_(loadAllDictionaries_ or pset.getUntrackedParameter<bool>("AutoLibraryLoader")),
779  autoClassParser_(pset.getUntrackedParameter<bool>("AutoClassParser")),
780  interactiveDebug_(pset.getUntrackedParameter<bool>("InteractiveDebug")) {
781  stackTracePause_ = pset.getUntrackedParameter<int>("StackTracePauseTime");
782 
783  if (not threadTracker_) {
784  threadTracker_ = std::make_unique<ThreadTracker>();
785  iReg.watchPostEndJob([]() {
786  if (threadTracker_) {
787  threadTracker_->observe(false);
788  }
789  });
790  }
791 
792  if (unloadSigHandler_) {
793  // Deactivate all the Root signal handlers and restore the system defaults
794  gSystem->ResetSignal(kSigChild);
795  gSystem->ResetSignal(kSigBus);
796  gSystem->ResetSignal(kSigSegmentationViolation);
797  gSystem->ResetSignal(kSigIllegalInstruction);
798  gSystem->ResetSignal(kSigSystem);
799  gSystem->ResetSignal(kSigPipe);
800  gSystem->ResetSignal(kSigAlarm);
801  gSystem->ResetSignal(kSigUrgent);
802  gSystem->ResetSignal(kSigFloatingException);
803  gSystem->ResetSignal(kSigWindowChanged);
804  } else if (pset.getUntrackedParameter<bool>("AbortOnSignal")) {
805  cachePidInfo();
806 
807  //NOTE: ROOT can also be told to abort on these kinds of problems BUT
808  // it requires an TApplication to be instantiated which causes problems
809  gSystem->ResetSignal(kSigBus);
810  gSystem->ResetSignal(kSigSegmentationViolation);
811  gSystem->ResetSignal(kSigIllegalInstruction);
812  gSystem->ResetSignal(kSigFloatingException);
813  installCustomHandler(SIGBUS, sig_dostack_then_abort);
814  sigBusHandler_ = std::shared_ptr<const void>(nullptr, [](void*) { installCustomHandler(SIGBUS, sig_abort); });
815  installCustomHandler(SIGSEGV, sig_dostack_then_abort);
816  sigSegvHandler_ = std::shared_ptr<const void>(nullptr, [](void*) { installCustomHandler(SIGSEGV, sig_abort); });
817  installCustomHandler(SIGILL, sig_dostack_then_abort);
818  sigIllHandler_ = std::shared_ptr<const void>(nullptr, [](void*) { installCustomHandler(SIGILL, sig_abort); });
819  installCustomHandler(SIGTERM, sig_dostack_then_abort);
820  sigTermHandler_ = std::shared_ptr<const void>(nullptr, [](void*) { installCustomHandler(SIGTERM, sig_abort); });
821  installCustomHandler(SIGFPE, sig_dostack_then_abort);
822  sigFpeHandler_ = std::shared_ptr<const void>(nullptr, [](void*) { installCustomHandler(SIGFPE, sig_abort); });
823  installCustomHandler(SIGABRT, sig_dostack_then_abort);
824  sigAbrtHandler_ = std::shared_ptr<const void>(nullptr, [](void*) {
825  signal(SIGABRT, SIG_DFL); // release SIGABRT to default
826  });
827  }
828 
829  iReg.watchPreallocate([](edm::service::SystemBounds const& iBounds) {
830  if (iBounds.maxNumberOfThreads() > moduleListBuffers_.size()) {
831  moduleListBuffers_.resize(iBounds.maxNumberOfThreads());
832  }
833  });
834 
835  if (resetErrHandler_) {
836  // Replace the Root error handler with one that uses the MessageLogger
837  SetErrorHandler(RootErrorHandler);
838  }
839 
840  // Enable automatic Root library loading.
841  if (autoLibraryLoader_) {
842  gInterpreter->SetClassAutoloading(1);
843  }
844 
845  // Enable/disable automatic parsing of headers
846  if (not autoClassParser_) {
847  // Disable automatic parsing of headers during module construction
848  iReg.watchPreModuleConstruction(
849  [](edm::ModuleDescription const&) { gInterpreter->SetClassAutoparsing(false); });
850  iReg.watchPostModuleConstruction(
851  [](edm::ModuleDescription const&) { gInterpreter->SetClassAutoparsing(true); });
852  }
853 
854  // Set ROOT parameters.
855  TTree::SetMaxTreeSize(kMaxLong64);
856  TH1::AddDirectory(kFALSE);
857  //G__SetCatchException(0);
858 
859  // Set custom streamers
861 
862  // Load the library containing dictionaries for std:: classes, if not already loaded.
863  if (!hasDictionary(typeid(std::vector<std::vector<unsigned int>>))) {
864  TypeWithDict::byName("std::vector<std::vector<unsigned int> >");
865  }
866 
867  int debugLevel = pset.getUntrackedParameter<int>("DebugLevel");
868  if (debugLevel > 0) {
869  gDebug = debugLevel;
870  }
871 
872  // Enable Root implicit multi-threading
873  bool imt = pset.getUntrackedParameter<bool>("EnableIMT");
874  if (imt && not ROOT::IsImplicitMTEnabled()) {
875  //cmsRun uses global_control to set the number of allowed threads to use
876  // we need to tell ROOT the same value in order to avoid unnecessary warnings
877  ROOT::EnableImplicitMT(
878  oneapi::tbb::global_control::active_value(oneapi::tbb::global_control::max_allowed_parallelism));
879  }
880  }
void setRefCoreStreamerInTClass()
void installCustomHandler(int signum, CFUNC func)
std::shared_ptr< const void > sigSegvHandler_
std::shared_ptr< const void > sigFpeHandler_
std::shared_ptr< const void > sigBusHandler_
static TypeWithDict byName(std::string const &name)
Definition: TypeWithDict.cc:74
std::shared_ptr< const void > sigAbrtHandler_
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
std::shared_ptr< const void > sigIllHandler_
std::shared_ptr< const void > sigTermHandler_
static std::vector< std::array< char, moduleBufferSize > > moduleListBuffers_
static std::unique_ptr< ThreadTracker > threadTracker_
unsigned int maxNumberOfThreads() const
Definition: SystemBounds.h:38
bool hasDictionary(std::type_info const &)

◆ ~InitRootHandlers()

edm::service::InitRootHandlers::~InitRootHandlers ( )
override

Definition at line 882 of file InitRootHandlers.cc.

References f, getGTfromDQMFile::obj, and threadTracker_.

882  {
883  // close all open ROOT files
884  TIter iter(gROOT->GetListOfFiles());
885  TObject* obj = nullptr;
886  while (nullptr != (obj = iter.Next())) {
887  TFile* f = dynamic_cast<TFile*>(obj);
888  if (f) {
889  // We get a new iterator each time,
890  // because closing a file can invalidate the iterator
891  f->Close();
892  iter = TIter(gROOT->GetListOfFiles());
893  }
894  }
895  //disengage from TBB to avoid possible at exit problems
896  threadTracker_.reset();
897  }
double f[11][100]
static std::unique_ptr< ThreadTracker > threadTracker_

Member Function Documentation

◆ cachePidInfo()

void edm::service::InitRootHandlers::cachePidInfo ( )
private

Definition at line 948 of file InitRootHandlers.cc.

References childToParent_, helperThread_, interactiveDebug_, edm::errors::OtherCMS, parentToChild_, pidString_, pidStringLength_, stacktraceHelperThread(), and AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by InitRootHandlers().

948  {
949  if (helperThread_) {
950  //Another InitRootHandlers was initialized in this job, possibly
951  // because multiple EventProcessors are being used.
952  //In that case, we are already all setup
953  return;
954  }
955  std::string gdbcmd{"date; gdb -quiet -p %d"};
956  if (!interactiveDebug_) {
957  gdbcmd +=
958  " 2>&1 <<EOF |\n"
959  "set width 0\n"
960  "set height 0\n"
961  "set pagination no\n"
962  "thread apply all bt\n"
963  "EOF\n"
964  "/bin/sed -n -e 's/^\\((gdb) \\)*//' -e '/^#/p' -e '/^Thread/p'";
965  }
966  if (snprintf(pidString_, pidStringLength_ - 1, gdbcmd.c_str(), getpid()) >= pidStringLength_) {
967  std::ostringstream sstr;
968  sstr << "Unable to pre-allocate stacktrace handler information";
969  edm::Exception except(edm::errors::OtherCMS, sstr.str());
970  throw except;
971  }
972 
973  // These are initialized to -1; harmless to close an invalid FD.
974  // If this is called post-fork, we don't want to be communicating on
975  // these FDs as they are used internally by the parent.
976  close(childToParent_[0]);
977  close(childToParent_[1]);
978  childToParent_[0] = -1;
979  childToParent_[1] = -1;
980  close(parentToChild_[0]);
981  close(parentToChild_[1]);
982  parentToChild_[0] = -1;
983  parentToChild_[1] = -1;
984 
985  if (-1 == pipe2(childToParent_, O_CLOEXEC)) {
986  std::ostringstream sstr;
987  sstr << "Failed to create child-to-parent pipes (errno=" << errno << "): " << strerror(errno);
988  edm::Exception except(edm::errors::OtherCMS, sstr.str());
989  throw except;
990  }
991 
992  if (-1 == pipe2(parentToChild_, O_CLOEXEC)) {
993  close(childToParent_[0]);
994  close(childToParent_[1]);
995  childToParent_[0] = -1;
996  childToParent_[1] = -1;
997  std::ostringstream sstr;
998  sstr << "Failed to create child-to-parent pipes (errno=" << errno << "): " << strerror(errno);
999  edm::Exception except(edm::errors::OtherCMS, sstr.str());
1000  throw except;
1001  }
1002 
1003  helperThread_ = std::make_unique<std::thread>(stacktraceHelperThread);
1004  helperThread_->detach();
1005  }
static char pidString_[pidStringLength_]
static std::unique_ptr< std::thread > helperThread_
static constexpr int pidStringLength_

◆ enableWarnings_()

void edm::service::InitRootHandlers::enableWarnings_ ( )
overrideprivatevirtual

◆ fillDescriptions()

void edm::service::InitRootHandlers::fillDescriptions ( ConfigurationDescriptions descriptions)
static

Definition at line 910 of file InitRootHandlers.cc.

References edm::ConfigurationDescriptions::add(), and submitPVResolutionJobs::desc.

910  {
912  desc.setComment("Centralized interface to ROOT.");
913  desc.addUntracked<bool>("UnloadRootSigHandler", false)
914  ->setComment("If True, signals are handled by this service, rather than by ROOT.");
915  desc.addUntracked<bool>("ResetRootErrHandler", true)
916  ->setComment(
917  "If True, ROOT messages (e.g. errors, warnings) are handled by this service, rather than by ROOT.");
918  desc.addUntracked<bool>("AutoLibraryLoader", true)
919  ->setComment("If True, enables automatic loading of data dictionaries.");
920  desc.addUntracked<bool>("AutoClassParser", true)
921  ->setComment(
922  "If False, the automatic parsing of class headers for dictionaries when pre-built dictionaries are "
923  "missing is disable during module construction. The current implementation of disabling the parsing is "
924  "fragile, and may work only in a single-thread job that does not use reco::parser::cutParser() or "
925  "reco::parser::expressionParser() (and it certainly does not work on multiple threads).");
926  desc.addUntracked<bool>("LoadAllDictionaries", false)->setComment("If True, loads all ROOT dictionaries.");
927  desc.addUntracked<bool>("EnableIMT", true)->setComment("If True, calls ROOT::EnableImplicitMT().");
928  desc.addUntracked<bool>("AbortOnSignal", true)
929  ->setComment(
930  "If True, do an abort when a signal occurs that causes a crash. If False, ROOT will do an exit which "
931  "attempts to do a clean shutdown.");
932  desc.addUntracked<bool>("InteractiveDebug", false)
933  ->setComment(
934  "If True, leave gdb attached to cmsRun after a crash; "
935  "if False, attach gdb, print a stack trace, and quit gdb");
936  desc.addUntracked<int>("DebugLevel", 0)->setComment("Sets ROOT's gDebug value.");
937  desc.addUntracked<int>("StackTracePauseTime", 300)
938  ->setComment("Seconds to pause other threads during stack trace.");
939  descriptions.add("InitRootHandlers", desc);
940  }

◆ getPstackArgv()

char const *const * edm::service::InitRootHandlers::getPstackArgv ( )
staticprivate

Definition at line 942 of file InitRootHandlers.cc.

References pstackArgv_.

Referenced by edm::service::cmssw_stacktrace().

942 { return pstackArgv_; }
static char const *const pstackArgv_[]

◆ ignoreWarnings_()

void edm::service::InitRootHandlers::ignoreWarnings_ ( edm::RootHandlers::SeverityLevel  level)
overrideprivatevirtual

Implements edm::RootHandlers.

Definition at line 946 of file InitRootHandlers.cc.

References personalPlayback::level.

946 { s_ignoreWarnings = level; }

◆ stacktraceFromThread()

void edm::service::InitRootHandlers::stacktraceFromThread ( )
static

Definition at line 692 of file InitRootHandlers.cc.

References visDQMUpload::buf, childToParent_, parentToChild_, and mps_fire::result.

692  {
693  int result = full_write(parentToChild_[1], "1");
694  if (result < 0) {
695  full_cerr_write("\n\nAttempt to request stacktrace failed: ");
696  full_cerr_write(strerror(-result));
697  full_cerr_write("\n");
698  return;
699  }
700  char buf[2];
701  buf[1] = '\0';
702  if ((result = full_read(childToParent_[0], buf, 1, 5 * 60)) < 0) {
703  full_cerr_write("\n\nWaiting for stacktrace completion failed: ");
704  if (result == -ETIMEDOUT) {
705  full_cerr_write("timed out waiting for GDB to complete.");
706  } else {
707  full_cerr_write(strerror(-result));
708  }
709  full_cerr_write("\n");
710  return;
711  }
712  }

◆ stacktraceHelperThread()

void edm::service::InitRootHandlers::stacktraceHelperThread ( )
staticprivate

Definition at line 649 of file InitRootHandlers.cc.

References visDQMUpload::buf, childToParent_, edm::service::cmssw_stacktrace_fork(), parentToChild_, and mps_fire::result.

Referenced by cachePidInfo().

649  {
650  int toParent = childToParent_[1];
651  int fromParent = parentToChild_[0];
652  char buf[2];
653  buf[1] = '\0';
654 
655  while (true) {
656  int result = full_read(fromParent, buf, 1);
657  if (result < 0) {
658  // To avoid a deadlock (this function is NOT re-entrant), reset signals
659  // We never set them back to the CMSSW handler because we assume the parent
660  // thread will abort for us.
661  set_default_signals();
662  close(toParent);
663  full_cerr_write("\n\nTraceback helper thread failed to read from parent: ");
664  full_cerr_write(strerror(-result));
665  full_cerr_write("\n");
666  ::abort();
667  }
668  if (buf[0] == '1') {
669  set_default_signals();
671  full_write(toParent, buf);
672  } else if (buf[0] == '2') {
673  // We have just finished forking. Reload the file descriptors for thread
674  // communication.
675  close(toParent);
676  close(fromParent);
677  toParent = childToParent_[1];
678  fromParent = parentToChild_[0];
679  } else if (buf[0] == '3') {
680  break;
681  } else {
682  set_default_signals();
683  close(toParent);
684  full_cerr_write("\n\nTraceback helper thread got unknown command from parent: ");
685  full_cerr_write(buf);
686  full_cerr_write("\n");
687  ::abort();
688  }
689  }
690  }
static void cmssw_stacktrace_fork()

◆ stackTracePause()

static int edm::service::InitRootHandlers::stackTracePause ( )
inlinestatic

Definition at line 108 of file InitRootHandlers.cc.

References stackTracePause_.

108 { return stackTracePause_; }

◆ threadIDs()

static const ThreadTracker::Container_type& edm::service::InitRootHandlers::threadIDs ( )
inlinestatic

Definition at line 101 of file InitRootHandlers.cc.

References relativeConstraints::empty, and threadTracker_.

101  {
103  if (threadTracker_) {
104  return threadTracker_->IDs();
105  }
106  return empty;
107  }
oneapi::tbb::concurrent_unordered_set< pthread_t > Container_type
static std::unique_ptr< ThreadTracker > threadTracker_

◆ willBeUsingThreads()

void edm::service::InitRootHandlers::willBeUsingThreads ( )
overrideprivatevirtual

Implements edm::RootHandlers.

Definition at line 899 of file InitRootHandlers.cc.

899  {
900  //Tell Root we want to be multi-threaded
901  ROOT::EnableThreadSafety();
902 
903  //When threading, also have to keep ROOT from logging all TObjects into a list
904  TObject::SetObjectStat(false);
905 
906  //Have to avoid having Streamers modify themselves after they have been used
907  TVirtualStreamerInfo::Optimize(false);
908  }

Friends And Related Function Documentation

◆ cmssw_stacktrace

int cmssw_stacktrace ( void *  )
friend

Definition at line 745 of file InitRootHandlers.cc.

745  {
746  set_default_signals();
747 
749  // NOTE: this is NOT async-signal-safe at CERN's lxplus service.
750  // CERN uses LD_PRELOAD to replace execv with a function from libsnoopy which
751  // calls dlsym.
752 #ifdef __linux__
753  syscall(SYS_execve, "/bin/sh", argv, __environ);
754 #else
755  execv("/bin/sh", argv);
756 #endif
757  ::abort();
758  return 1;
759  }
static char const *const * getPstackArgv()

Member Data Documentation

◆ autoClassParser_

bool edm::service::InitRootHandlers::autoClassParser_
private

Definition at line 135 of file InitRootHandlers.cc.

Referenced by InitRootHandlers().

◆ autoLibraryLoader_

bool edm::service::InitRootHandlers::autoLibraryLoader_
private

Definition at line 134 of file InitRootHandlers.cc.

Referenced by InitRootHandlers().

◆ childToParent_

int edm::service::InitRootHandlers::childToParent_ = {-1, -1}
staticprivate

Definition at line 126 of file InitRootHandlers.cc.

Referenced by cachePidInfo(), stacktraceFromThread(), and stacktraceHelperThread().

◆ doneModules_

std::atomic< std::size_t > edm::service::InitRootHandlers::doneModules_
static

Definition at line 111 of file InitRootHandlers.cc.

◆ helperThread_

std::unique_ptr< std::thread > edm::service::InitRootHandlers::helperThread_
staticprivate

Definition at line 127 of file InitRootHandlers.cc.

Referenced by cachePidInfo().

◆ interactiveDebug_

bool edm::service::InitRootHandlers::interactiveDebug_
private

Definition at line 136 of file InitRootHandlers.cc.

Referenced by cachePidInfo().

◆ loadAllDictionaries_

bool edm::service::InitRootHandlers::loadAllDictionaries_
private

Definition at line 133 of file InitRootHandlers.cc.

◆ moduleListBuffers_

std::vector< std::array< char, moduleBufferSize > > edm::service::InitRootHandlers::moduleListBuffers_
static

Definition at line 110 of file InitRootHandlers.cc.

Referenced by InitRootHandlers().

◆ nextModule_

std::atomic< std::size_t > edm::service::InitRootHandlers::nextModule_
static

Definition at line 111 of file InitRootHandlers.cc.

◆ parentToChild_

int edm::service::InitRootHandlers::parentToChild_ = {-1, -1}
staticprivate

Definition at line 125 of file InitRootHandlers.cc.

Referenced by cachePidInfo(), stacktraceFromThread(), and stacktraceHelperThread().

◆ pidString_

char edm::service::InitRootHandlers::pidString_ = {}
staticprivate

Definition at line 123 of file InitRootHandlers.cc.

Referenced by cachePidInfo().

◆ pidStringLength_

constexpr int edm::service::InitRootHandlers::pidStringLength_ = 200
staticprivate

Definition at line 122 of file InitRootHandlers.cc.

Referenced by cachePidInfo().

◆ pstackArgv_

char const *const edm::service::InitRootHandlers::pstackArgv_ = {pstackName, dashC, InitRootHandlers::pidString_, nullptr}
staticprivate

Definition at line 124 of file InitRootHandlers.cc.

Referenced by getPstackArgv().

◆ resetErrHandler_

bool edm::service::InitRootHandlers::resetErrHandler_
private

Definition at line 132 of file InitRootHandlers.cc.

Referenced by InitRootHandlers().

◆ sigAbrtHandler_

std::shared_ptr<const void> edm::service::InitRootHandlers::sigAbrtHandler_
private

Definition at line 141 of file InitRootHandlers.cc.

Referenced by InitRootHandlers().

◆ sigBusHandler_

std::shared_ptr<const void> edm::service::InitRootHandlers::sigBusHandler_
private

Definition at line 137 of file InitRootHandlers.cc.

Referenced by InitRootHandlers().

◆ sigFpeHandler_

std::shared_ptr<const void> edm::service::InitRootHandlers::sigFpeHandler_
private

Definition at line 142 of file InitRootHandlers.cc.

Referenced by InitRootHandlers().

◆ sigIllHandler_

std::shared_ptr<const void> edm::service::InitRootHandlers::sigIllHandler_
private

Definition at line 139 of file InitRootHandlers.cc.

Referenced by InitRootHandlers().

◆ sigSegvHandler_

std::shared_ptr<const void> edm::service::InitRootHandlers::sigSegvHandler_
private

Definition at line 138 of file InitRootHandlers.cc.

Referenced by InitRootHandlers().

◆ sigTermHandler_

std::shared_ptr<const void> edm::service::InitRootHandlers::sigTermHandler_
private

Definition at line 140 of file InitRootHandlers.cc.

Referenced by InitRootHandlers().

◆ stackTracePause_

int edm::service::InitRootHandlers::stackTracePause_ = 300
staticprivate

Definition at line 129 of file InitRootHandlers.cc.

Referenced by InitRootHandlers(), and stackTracePause().

◆ threadTracker_

std::unique_ptr< InitRootHandlers::ThreadTracker > edm::service::InitRootHandlers::threadTracker_
staticprivate

Definition at line 128 of file InitRootHandlers.cc.

Referenced by InitRootHandlers(), threadIDs(), and ~InitRootHandlers().

◆ unloadSigHandler_

bool edm::service::InitRootHandlers::unloadSigHandler_
private

Definition at line 131 of file InitRootHandlers.cc.

Referenced by InitRootHandlers().