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 17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_RUNTIME_SIGNAL_CATCHER_H_ 18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_RUNTIME_SIGNAL_CATCHER_H_ 19e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes 2076b6167407c2b6f5d40ad895b2793a6b037f54b2Elliott Hughes#include "base/mutex.h" 21e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes 22e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughesnamespace art { 23e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes 24e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughesclass Runtime; 25457005c557b8762475db3220ce5a747d629f975bElliott Hughesclass SignalSet; 26e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughesclass Thread; 27e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes 28e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes/* 298cf5bc0ab8742df107f0f4fc8ec0e991b6568f11Elliott Hughes * A daemon thread that catches signals and does something useful. For 30e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes * example, when a SIGQUIT (Ctrl-\) arrives, we suspend and dump the 31e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes * status of all threads. 32e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes */ 33e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughesclass SignalCatcher { 34e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes public: 35ff17f1fd3ff32f93e45588eb2b158832d73f9afaElliott Hughes explicit SignalCatcher(const std::string& stack_trace_file); 36e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes ~SignalCatcher(); 37e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes 3890443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier void HandleSigQuit() REQUIRES(!Locks::mutator_lock_, !Locks::thread_list_lock_, 3990443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier !Locks::thread_suspend_count_lock_); 4000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers 4142ee14279065352a4b9a3e8028d02c567e847d05Elliott Hughes 42e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes private: 4390443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier // NO_THREAD_SAFETY_ANALYSIS for static function calling into member function with excludes lock. 4490443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier static void* Run(void* arg) NO_THREAD_SAFETY_ANALYSIS; 45e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes 4694ce37a3919a0bdb8855a3d3264a50df1dbc41beElliott Hughes void HandleSigUsr1(); 4794ce37a3919a0bdb8855a3d3264a50df1dbc41beElliott Hughes void Output(const std::string& s); 4890443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier void SetHaltFlag(bool new_value) REQUIRES(!lock_); 4990443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier bool ShouldHalt() REQUIRES(!lock_); 5090443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier int WaitForSignal(Thread* self, SignalSet& signals) REQUIRES(!lock_); 515fe594f576225dd7d333835e39c448a71ea9b433Elliott Hughes 5294ce37a3919a0bdb8855a3d3264a50df1dbc41beElliott Hughes std::string stack_trace_file_; 53f8349361a16a4e2796efe9f3586b994e8d4834e4Elliott Hughes 54c604d731730b43231f63040c8db1d58304da0cf3Ian Rogers mutable Mutex lock_ DEFAULT_MUTEX_ACQUIRED_AFTER; 55c604d731730b43231f63040c8db1d58304da0cf3Ian Rogers ConditionVariable cond_ GUARDED_BY(lock_); 56f8349361a16a4e2796efe9f3586b994e8d4834e4Elliott Hughes bool halt_ GUARDED_BY(lock_); 57f8349361a16a4e2796efe9f3586b994e8d4834e4Elliott Hughes pthread_t pthread_ GUARDED_BY(lock_); 58f8349361a16a4e2796efe9f3586b994e8d4834e4Elliott Hughes Thread* thread_ GUARDED_BY(lock_); 59e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes}; 60e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes 61e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes} // namespace art 62e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes 63fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif // ART_RUNTIME_SIGNAL_CATCHER_H_ 64