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