xref: /aosp_15_r20/art/runtime/runtime_callbacks.h (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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