File indexing completed on 2024-04-06 12:11:29
0001 #include "TEnv.h"
0002 #include "TSystem.h"
0003 #include "TEveManager.h"
0004 #include "TRint.h"
0005 #include "TApplication.h"
0006 #include "TSysEvtHandler.h"
0007 #include "Getline.h"
0008 #include <iostream>
0009 #include <fstream>
0010 #include <cstring>
0011 #include <memory>
0012 #include <csignal>
0013
0014 #include "Fireworks/Core/interface/CmsShowMain.h"
0015 #include "Fireworks/Core/interface/fwPaths.h"
0016
0017
0018 #include "FWCore/MessageLogger/interface/AbstractMLscribe.h"
0019 #include "FWCore/MessageLogger/interface/ErrorObj.h"
0020 #include "FWCore/MessageLogger/interface/MessageLoggerQ.h"
0021 #include "FWCore/MessageLogger/interface/MessageDrop.h"
0022
0023 namespace {
0024 class SilentMLscribe : public edm::service::AbstractMLscribe {
0025 public:
0026 SilentMLscribe() {}
0027
0028
0029
0030 void runCommand(edm::MessageLoggerQ::OpCode opcode, void* operand) override;
0031
0032 SilentMLscribe(const SilentMLscribe&) = delete;
0033
0034 const SilentMLscribe& operator=(const SilentMLscribe&) = delete;
0035
0036
0037 };
0038
0039 void SilentMLscribe::runCommand(edm::MessageLoggerQ::OpCode opcode, void* operand) {
0040
0041 switch (opcode) {
0042 case edm::MessageLoggerQ::LOG_A_MESSAGE: {
0043 edm::ErrorObj* errorobj_p = static_cast<edm::ErrorObj*>(operand);
0044
0045
0046 delete errorobj_p;
0047 break;
0048 }
0049 case edm::MessageLoggerQ::JOBMODE:
0050 case edm::MessageLoggerQ::GROUP_STATS: {
0051 std::string* string_p = static_cast<std::string*>(operand);
0052 delete string_p;
0053 break;
0054 }
0055 default:
0056 break;
0057 }
0058 }
0059
0060 }
0061
0062 namespace {
0063 void signal_handler_wrapper(int sid, siginfo_t* sinfo, void* sctx) {
0064 #if defined(R__LINUX)
0065 std::cerr << "Program received signal ID = " << sid << std::endl;
0066 std::cerr << "Printing stack trace ... " << std::endl;
0067
0068 TString gdbCommand("scripts/gdb-backtrace.sh");
0069 fireworks::setPath(gdbCommand);
0070 gdbCommand += " ";
0071
0072 gdbCommand += gSystem->GetPid();
0073
0074 gSystem->Exec(gdbCommand.Data());
0075 gSystem->Exit(sid);
0076 Getlinem(kCleanUp, nullptr);
0077 #endif
0078 }
0079 }
0080
0081 void run_app(TApplication& app, int argc, char** argv) {
0082
0083 edm::MessageLoggerQ::setMLscribe_ptr(
0084 std::shared_ptr<edm::service::AbstractMLscribe>(std::make_shared<SilentMLscribe>()));
0085 edm::MessageDrop::instance()->messageLoggerScribeIsRunning = edm::MLSCRIBE_RUNNING_INDICATOR;
0086
0087 std::unique_ptr<CmsShowMain> pMain(new CmsShowMain(argc, argv));
0088
0089
0090
0091 gSystem->ResetSignal(kSigBus);
0092 gSystem->ResetSignal(kSigSegmentationViolation);
0093 gSystem->ResetSignal(kSigIllegalInstruction);
0094 gSystem->ResetSignal(kSigSystem);
0095 gSystem->ResetSignal(kSigPipe);
0096 gSystem->ResetSignal(kSigFloatingException);
0097
0098 struct sigaction sac;
0099 sac.sa_sigaction = signal_handler_wrapper;
0100 sigemptyset(&sac.sa_mask);
0101 sac.sa_flags = SA_SIGINFO;
0102 sigaction(SIGILL, &sac, nullptr);
0103 sigaction(SIGSEGV, &sac, nullptr);
0104 sigaction(SIGBUS, &sac, nullptr);
0105 sigaction(SIGFPE, &sac, nullptr);
0106
0107 app.Run();
0108 pMain.reset();
0109
0110 TEveManager::Terminate();
0111 app.Terminate();
0112
0113
0114 edm::MessageLoggerQ::MLqEND();
0115 }
0116
0117 int main(int argc, char** argv) {
0118 const char* dummyArgvArray[] = {"cmsShow"};
0119 char** dummyArgv = const_cast<char**>(dummyArgvArray);
0120 int dummyArgc = 1;
0121 gEnv->SetValue("Gui.BackgroundColor", "#9f9f9f");
0122
0123
0124 TString infoText;
0125 if (gSystem->Getenv("CMSSW_VERSION")) {
0126 infoText = gSystem->Getenv("CMSSW_VERSION");
0127 } else {
0128 TString infoFileName("data/version.txt");
0129 fireworks::setPath(infoFileName);
0130 std::ifstream infoFile(infoFileName);
0131 infoText.ReadLine(infoFile);
0132 infoFile.close();
0133 }
0134 printf("Starting cmsShow, version %s.\n", infoText.Data());
0135 fflush(stdout);
0136
0137
0138 bool isri = false;
0139 for (Int_t i = 0; i < argc; i++) {
0140 if (strncmp(argv[i], "-r", 2) == 0 || strncmp(argv[i], "--root", 6) == 0) {
0141 isri = true;
0142 }
0143 }
0144
0145 try {
0146 if (isri) {
0147 std::cerr << "" << std::endl;
0148 std::cerr << "WARNING:You are running cmsShow with ROOT prompt enabled." << std::endl;
0149 std::cerr << "If you encounter an issue you suspect to be a bug in " << std::endl;
0150 std::cerr << "cmsShow, please re-run without this option and try to " << std::endl;
0151 std::cerr << "reproduce it before submitting a bug-report. " << std::endl;
0152 std::cerr << "" << std::endl;
0153
0154 TRint app("cmsShow", &dummyArgc, dummyArgv);
0155 run_app(app, argc, argv);
0156 } else {
0157 TApplication app("cmsShow", &dummyArgc, dummyArgv);
0158 run_app(app, argc, argv);
0159 }
0160 } catch (std::exception& iException) {
0161 std::cerr << "CmsShow unhandled exception " << iException.what() << std::endl;
0162 return 1;
0163 }
0164
0165 return 0;
0166 }