signal_catcher.h revision 8cf5bc0ab8742df107f0f4fc8ec0e991b6568f11
1e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes/* 2e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes * Copyright (C) 2008 The Android Open Source Project 3e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes * 4e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 5e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes * you may not use this file except in compliance with the License. 6e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes * You may obtain a copy of the License at 7e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes * 8e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 9e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes * 10e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes * Unless required by applicable law or agreed to in writing, software 11e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 12e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes * See the License for the specific language governing permissions and 14e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes * limitations under the License. 15e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes */ 16e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes 17e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes#ifndef ART_SRC_SIGNAL_CATCHER_H_ 18e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes#define ART_SRC_SIGNAL_CATCHER_H_ 19e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes 208daa0929f08a3080ea64dbd4e997e72f411e6fc9Elliott Hughes#include "mutex.h" 21e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes 22e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughesnamespace art { 23e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes 24e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughesclass Runtime; 25e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughesclass Thread; 26e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes 27e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes/* 288cf5bc0ab8742df107f0f4fc8ec0e991b6568f11Elliott Hughes * A daemon thread that catches signals and does something useful. For 29e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes * example, when a SIGQUIT (Ctrl-\) arrives, we suspend and dump the 30e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes * status of all threads. 31e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes */ 32e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughesclass SignalCatcher { 33e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes public: 34ff17f1fd3ff32f93e45588eb2b158832d73f9afaElliott Hughes explicit SignalCatcher(const std::string& stack_trace_file); 35e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes ~SignalCatcher(); 36e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes 3794ce37a3919a0bdb8855a3d3264a50df1dbc41beElliott Hughes void HandleSigQuit(); 3842ee14279065352a4b9a3e8028d02c567e847d05Elliott Hughes 39e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes private: 40e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes static void* Run(void* arg); 41e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes 4294ce37a3919a0bdb8855a3d3264a50df1dbc41beElliott Hughes void HandleSigUsr1(); 4394ce37a3919a0bdb8855a3d3264a50df1dbc41beElliott Hughes void Output(const std::string& s); 445fe594f576225dd7d333835e39c448a71ea9b433Elliott Hughes void SetHaltFlag(bool new_value); 455fe594f576225dd7d333835e39c448a71ea9b433Elliott Hughes bool ShouldHalt(); 46c2f8006ede3d07ca53467fa73573bdbfb864a65eElliott Hughes int WaitForSignal(sigset_t& mask); 475fe594f576225dd7d333835e39c448a71ea9b433Elliott Hughes 4894ce37a3919a0bdb8855a3d3264a50df1dbc41beElliott Hughes std::string stack_trace_file_; 498daa0929f08a3080ea64dbd4e997e72f411e6fc9Elliott Hughes mutable Mutex lock_; 505fe594f576225dd7d333835e39c448a71ea9b433Elliott Hughes bool halt_; 515f79133a435ebcb20000370d56046fe01201dd80Elliott Hughes ConditionVariable cond_; 528d768a954b101a9532f980253ac46be2c53aba11Elliott Hughes pthread_t pthread_; 538d768a954b101a9532f980253ac46be2c53aba11Elliott Hughes Thread* thread_; 54e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes}; 55e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes 56e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes} // namespace art 57e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes 58e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes#endif // ART_SRC_SIGNAL_CATCHER_H_ 59