1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2008 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker #ifndef ART_RUNTIME_SIGNAL_CATCHER_H_ 18*795d594fSAndroid Build Coastguard Worker #define ART_RUNTIME_SIGNAL_CATCHER_H_ 19*795d594fSAndroid Build Coastguard Worker 20*795d594fSAndroid Build Coastguard Worker #include <optional> 21*795d594fSAndroid Build Coastguard Worker 22*795d594fSAndroid Build Coastguard Worker #include "android-base/unique_fd.h" 23*795d594fSAndroid Build Coastguard Worker #include "base/mutex.h" 24*795d594fSAndroid Build Coastguard Worker #include "base/macros.h" 25*795d594fSAndroid Build Coastguard Worker 26*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN { 27*795d594fSAndroid Build Coastguard Worker 28*795d594fSAndroid Build Coastguard Worker class Runtime; 29*795d594fSAndroid Build Coastguard Worker class SignalSet; 30*795d594fSAndroid Build Coastguard Worker class Thread; 31*795d594fSAndroid Build Coastguard Worker 32*795d594fSAndroid Build Coastguard Worker /* 33*795d594fSAndroid Build Coastguard Worker * A daemon thread that catches signals and does something useful. For 34*795d594fSAndroid Build Coastguard Worker * example, when a SIGQUIT (Ctrl-\) arrives, we suspend and dump the 35*795d594fSAndroid Build Coastguard Worker * status of all threads. 36*795d594fSAndroid Build Coastguard Worker */ 37*795d594fSAndroid Build Coastguard Worker class SignalCatcher { 38*795d594fSAndroid Build Coastguard Worker public: 39*795d594fSAndroid Build Coastguard Worker SignalCatcher(); 40*795d594fSAndroid Build Coastguard Worker ~SignalCatcher(); 41*795d594fSAndroid Build Coastguard Worker 42*795d594fSAndroid Build Coastguard Worker void HandleSigQuit() REQUIRES(!Locks::mutator_lock_, !Locks::thread_list_lock_, 43*795d594fSAndroid Build Coastguard Worker !Locks::thread_suspend_count_lock_); 44*795d594fSAndroid Build Coastguard Worker SiqQuitNanoTime()45*795d594fSAndroid Build Coastguard Worker std::optional<uint64_t> SiqQuitNanoTime() const { return sigquit_nanotime_; } 46*795d594fSAndroid Build Coastguard Worker 47*795d594fSAndroid Build Coastguard Worker private: 48*795d594fSAndroid Build Coastguard Worker // NO_THREAD_SAFETY_ANALYSIS for static function calling into member function with excludes lock. 49*795d594fSAndroid Build Coastguard Worker static void* Run(void* arg) NO_THREAD_SAFETY_ANALYSIS; 50*795d594fSAndroid Build Coastguard Worker 51*795d594fSAndroid Build Coastguard Worker void HandleSigUsr1(); 52*795d594fSAndroid Build Coastguard Worker void Output(const std::string& s); 53*795d594fSAndroid Build Coastguard Worker void SetHaltFlag(bool new_value) REQUIRES(!lock_); 54*795d594fSAndroid Build Coastguard Worker bool ShouldHalt() REQUIRES(!lock_); 55*795d594fSAndroid Build Coastguard Worker int WaitForSignal(Thread* self, SignalSet& signals) REQUIRES(!lock_); 56*795d594fSAndroid Build Coastguard Worker 57*795d594fSAndroid Build Coastguard Worker mutable Mutex lock_ DEFAULT_MUTEX_ACQUIRED_AFTER; 58*795d594fSAndroid Build Coastguard Worker ConditionVariable cond_ GUARDED_BY(lock_); 59*795d594fSAndroid Build Coastguard Worker bool halt_ GUARDED_BY(lock_); 60*795d594fSAndroid Build Coastguard Worker pthread_t pthread_ GUARDED_BY(lock_); 61*795d594fSAndroid Build Coastguard Worker Thread* thread_ GUARDED_BY(lock_); 62*795d594fSAndroid Build Coastguard Worker std::optional<uint64_t> sigquit_nanotime_; 63*795d594fSAndroid Build Coastguard Worker }; 64*795d594fSAndroid Build Coastguard Worker 65*795d594fSAndroid Build Coastguard Worker } // namespace art 66*795d594fSAndroid Build Coastguard Worker 67*795d594fSAndroid Build Coastguard Worker #endif // ART_RUNTIME_SIGNAL_CATCHER_H_ 68