1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2017 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_RUNTIME_CALLBACKS_H_ 18*795d594fSAndroid Build Coastguard Worker #define ART_RUNTIME_RUNTIME_CALLBACKS_H_ 19*795d594fSAndroid Build Coastguard Worker 20*795d594fSAndroid Build Coastguard Worker #include <vector> 21*795d594fSAndroid Build Coastguard Worker 22*795d594fSAndroid Build Coastguard Worker #include "base/array_ref.h" 23*795d594fSAndroid Build Coastguard Worker #include "base/locks.h" 24*795d594fSAndroid Build Coastguard Worker #include "base/macros.h" 25*795d594fSAndroid Build Coastguard Worker #include "handle.h" 26*795d594fSAndroid Build Coastguard Worker 27*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN { 28*795d594fSAndroid Build Coastguard Worker 29*795d594fSAndroid Build Coastguard Worker namespace dex { 30*795d594fSAndroid Build Coastguard Worker struct ClassDef; 31*795d594fSAndroid Build Coastguard Worker } // namespace dex 32*795d594fSAndroid Build Coastguard Worker 33*795d594fSAndroid Build Coastguard Worker namespace mirror { 34*795d594fSAndroid Build Coastguard Worker class Class; 35*795d594fSAndroid Build Coastguard Worker class ClassLoader; 36*795d594fSAndroid Build Coastguard Worker class Object; 37*795d594fSAndroid Build Coastguard Worker } // namespace mirror 38*795d594fSAndroid Build Coastguard Worker 39*795d594fSAndroid Build Coastguard Worker class ArtMethod; 40*795d594fSAndroid Build Coastguard Worker class ClassLoadCallback; 41*795d594fSAndroid Build Coastguard Worker class DexFile; 42*795d594fSAndroid Build Coastguard Worker class Thread; 43*795d594fSAndroid Build Coastguard Worker class MethodCallback; 44*795d594fSAndroid Build Coastguard Worker class Monitor; 45*795d594fSAndroid Build Coastguard Worker class ReaderWriterMutex; 46*795d594fSAndroid Build Coastguard Worker class ThreadLifecycleCallback; 47*795d594fSAndroid Build Coastguard Worker class ReflectiveValueVisitor; 48*795d594fSAndroid Build Coastguard Worker 49*795d594fSAndroid Build Coastguard Worker // Note: RuntimeCallbacks uses the mutator lock to synchronize the callback lists. A thread must 50*795d594fSAndroid Build Coastguard Worker // hold the exclusive lock to add or remove a listener. A thread must hold the shared lock 51*795d594fSAndroid Build Coastguard Worker // to dispatch an event. This setup is chosen as some clients may want to suspend the 52*795d594fSAndroid Build Coastguard Worker // dispatching thread or all threads. 53*795d594fSAndroid Build Coastguard Worker // 54*795d594fSAndroid Build Coastguard Worker // To make this safe, the following restrictions apply: 55*795d594fSAndroid Build Coastguard Worker // * Only the owner of a listener may ever add or remove said listener. 56*795d594fSAndroid Build Coastguard Worker // * A listener must never add or remove itself or any other listener while running. 57*795d594fSAndroid Build Coastguard Worker // * It is the responsibility of the owner to not remove the listener while it is running 58*795d594fSAndroid Build Coastguard Worker // (and suspended). 59*795d594fSAndroid Build Coastguard Worker // * The owner should never deallocate a listener once it has been registered, even if it has 60*795d594fSAndroid Build Coastguard Worker // been removed. 61*795d594fSAndroid Build Coastguard Worker // 62*795d594fSAndroid Build Coastguard Worker // The simplest way to satisfy these restrictions is to never remove a listener, and to do 63*795d594fSAndroid Build Coastguard Worker // any state checking (is the listener enabled) in the listener itself. For an example, see 64*795d594fSAndroid Build Coastguard Worker // Dbg. 65*795d594fSAndroid Build Coastguard Worker 66*795d594fSAndroid Build Coastguard Worker class DdmCallback { 67*795d594fSAndroid Build Coastguard Worker public: ~DdmCallback()68*795d594fSAndroid Build Coastguard Worker virtual ~DdmCallback() {} 69*795d594fSAndroid Build Coastguard Worker virtual void DdmPublishChunk(uint32_t type, const ArrayRef<const uint8_t>& data) 70*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) = 0; 71*795d594fSAndroid Build Coastguard Worker }; 72*795d594fSAndroid Build Coastguard Worker 73*795d594fSAndroid Build Coastguard Worker class AppInfoCallback { 74*795d594fSAndroid Build Coastguard Worker public: ~AppInfoCallback()75*795d594fSAndroid Build Coastguard Worker virtual ~AppInfoCallback() {} 76*795d594fSAndroid Build Coastguard Worker virtual void SetCurrentProcessName(const std::string& process_name) 77*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) = 0; 78*795d594fSAndroid Build Coastguard Worker virtual void AddApplication(const std::string& package_name) 79*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) = 0; 80*795d594fSAndroid Build Coastguard Worker virtual void RemoveApplication(const std::string& package_name) 81*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) = 0; 82*795d594fSAndroid Build Coastguard Worker virtual void SetWaitingForDebugger(bool waiting) REQUIRES_SHARED(Locks::mutator_lock_) = 0; 83*795d594fSAndroid Build Coastguard Worker virtual void SetUserId(int uid) REQUIRES_SHARED(Locks::mutator_lock_) = 0; 84*795d594fSAndroid Build Coastguard Worker }; 85*795d594fSAndroid Build Coastguard Worker 86*795d594fSAndroid Build Coastguard Worker class DebuggerControlCallback { 87*795d594fSAndroid Build Coastguard Worker public: ~DebuggerControlCallback()88*795d594fSAndroid Build Coastguard Worker virtual ~DebuggerControlCallback() {} 89*795d594fSAndroid Build Coastguard Worker 90*795d594fSAndroid Build Coastguard Worker // Begin running the debugger. 91*795d594fSAndroid Build Coastguard Worker virtual void StartDebugger() = 0; 92*795d594fSAndroid Build Coastguard Worker // The debugger should begin shutting down since the runtime is ending. This is just advisory 93*795d594fSAndroid Build Coastguard Worker virtual void StopDebugger() = 0; 94*795d594fSAndroid Build Coastguard Worker 95*795d594fSAndroid Build Coastguard Worker // This allows the debugger to tell the runtime if it is configured. 96*795d594fSAndroid Build Coastguard Worker virtual bool IsDebuggerConfigured() = 0; 97*795d594fSAndroid Build Coastguard Worker }; 98*795d594fSAndroid Build Coastguard Worker 99*795d594fSAndroid Build Coastguard Worker class RuntimeSigQuitCallback { 100*795d594fSAndroid Build Coastguard Worker public: ~RuntimeSigQuitCallback()101*795d594fSAndroid Build Coastguard Worker virtual ~RuntimeSigQuitCallback() {} 102*795d594fSAndroid Build Coastguard Worker 103*795d594fSAndroid Build Coastguard Worker virtual void SigQuit() REQUIRES_SHARED(Locks::mutator_lock_) = 0; 104*795d594fSAndroid Build Coastguard Worker }; 105*795d594fSAndroid Build Coastguard Worker 106*795d594fSAndroid Build Coastguard Worker class RuntimePhaseCallback { 107*795d594fSAndroid Build Coastguard Worker public: 108*795d594fSAndroid Build Coastguard Worker enum RuntimePhase { 109*795d594fSAndroid Build Coastguard Worker kInitialAgents, // Initial agent loading is done. 110*795d594fSAndroid Build Coastguard Worker kStart, // The runtime is started. 111*795d594fSAndroid Build Coastguard Worker kInit, // The runtime is initialized (and will run user code soon). 112*795d594fSAndroid Build Coastguard Worker kDeath, // The runtime just died. 113*795d594fSAndroid Build Coastguard Worker }; 114*795d594fSAndroid Build Coastguard Worker ~RuntimePhaseCallback()115*795d594fSAndroid Build Coastguard Worker virtual ~RuntimePhaseCallback() {} 116*795d594fSAndroid Build Coastguard Worker 117*795d594fSAndroid Build Coastguard Worker virtual void NextRuntimePhase(RuntimePhase phase) REQUIRES_SHARED(Locks::mutator_lock_) = 0; 118*795d594fSAndroid Build Coastguard Worker }; 119*795d594fSAndroid Build Coastguard Worker 120*795d594fSAndroid Build Coastguard Worker class MonitorCallback { 121*795d594fSAndroid Build Coastguard Worker public: 122*795d594fSAndroid Build Coastguard Worker // Called just before the thread goes to sleep to wait for the monitor to become unlocked. 123*795d594fSAndroid Build Coastguard Worker virtual void MonitorContendedLocking(Monitor* mon) REQUIRES_SHARED(Locks::mutator_lock_) = 0; 124*795d594fSAndroid Build Coastguard Worker // Called just after the monitor has been successfully acquired when it was already locked. 125*795d594fSAndroid Build Coastguard Worker virtual void MonitorContendedLocked(Monitor* mon) REQUIRES_SHARED(Locks::mutator_lock_) = 0; 126*795d594fSAndroid Build Coastguard Worker // Called on entry to the Object#wait method regardless of whether or not the call is valid. 127*795d594fSAndroid Build Coastguard Worker virtual void ObjectWaitStart(Handle<mirror::Object> obj, int64_t millis_timeout) 128*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) = 0; 129*795d594fSAndroid Build Coastguard Worker 130*795d594fSAndroid Build Coastguard Worker // Called just after the monitor has woken up from going to sleep for a wait(). At this point the 131*795d594fSAndroid Build Coastguard Worker // thread does not possess a lock on the monitor. This will only be called for threads wait calls 132*795d594fSAndroid Build Coastguard Worker // where the thread did (or at least could have) gone to sleep. 133*795d594fSAndroid Build Coastguard Worker virtual void MonitorWaitFinished(Monitor* m, bool timed_out) 134*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) = 0; 135*795d594fSAndroid Build Coastguard Worker ~MonitorCallback()136*795d594fSAndroid Build Coastguard Worker virtual ~MonitorCallback() {} 137*795d594fSAndroid Build Coastguard Worker }; 138*795d594fSAndroid Build Coastguard Worker 139*795d594fSAndroid Build Coastguard Worker class ParkCallback { 140*795d594fSAndroid Build Coastguard Worker public: 141*795d594fSAndroid Build Coastguard Worker // Called on entry to the Unsafe.#park method 142*795d594fSAndroid Build Coastguard Worker virtual void ThreadParkStart(bool is_absolute, int64_t millis_timeout) 143*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) = 0; 144*795d594fSAndroid Build Coastguard Worker 145*795d594fSAndroid Build Coastguard Worker // Called just after the thread has woken up from going to sleep for a park(). This will only be 146*795d594fSAndroid Build Coastguard Worker // called for Unsafe.park() calls where the thread did (or at least could have) gone to sleep. 147*795d594fSAndroid Build Coastguard Worker virtual void ThreadParkFinished(bool timed_out) REQUIRES_SHARED(Locks::mutator_lock_) = 0; 148*795d594fSAndroid Build Coastguard Worker ~ParkCallback()149*795d594fSAndroid Build Coastguard Worker virtual ~ParkCallback() {} 150*795d594fSAndroid Build Coastguard Worker }; 151*795d594fSAndroid Build Coastguard Worker 152*795d594fSAndroid Build Coastguard Worker // A callback to let parts of the runtime note that they are currently relying on a particular 153*795d594fSAndroid Build Coastguard Worker // method remaining in it's current state. Users should not rely on always being called. If multiple 154*795d594fSAndroid Build Coastguard Worker // callbacks are added the runtime will short-circuit when the first one returns 'true'. 155*795d594fSAndroid Build Coastguard Worker class MethodInspectionCallback { 156*795d594fSAndroid Build Coastguard Worker public: ~MethodInspectionCallback()157*795d594fSAndroid Build Coastguard Worker virtual ~MethodInspectionCallback() {} 158*795d594fSAndroid Build Coastguard Worker 159*795d594fSAndroid Build Coastguard Worker // Returns true if any locals have changed. If any locals have changed we shouldn't OSR. 160*795d594fSAndroid Build Coastguard Worker virtual bool HaveLocalsChanged() REQUIRES_SHARED(Locks::mutator_lock_) = 0; 161*795d594fSAndroid Build Coastguard Worker }; 162*795d594fSAndroid Build Coastguard Worker 163*795d594fSAndroid Build Coastguard Worker // Callback to let something request to be notified when reflective objects are being visited and 164*795d594fSAndroid Build Coastguard Worker // updated to update any bare ArtMethod/ArtField pointers it might have. 165*795d594fSAndroid Build Coastguard Worker class ReflectiveValueVisitCallback { 166*795d594fSAndroid Build Coastguard Worker public: ~ReflectiveValueVisitCallback()167*795d594fSAndroid Build Coastguard Worker virtual ~ReflectiveValueVisitCallback() {} 168*795d594fSAndroid Build Coastguard Worker 169*795d594fSAndroid Build Coastguard Worker // Called when something visits all reflective values with the update visitor. 170*795d594fSAndroid Build Coastguard Worker virtual void VisitReflectiveTargets(ReflectiveValueVisitor* visitor) 171*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::mutator_lock_) = 0; 172*795d594fSAndroid Build Coastguard Worker }; 173*795d594fSAndroid Build Coastguard Worker 174*795d594fSAndroid Build Coastguard Worker class EXPORT RuntimeCallbacks { 175*795d594fSAndroid Build Coastguard Worker public: 176*795d594fSAndroid Build Coastguard Worker RuntimeCallbacks(); 177*795d594fSAndroid Build Coastguard Worker 178*795d594fSAndroid Build Coastguard Worker void AddThreadLifecycleCallback(ThreadLifecycleCallback* cb) REQUIRES(Locks::mutator_lock_); 179*795d594fSAndroid Build Coastguard Worker void RemoveThreadLifecycleCallback(ThreadLifecycleCallback* cb) REQUIRES(Locks::mutator_lock_); 180*795d594fSAndroid Build Coastguard Worker 181*795d594fSAndroid Build Coastguard Worker void ThreadStart(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_); 182*795d594fSAndroid Build Coastguard Worker void ThreadDeath(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_); 183*795d594fSAndroid Build Coastguard Worker 184*795d594fSAndroid Build Coastguard Worker void AddClassLoadCallback(ClassLoadCallback* cb) REQUIRES(Locks::mutator_lock_); 185*795d594fSAndroid Build Coastguard Worker void RemoveClassLoadCallback(ClassLoadCallback* cb) REQUIRES(Locks::mutator_lock_); 186*795d594fSAndroid Build Coastguard Worker 187*795d594fSAndroid Build Coastguard Worker void BeginDefineClass() REQUIRES_SHARED(Locks::mutator_lock_); 188*795d594fSAndroid Build Coastguard Worker void EndDefineClass() REQUIRES_SHARED(Locks::mutator_lock_); 189*795d594fSAndroid Build Coastguard Worker void ClassLoad(Handle<mirror::Class> klass) REQUIRES_SHARED(Locks::mutator_lock_); 190*795d594fSAndroid Build Coastguard Worker void ClassPrepare(Handle<mirror::Class> temp_klass, Handle<mirror::Class> klass) 191*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 192*795d594fSAndroid Build Coastguard Worker 193*795d594fSAndroid Build Coastguard Worker void AddRuntimeSigQuitCallback(RuntimeSigQuitCallback* cb) 194*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::mutator_lock_); 195*795d594fSAndroid Build Coastguard Worker void RemoveRuntimeSigQuitCallback(RuntimeSigQuitCallback* cb) 196*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::mutator_lock_); 197*795d594fSAndroid Build Coastguard Worker 198*795d594fSAndroid Build Coastguard Worker void SigQuit() REQUIRES_SHARED(Locks::mutator_lock_); 199*795d594fSAndroid Build Coastguard Worker 200*795d594fSAndroid Build Coastguard Worker void AddRuntimePhaseCallback(RuntimePhaseCallback* cb) 201*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::mutator_lock_); 202*795d594fSAndroid Build Coastguard Worker void RemoveRuntimePhaseCallback(RuntimePhaseCallback* cb) 203*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::mutator_lock_); 204*795d594fSAndroid Build Coastguard Worker 205*795d594fSAndroid Build Coastguard Worker void NextRuntimePhase(RuntimePhaseCallback::RuntimePhase phase) 206*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 207*795d594fSAndroid Build Coastguard Worker 208*795d594fSAndroid Build Coastguard Worker void ClassPreDefine(const char* descriptor, 209*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> temp_class, 210*795d594fSAndroid Build Coastguard Worker Handle<mirror::ClassLoader> loader, 211*795d594fSAndroid Build Coastguard Worker const DexFile& initial_dex_file, 212*795d594fSAndroid Build Coastguard Worker const dex::ClassDef& initial_class_def, 213*795d594fSAndroid Build Coastguard Worker /*out*/DexFile const** final_dex_file, 214*795d594fSAndroid Build Coastguard Worker /*out*/dex::ClassDef const** final_class_def) 215*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 216*795d594fSAndroid Build Coastguard Worker 217*795d594fSAndroid Build Coastguard Worker void AddMethodCallback(MethodCallback* cb) REQUIRES(Locks::mutator_lock_); 218*795d594fSAndroid Build Coastguard Worker void RemoveMethodCallback(MethodCallback* cb) REQUIRES(Locks::mutator_lock_); 219*795d594fSAndroid Build Coastguard Worker 220*795d594fSAndroid Build Coastguard Worker void RegisterNativeMethod(ArtMethod* method, 221*795d594fSAndroid Build Coastguard Worker const void* original_implementation, 222*795d594fSAndroid Build Coastguard Worker /*out*/void** new_implementation) 223*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 224*795d594fSAndroid Build Coastguard Worker 225*795d594fSAndroid Build Coastguard Worker void MonitorContendedLocking(Monitor* m) REQUIRES_SHARED(Locks::mutator_lock_); 226*795d594fSAndroid Build Coastguard Worker void MonitorContendedLocked(Monitor* m) REQUIRES_SHARED(Locks::mutator_lock_); 227*795d594fSAndroid Build Coastguard Worker void ObjectWaitStart(Handle<mirror::Object> m, int64_t timeout) 228*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 229*795d594fSAndroid Build Coastguard Worker void MonitorWaitFinished(Monitor* m, bool timed_out) 230*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 231*795d594fSAndroid Build Coastguard Worker 232*795d594fSAndroid Build Coastguard Worker void AddMonitorCallback(MonitorCallback* cb) REQUIRES_SHARED(Locks::mutator_lock_); 233*795d594fSAndroid Build Coastguard Worker void RemoveMonitorCallback(MonitorCallback* cb) REQUIRES_SHARED(Locks::mutator_lock_); 234*795d594fSAndroid Build Coastguard Worker 235*795d594fSAndroid Build Coastguard Worker void ThreadParkStart(bool is_absolute, int64_t timeout) REQUIRES_SHARED(Locks::mutator_lock_); 236*795d594fSAndroid Build Coastguard Worker void ThreadParkFinished(bool timed_out) REQUIRES_SHARED(Locks::mutator_lock_); 237*795d594fSAndroid Build Coastguard Worker void AddParkCallback(ParkCallback* cb) REQUIRES_SHARED(Locks::mutator_lock_); 238*795d594fSAndroid Build Coastguard Worker void RemoveParkCallback(ParkCallback* cb) REQUIRES_SHARED(Locks::mutator_lock_); 239*795d594fSAndroid Build Coastguard Worker 240*795d594fSAndroid Build Coastguard Worker // Returns true if any locals have changed. This is used to prevent OSRing frames that have 241*795d594fSAndroid Build Coastguard Worker // some locals changed. 242*795d594fSAndroid Build Coastguard Worker bool HaveLocalsChanged() REQUIRES_SHARED(Locks::mutator_lock_); 243*795d594fSAndroid Build Coastguard Worker 244*795d594fSAndroid Build Coastguard Worker void AddMethodInspectionCallback(MethodInspectionCallback* cb) 245*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 246*795d594fSAndroid Build Coastguard Worker void RemoveMethodInspectionCallback(MethodInspectionCallback* cb) 247*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 248*795d594fSAndroid Build Coastguard Worker 249*795d594fSAndroid Build Coastguard Worker // DDMS callbacks 250*795d594fSAndroid Build Coastguard Worker void DdmPublishChunk(uint32_t type, const ArrayRef<const uint8_t>& data) 251*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 252*795d594fSAndroid Build Coastguard Worker 253*795d594fSAndroid Build Coastguard Worker void AddDdmCallback(DdmCallback* cb) REQUIRES_SHARED(Locks::mutator_lock_); 254*795d594fSAndroid Build Coastguard Worker void RemoveDdmCallback(DdmCallback* cb) REQUIRES_SHARED(Locks::mutator_lock_); 255*795d594fSAndroid Build Coastguard Worker 256*795d594fSAndroid Build Coastguard Worker void SetCurrentProcessName(const std::string& process_name) REQUIRES_SHARED(Locks::mutator_lock_); 257*795d594fSAndroid Build Coastguard Worker void AddApplication(const std::string& package_name) REQUIRES_SHARED(Locks::mutator_lock_); 258*795d594fSAndroid Build Coastguard Worker void RemoveApplication(const std::string& package_name) REQUIRES_SHARED(Locks::mutator_lock_); 259*795d594fSAndroid Build Coastguard Worker void SetWaitingForDebugger(bool waiting) REQUIRES_SHARED(Locks::mutator_lock_); 260*795d594fSAndroid Build Coastguard Worker void SetUserId(int uid) REQUIRES_SHARED(Locks::mutator_lock_); 261*795d594fSAndroid Build Coastguard Worker 262*795d594fSAndroid Build Coastguard Worker void AddAppInfoCallback(AppInfoCallback* cb) REQUIRES_SHARED(Locks::mutator_lock_); 263*795d594fSAndroid Build Coastguard Worker void RemoveAppInfoCallback(AppInfoCallback* cb) REQUIRES_SHARED(Locks::mutator_lock_); 264*795d594fSAndroid Build Coastguard Worker 265*795d594fSAndroid Build Coastguard Worker void StartDebugger() REQUIRES_SHARED(Locks::mutator_lock_); 266*795d594fSAndroid Build Coastguard Worker // NO_THREAD_SAFETY_ANALYSIS since this is only called when we are in the middle of shutting down 267*795d594fSAndroid Build Coastguard Worker // and the mutator_lock_ is no longer acquirable. 268*795d594fSAndroid Build Coastguard Worker void StopDebugger() NO_THREAD_SAFETY_ANALYSIS; 269*795d594fSAndroid Build Coastguard Worker bool IsDebuggerConfigured() REQUIRES_SHARED(Locks::mutator_lock_); 270*795d594fSAndroid Build Coastguard Worker 271*795d594fSAndroid Build Coastguard Worker void AddDebuggerControlCallback(DebuggerControlCallback* cb) 272*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 273*795d594fSAndroid Build Coastguard Worker void RemoveDebuggerControlCallback(DebuggerControlCallback* cb) 274*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 275*795d594fSAndroid Build Coastguard Worker 276*795d594fSAndroid Build Coastguard Worker void VisitReflectiveTargets(ReflectiveValueVisitor* visitor) REQUIRES(Locks::mutator_lock_); 277*795d594fSAndroid Build Coastguard Worker 278*795d594fSAndroid Build Coastguard Worker void AddReflectiveValueVisitCallback(ReflectiveValueVisitCallback* cb) 279*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 280*795d594fSAndroid Build Coastguard Worker void RemoveReflectiveValueVisitCallback(ReflectiveValueVisitCallback* cb) 281*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 282*795d594fSAndroid Build Coastguard Worker 283*795d594fSAndroid Build Coastguard Worker private: 284*795d594fSAndroid Build Coastguard Worker std::unique_ptr<ReaderWriterMutex> callback_lock_ BOTTOM_MUTEX_ACQUIRED_AFTER; 285*795d594fSAndroid Build Coastguard Worker 286*795d594fSAndroid Build Coastguard Worker std::vector<ThreadLifecycleCallback*> thread_callbacks_ 287*795d594fSAndroid Build Coastguard Worker GUARDED_BY(callback_lock_); 288*795d594fSAndroid Build Coastguard Worker std::vector<ClassLoadCallback*> class_callbacks_ 289*795d594fSAndroid Build Coastguard Worker GUARDED_BY(callback_lock_); 290*795d594fSAndroid Build Coastguard Worker std::vector<RuntimeSigQuitCallback*> sigquit_callbacks_ 291*795d594fSAndroid Build Coastguard Worker GUARDED_BY(callback_lock_); 292*795d594fSAndroid Build Coastguard Worker std::vector<RuntimePhaseCallback*> phase_callbacks_ 293*795d594fSAndroid Build Coastguard Worker GUARDED_BY(callback_lock_); 294*795d594fSAndroid Build Coastguard Worker std::vector<MethodCallback*> method_callbacks_ 295*795d594fSAndroid Build Coastguard Worker GUARDED_BY(callback_lock_); 296*795d594fSAndroid Build Coastguard Worker std::vector<MonitorCallback*> monitor_callbacks_ 297*795d594fSAndroid Build Coastguard Worker GUARDED_BY(callback_lock_); 298*795d594fSAndroid Build Coastguard Worker std::vector<ParkCallback*> park_callbacks_ 299*795d594fSAndroid Build Coastguard Worker GUARDED_BY(callback_lock_); 300*795d594fSAndroid Build Coastguard Worker std::vector<MethodInspectionCallback*> method_inspection_callbacks_ 301*795d594fSAndroid Build Coastguard Worker GUARDED_BY(callback_lock_); 302*795d594fSAndroid Build Coastguard Worker std::vector<DdmCallback*> ddm_callbacks_ 303*795d594fSAndroid Build Coastguard Worker GUARDED_BY(callback_lock_); 304*795d594fSAndroid Build Coastguard Worker std::vector<AppInfoCallback*> appinfo_callbacks_ GUARDED_BY(callback_lock_); 305*795d594fSAndroid Build Coastguard Worker std::vector<DebuggerControlCallback*> debugger_control_callbacks_ 306*795d594fSAndroid Build Coastguard Worker GUARDED_BY(callback_lock_); 307*795d594fSAndroid Build Coastguard Worker std::vector<ReflectiveValueVisitCallback*> reflective_value_visit_callbacks_ 308*795d594fSAndroid Build Coastguard Worker GUARDED_BY(callback_lock_); 309*795d594fSAndroid Build Coastguard Worker }; 310*795d594fSAndroid Build Coastguard Worker 311*795d594fSAndroid Build Coastguard Worker } // namespace art 312*795d594fSAndroid Build Coastguard Worker 313*795d594fSAndroid Build Coastguard Worker #endif // ART_RUNTIME_RUNTIME_CALLBACKS_H_ 314