More SIGQUIT handling, various Thread fixes.
Change-Id: I3233c300d1c838c2eee0ba9be6018b7fbd907386
diff --git a/src/signal_catcher.cc b/src/signal_catcher.cc
index 5979a0f..e2e2360 100644
--- a/src/signal_catcher.cc
+++ b/src/signal_catcher.cc
@@ -50,23 +50,31 @@
void SignalCatcher::HandleSigQuit() {
// TODO: suspend all threads
- std::stringstream buffer;
- buffer << "\n"
- << "\n"
- << "----- pid " << getpid() << " at " << GetIsoDate() << " -----\n"
- << "Cmd line: " << ReadFileToString("/proc/self/cmdline") << "\n";
+ std::stringstream os;
+ os << "\n"
+ << "\n"
+ << "----- pid " << getpid() << " at " << GetIsoDate() << " -----\n";
- Runtime::Current()->DumpStatistics(buffer);
+ std::string cmdline;
+ if (ReadFileToString("/proc/self/cmdline", &cmdline)) {
+ std::replace(cmdline.begin(), cmdline.end(), '\0', ' ');
+ os << "Cmd line: " << cmdline << "\n";
+ }
- // TODO: dump all threads.
- // dvmDumpAllThreadsEx(&target, true);
+ Runtime* runtime = Runtime::Current();
+ runtime->DumpStatistics(os);
+ runtime->GetThreadList()->Dump(os);
- buffer << "/proc/self/maps:\n" << ReadFileToString("/proc/self/maps");
- buffer << "----- end " << getpid() << " -----";
+ std::string maps;
+ if (ReadFileToString("/proc/self/maps", &maps)) {
+ os << "/proc/self/maps:\n" << maps;
+ }
+
+ os << "----- end " << getpid() << " -----";
// TODO: resume all threads
- LOG(INFO) << buffer.str();
+ LOG(INFO) << os.str();
}
void SignalCatcher::HandleSigUsr1() {
@@ -93,12 +101,10 @@
}
void* SignalCatcher::Run(void*) {
- CHECK(Runtime::Current()->AttachCurrentThread("Signal Catcher", NULL, true));
+ Runtime::Current()->AttachCurrentThread("Signal Catcher", NULL, true);
Thread* self = Thread::Current();
CHECK(self != NULL);
- LOG(INFO) << "Signal catcher thread started " << *self;
-
// Set up mask with signals we want to handle.
sigset_t mask;
sigemptyset(&mask);
@@ -108,6 +114,7 @@
while (true) {
int signal_number = WaitForSignal(self, mask);
if (halt_) {
+ Runtime::Current()->DetachCurrentThread();
return NULL;
}