xref: /aosp_15_r20/external/oj-libjdwp/src/share/back/util.h (revision e82f7db8c62aed3c168547abe4f9f4aeceaebfc7)
1*e82f7db8SAndroid Build Coastguard Worker /*
2*e82f7db8SAndroid Build Coastguard Worker  * Copyright (c) 1998, 2005, Oracle and/or its affiliates. All rights reserved.
3*e82f7db8SAndroid Build Coastguard Worker  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*e82f7db8SAndroid Build Coastguard Worker  *
5*e82f7db8SAndroid Build Coastguard Worker  * This code is free software; you can redistribute it and/or modify it
6*e82f7db8SAndroid Build Coastguard Worker  * under the terms of the GNU General Public License version 2 only, as
7*e82f7db8SAndroid Build Coastguard Worker  * published by the Free Software Foundation.  Oracle designates this
8*e82f7db8SAndroid Build Coastguard Worker  * particular file as subject to the "Classpath" exception as provided
9*e82f7db8SAndroid Build Coastguard Worker  * by Oracle in the LICENSE file that accompanied this code.
10*e82f7db8SAndroid Build Coastguard Worker  *
11*e82f7db8SAndroid Build Coastguard Worker  * This code is distributed in the hope that it will be useful, but WITHOUT
12*e82f7db8SAndroid Build Coastguard Worker  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13*e82f7db8SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14*e82f7db8SAndroid Build Coastguard Worker  * version 2 for more details (a copy is included in the LICENSE file that
15*e82f7db8SAndroid Build Coastguard Worker  * accompanied this code).
16*e82f7db8SAndroid Build Coastguard Worker  *
17*e82f7db8SAndroid Build Coastguard Worker  * You should have received a copy of the GNU General Public License version
18*e82f7db8SAndroid Build Coastguard Worker  * 2 along with this work; if not, write to the Free Software Foundation,
19*e82f7db8SAndroid Build Coastguard Worker  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20*e82f7db8SAndroid Build Coastguard Worker  *
21*e82f7db8SAndroid Build Coastguard Worker  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22*e82f7db8SAndroid Build Coastguard Worker  * or visit www.oracle.com if you need additional information or have any
23*e82f7db8SAndroid Build Coastguard Worker  * questions.
24*e82f7db8SAndroid Build Coastguard Worker  */
25*e82f7db8SAndroid Build Coastguard Worker 
26*e82f7db8SAndroid Build Coastguard Worker #ifndef JDWP_UTIL_H
27*e82f7db8SAndroid Build Coastguard Worker #define JDWP_UTIL_H
28*e82f7db8SAndroid Build Coastguard Worker 
29*e82f7db8SAndroid Build Coastguard Worker #include <stddef.h>
30*e82f7db8SAndroid Build Coastguard Worker #include <stdio.h>
31*e82f7db8SAndroid Build Coastguard Worker #include <string.h>
32*e82f7db8SAndroid Build Coastguard Worker #include <stdlib.h>
33*e82f7db8SAndroid Build Coastguard Worker #include <stdarg.h>
34*e82f7db8SAndroid Build Coastguard Worker 
35*e82f7db8SAndroid Build Coastguard Worker #ifdef DEBUG
36*e82f7db8SAndroid Build Coastguard Worker     /* Just to make sure these interfaces are not used here. */
37*e82f7db8SAndroid Build Coastguard Worker     #undef free
38*e82f7db8SAndroid Build Coastguard Worker     #define free(p) Do not use this interface.
39*e82f7db8SAndroid Build Coastguard Worker     #undef malloc
40*e82f7db8SAndroid Build Coastguard Worker     #define malloc(p) Do not use this interface.
41*e82f7db8SAndroid Build Coastguard Worker     #undef calloc
42*e82f7db8SAndroid Build Coastguard Worker     #define calloc(p) Do not use this interface.
43*e82f7db8SAndroid Build Coastguard Worker     #undef realloc
44*e82f7db8SAndroid Build Coastguard Worker     #define realloc(p) Do not use this interface.
45*e82f7db8SAndroid Build Coastguard Worker     #undef strdup
46*e82f7db8SAndroid Build Coastguard Worker     #define strdup(p) Do not use this interface.
47*e82f7db8SAndroid Build Coastguard Worker #endif
48*e82f7db8SAndroid Build Coastguard Worker 
49*e82f7db8SAndroid Build Coastguard Worker #include "log_messages.h"
50*e82f7db8SAndroid Build Coastguard Worker #include "vm_interface.h"
51*e82f7db8SAndroid Build Coastguard Worker #include "JDWP.h"
52*e82f7db8SAndroid Build Coastguard Worker #include "util_md.h"
53*e82f7db8SAndroid Build Coastguard Worker #include "error_messages.h"
54*e82f7db8SAndroid Build Coastguard Worker #include "debugInit.h"
55*e82f7db8SAndroid Build Coastguard Worker 
56*e82f7db8SAndroid Build Coastguard Worker /* Get access to Native Platform Toolkit functions */
57*e82f7db8SAndroid Build Coastguard Worker #include "npt.h"
58*e82f7db8SAndroid Build Coastguard Worker 
59*e82f7db8SAndroid Build Coastguard Worker /* ANDROID-CHANGED: We want to avoid allocating jweaks on android so if !isStrong we will use the
60*e82f7db8SAndroid Build Coastguard Worker  * node-pointer tag as the weak-reference.
61*e82f7db8SAndroid Build Coastguard Worker  */
62*e82f7db8SAndroid Build Coastguard Worker /* Definition of a CommonRef tracked by the backend for the frontend */
63*e82f7db8SAndroid Build Coastguard Worker typedef struct RefNode {
64*e82f7db8SAndroid Build Coastguard Worker     jlong        seqNum;        /* ID of reference, also key for hash table */
65*e82f7db8SAndroid Build Coastguard Worker     jobject      ref;           /* ANDROID-CHANGED: Always the strong reference if isStrong, NULL
66*e82f7db8SAndroid Build Coastguard Worker                                  * otherwise.
67*e82f7db8SAndroid Build Coastguard Worker                                  */
68*e82f7db8SAndroid Build Coastguard Worker     struct RefNode *next;       /* next RefNode* in bucket chain */
69*e82f7db8SAndroid Build Coastguard Worker     struct RefNode *prev;       /* ANDROID-CHANGED: Previous RefNode* in bucket chain. Used to allow
70*e82f7db8SAndroid Build Coastguard Worker                                  * us to remove arbitrary elements. */
71*e82f7db8SAndroid Build Coastguard Worker     jint         count;         /* count of references */
72*e82f7db8SAndroid Build Coastguard Worker     unsigned     isStrong : 1;  /* 1 means this is a strong reference */
73*e82f7db8SAndroid Build Coastguard Worker } RefNode;
74*e82f7db8SAndroid Build Coastguard Worker 
75*e82f7db8SAndroid Build Coastguard Worker /* Value of a NULL ID */
76*e82f7db8SAndroid Build Coastguard Worker #define NULL_OBJECT_ID  ((jlong)0)
77*e82f7db8SAndroid Build Coastguard Worker 
78*e82f7db8SAndroid Build Coastguard Worker /*
79*e82f7db8SAndroid Build Coastguard Worker  * Globals used throughout the back end
80*e82f7db8SAndroid Build Coastguard Worker  */
81*e82f7db8SAndroid Build Coastguard Worker 
82*e82f7db8SAndroid Build Coastguard Worker typedef jint FrameNumber;
83*e82f7db8SAndroid Build Coastguard Worker 
84*e82f7db8SAndroid Build Coastguard Worker // ANDROID-CHANGED: support for DDMS extension apis.
85*e82f7db8SAndroid Build Coastguard Worker typedef jvmtiError (*DdmProcessChunk)(jvmtiEnv* jvmti,
86*e82f7db8SAndroid Build Coastguard Worker                                       jint type_in,
87*e82f7db8SAndroid Build Coastguard Worker                                       jint length_in,
88*e82f7db8SAndroid Build Coastguard Worker                                       const jbyte* data_in,
89*e82f7db8SAndroid Build Coastguard Worker                                       jint* type_out,
90*e82f7db8SAndroid Build Coastguard Worker                                       jint* length_out,
91*e82f7db8SAndroid Build Coastguard Worker                                       jbyte** data_out);
92*e82f7db8SAndroid Build Coastguard Worker typedef jvmtiError (*RawMonitorEnterNoSuspend)(jvmtiEnv* env, jrawMonitorID mon);
93*e82f7db8SAndroid Build Coastguard Worker 
94*e82f7db8SAndroid Build Coastguard Worker typedef struct {
95*e82f7db8SAndroid Build Coastguard Worker     jvmtiEnv *jvmti;
96*e82f7db8SAndroid Build Coastguard Worker     JavaVM   *jvm;
97*e82f7db8SAndroid Build Coastguard Worker     volatile jboolean vmDead; /* Once VM is dead it stays that way - don't put in init */
98*e82f7db8SAndroid Build Coastguard Worker     jboolean assertOn;
99*e82f7db8SAndroid Build Coastguard Worker     jboolean assertFatal;
100*e82f7db8SAndroid Build Coastguard Worker     jboolean doerrorexit;
101*e82f7db8SAndroid Build Coastguard Worker     jboolean modifiedUtf8;
102*e82f7db8SAndroid Build Coastguard Worker     jboolean quiet;
103*e82f7db8SAndroid Build Coastguard Worker 
104*e82f7db8SAndroid Build Coastguard Worker     /* Debug flags (bit mask) */
105*e82f7db8SAndroid Build Coastguard Worker     int      debugflags;
106*e82f7db8SAndroid Build Coastguard Worker 
107*e82f7db8SAndroid Build Coastguard Worker     /* Possible debug flags */
108*e82f7db8SAndroid Build Coastguard Worker     #define USE_ITERATE_THROUGH_HEAP 0X001
109*e82f7db8SAndroid Build Coastguard Worker 
110*e82f7db8SAndroid Build Coastguard Worker     char * options;
111*e82f7db8SAndroid Build Coastguard Worker 
112*e82f7db8SAndroid Build Coastguard Worker     jclass              classClass;
113*e82f7db8SAndroid Build Coastguard Worker     jclass              threadClass;
114*e82f7db8SAndroid Build Coastguard Worker     jclass              threadGroupClass;
115*e82f7db8SAndroid Build Coastguard Worker     jclass              classLoaderClass;
116*e82f7db8SAndroid Build Coastguard Worker     jclass              stringClass;
117*e82f7db8SAndroid Build Coastguard Worker     jclass              systemClass;
118*e82f7db8SAndroid Build Coastguard Worker     jmethodID           threadConstructor;
119*e82f7db8SAndroid Build Coastguard Worker     jmethodID           threadSetDaemon;
120*e82f7db8SAndroid Build Coastguard Worker     jmethodID           threadResume;
121*e82f7db8SAndroid Build Coastguard Worker     jmethodID           systemGetProperty;
122*e82f7db8SAndroid Build Coastguard Worker     jmethodID           setProperty;
123*e82f7db8SAndroid Build Coastguard Worker     jthreadGroup        systemThreadGroup;
124*e82f7db8SAndroid Build Coastguard Worker     jobject             agent_properties;
125*e82f7db8SAndroid Build Coastguard Worker 
126*e82f7db8SAndroid Build Coastguard Worker     jint                cachedJvmtiVersion;
127*e82f7db8SAndroid Build Coastguard Worker     jvmtiCapabilities   cachedJvmtiCapabilities;
128*e82f7db8SAndroid Build Coastguard Worker     jboolean            haveCachedJvmtiCapabilities;
129*e82f7db8SAndroid Build Coastguard Worker     jvmtiEventCallbacks callbacks;
130*e82f7db8SAndroid Build Coastguard Worker 
131*e82f7db8SAndroid Build Coastguard Worker     /* Various property values we should grab on initialization */
132*e82f7db8SAndroid Build Coastguard Worker     char* property_java_version;          /* UTF8 java.version */
133*e82f7db8SAndroid Build Coastguard Worker     char* property_java_vm_name;          /* UTF8 java.vm.name */
134*e82f7db8SAndroid Build Coastguard Worker     char* property_java_vm_info;          /* UTF8 java.vm.info */
135*e82f7db8SAndroid Build Coastguard Worker     char* property_java_class_path;       /* UTF8 java.class.path */
136*e82f7db8SAndroid Build Coastguard Worker     char* property_sun_boot_class_path;   /* UTF8 sun.boot.class.path */
137*e82f7db8SAndroid Build Coastguard Worker     char* property_sun_boot_library_path; /* UTF8 sun.boot.library.path */
138*e82f7db8SAndroid Build Coastguard Worker     char* property_path_separator;        /* UTF8 path.separator */
139*e82f7db8SAndroid Build Coastguard Worker     char* property_user_dir;              /* UTF8 user.dir */
140*e82f7db8SAndroid Build Coastguard Worker 
141*e82f7db8SAndroid Build Coastguard Worker     unsigned log_flags;
142*e82f7db8SAndroid Build Coastguard Worker 
143*e82f7db8SAndroid Build Coastguard Worker     /* The Native Platform Toolkit access */
144*e82f7db8SAndroid Build Coastguard Worker     NptEnv *npt;
145*e82f7db8SAndroid Build Coastguard Worker 
146*e82f7db8SAndroid Build Coastguard Worker     /* Common References static data */
147*e82f7db8SAndroid Build Coastguard Worker     jrawMonitorID refLock;
148*e82f7db8SAndroid Build Coastguard Worker     jlong         nextSeqNum;
149*e82f7db8SAndroid Build Coastguard Worker     RefNode     **objectsByID;
150*e82f7db8SAndroid Build Coastguard Worker     int           objectsByIDsize;
151*e82f7db8SAndroid Build Coastguard Worker     int           objectsByIDcount;
152*e82f7db8SAndroid Build Coastguard Worker 
153*e82f7db8SAndroid Build Coastguard Worker      /* Indication that the agent has been loaded */
154*e82f7db8SAndroid Build Coastguard Worker      jboolean isLoaded;
155*e82f7db8SAndroid Build Coastguard Worker 
156*e82f7db8SAndroid Build Coastguard Worker      /* ANDROID-CHANGED: com.android.art.internal.ddm.process_chunk extension function */
157*e82f7db8SAndroid Build Coastguard Worker      DdmProcessChunk ddm_process_chunk;
158*e82f7db8SAndroid Build Coastguard Worker      RawMonitorEnterNoSuspend raw_monitor_enter_no_suspend;
159*e82f7db8SAndroid Build Coastguard Worker 
160*e82f7db8SAndroid Build Coastguard Worker      /* ANDROID-CHANGED: Need to keep track of if ddm is initially active. */
161*e82f7db8SAndroid Build Coastguard Worker      jboolean ddmInitiallyActive;
162*e82f7db8SAndroid Build Coastguard Worker 
163*e82f7db8SAndroid Build Coastguard Worker } BackendGlobalData;
164*e82f7db8SAndroid Build Coastguard Worker 
165*e82f7db8SAndroid Build Coastguard Worker extern BackendGlobalData * gdata;
166*e82f7db8SAndroid Build Coastguard Worker 
167*e82f7db8SAndroid Build Coastguard Worker /*
168*e82f7db8SAndroid Build Coastguard Worker  * Event Index for handlers
169*e82f7db8SAndroid Build Coastguard Worker  */
170*e82f7db8SAndroid Build Coastguard Worker 
171*e82f7db8SAndroid Build Coastguard Worker typedef enum {
172*e82f7db8SAndroid Build Coastguard Worker         EI_min                  =  1,
173*e82f7db8SAndroid Build Coastguard Worker 
174*e82f7db8SAndroid Build Coastguard Worker         EI_SINGLE_STEP          =  1,
175*e82f7db8SAndroid Build Coastguard Worker         EI_BREAKPOINT           =  2,
176*e82f7db8SAndroid Build Coastguard Worker         EI_FRAME_POP            =  3,
177*e82f7db8SAndroid Build Coastguard Worker         EI_EXCEPTION            =  4,
178*e82f7db8SAndroid Build Coastguard Worker         EI_THREAD_START         =  5,
179*e82f7db8SAndroid Build Coastguard Worker         EI_THREAD_END           =  6,
180*e82f7db8SAndroid Build Coastguard Worker         EI_CLASS_PREPARE        =  7,
181*e82f7db8SAndroid Build Coastguard Worker         EI_GC_FINISH            =  8,
182*e82f7db8SAndroid Build Coastguard Worker         EI_CLASS_LOAD           =  9,
183*e82f7db8SAndroid Build Coastguard Worker         EI_FIELD_ACCESS         = 10,
184*e82f7db8SAndroid Build Coastguard Worker         EI_FIELD_MODIFICATION   = 11,
185*e82f7db8SAndroid Build Coastguard Worker         EI_EXCEPTION_CATCH      = 12,
186*e82f7db8SAndroid Build Coastguard Worker         EI_METHOD_ENTRY         = 13,
187*e82f7db8SAndroid Build Coastguard Worker         EI_METHOD_EXIT          = 14,
188*e82f7db8SAndroid Build Coastguard Worker         EI_MONITOR_CONTENDED_ENTER = 15,
189*e82f7db8SAndroid Build Coastguard Worker         EI_MONITOR_CONTENDED_ENTERED = 16,
190*e82f7db8SAndroid Build Coastguard Worker         EI_MONITOR_WAIT         = 17,
191*e82f7db8SAndroid Build Coastguard Worker         EI_MONITOR_WAITED       = 18,
192*e82f7db8SAndroid Build Coastguard Worker         EI_VM_INIT              = 19,
193*e82f7db8SAndroid Build Coastguard Worker         EI_VM_DEATH             = 20,
194*e82f7db8SAndroid Build Coastguard Worker         EI_max                  = 20
195*e82f7db8SAndroid Build Coastguard Worker } EventIndex;
196*e82f7db8SAndroid Build Coastguard Worker 
197*e82f7db8SAndroid Build Coastguard Worker /* Agent errors that might be in a jvmtiError for JDWP or internal.
198*e82f7db8SAndroid Build Coastguard Worker  *    (Done this way so that compiler allows it's use as a jvmtiError)
199*e82f7db8SAndroid Build Coastguard Worker  */
200*e82f7db8SAndroid Build Coastguard Worker #define _AGENT_ERROR(x)                 ((jvmtiError)(JVMTI_ERROR_MAX+64+x))
201*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_INTERNAL                    _AGENT_ERROR(1)
202*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_VM_DEAD                     _AGENT_ERROR(2)
203*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_NO_JNI_ENV                  _AGENT_ERROR(3)
204*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_JNI_EXCEPTION               _AGENT_ERROR(4)
205*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_JVMTI_INTERNAL              _AGENT_ERROR(5)
206*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_JDWP_INTERNAL               _AGENT_ERROR(6)
207*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_NOT_CURRENT_FRAME           _AGENT_ERROR(7)
208*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_OUT_OF_MEMORY               _AGENT_ERROR(8)
209*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_INVALID_TAG                 _AGENT_ERROR(9)
210*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_ALREADY_INVOKING            _AGENT_ERROR(10)
211*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_INVALID_INDEX               _AGENT_ERROR(11)
212*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_INVALID_LENGTH              _AGENT_ERROR(12)
213*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_INVALID_STRING              _AGENT_ERROR(13)
214*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_INVALID_CLASS_LOADER        _AGENT_ERROR(14)
215*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_INVALID_ARRAY               _AGENT_ERROR(15)
216*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_TRANSPORT_LOAD              _AGENT_ERROR(16)
217*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_TRANSPORT_INIT              _AGENT_ERROR(17)
218*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_NATIVE_METHOD               _AGENT_ERROR(18)
219*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_INVALID_COUNT               _AGENT_ERROR(19)
220*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_INVALID_FRAMEID             _AGENT_ERROR(20)
221*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_NULL_POINTER                _AGENT_ERROR(21)
222*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_ILLEGAL_ARGUMENT            _AGENT_ERROR(22)
223*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_INVALID_THREAD              _AGENT_ERROR(23)
224*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_INVALID_EVENT_TYPE          _AGENT_ERROR(24)
225*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_INVALID_OBJECT              _AGENT_ERROR(25)
226*e82f7db8SAndroid Build Coastguard Worker #define AGENT_ERROR_NO_MORE_FRAMES              _AGENT_ERROR(26)
227*e82f7db8SAndroid Build Coastguard Worker 
228*e82f7db8SAndroid Build Coastguard Worker /* Combined event information */
229*e82f7db8SAndroid Build Coastguard Worker 
230*e82f7db8SAndroid Build Coastguard Worker typedef struct {
231*e82f7db8SAndroid Build Coastguard Worker 
232*e82f7db8SAndroid Build Coastguard Worker     EventIndex  ei;
233*e82f7db8SAndroid Build Coastguard Worker     jthread     thread;
234*e82f7db8SAndroid Build Coastguard Worker     jclass      clazz;
235*e82f7db8SAndroid Build Coastguard Worker     jmethodID   method;
236*e82f7db8SAndroid Build Coastguard Worker     jlocation   location;
237*e82f7db8SAndroid Build Coastguard Worker     jobject     object; /* possibly an exception or user object */
238*e82f7db8SAndroid Build Coastguard Worker 
239*e82f7db8SAndroid Build Coastguard Worker     union {
240*e82f7db8SAndroid Build Coastguard Worker 
241*e82f7db8SAndroid Build Coastguard Worker         /* ei = EI_FIELD_ACCESS */
242*e82f7db8SAndroid Build Coastguard Worker         struct {
243*e82f7db8SAndroid Build Coastguard Worker             jclass      field_clazz;
244*e82f7db8SAndroid Build Coastguard Worker             jfieldID    field;
245*e82f7db8SAndroid Build Coastguard Worker         } field_access;
246*e82f7db8SAndroid Build Coastguard Worker 
247*e82f7db8SAndroid Build Coastguard Worker         /* ei = EI_FIELD_MODIFICATION */
248*e82f7db8SAndroid Build Coastguard Worker         struct {
249*e82f7db8SAndroid Build Coastguard Worker             jclass      field_clazz;
250*e82f7db8SAndroid Build Coastguard Worker             jfieldID    field;
251*e82f7db8SAndroid Build Coastguard Worker             char        signature_type;
252*e82f7db8SAndroid Build Coastguard Worker             jvalue      new_value;
253*e82f7db8SAndroid Build Coastguard Worker         } field_modification;
254*e82f7db8SAndroid Build Coastguard Worker 
255*e82f7db8SAndroid Build Coastguard Worker         /* ei = EI_EXCEPTION */
256*e82f7db8SAndroid Build Coastguard Worker         struct {
257*e82f7db8SAndroid Build Coastguard Worker             jclass      catch_clazz;
258*e82f7db8SAndroid Build Coastguard Worker             jmethodID   catch_method;
259*e82f7db8SAndroid Build Coastguard Worker             jlocation   catch_location;
260*e82f7db8SAndroid Build Coastguard Worker         } exception;
261*e82f7db8SAndroid Build Coastguard Worker 
262*e82f7db8SAndroid Build Coastguard Worker         /* ei = EI_METHOD_EXIT */
263*e82f7db8SAndroid Build Coastguard Worker         struct {
264*e82f7db8SAndroid Build Coastguard Worker             jvalue      return_value;
265*e82f7db8SAndroid Build Coastguard Worker         } method_exit;
266*e82f7db8SAndroid Build Coastguard Worker 
267*e82f7db8SAndroid Build Coastguard Worker         /* For monitor wait events */
268*e82f7db8SAndroid Build Coastguard Worker         union {
269*e82f7db8SAndroid Build Coastguard Worker             /* ei = EI_MONITOR_WAIT */
270*e82f7db8SAndroid Build Coastguard Worker             jlong timeout;
271*e82f7db8SAndroid Build Coastguard Worker             /* ei = EI_MONITOR_WAITED */
272*e82f7db8SAndroid Build Coastguard Worker             jboolean timed_out;
273*e82f7db8SAndroid Build Coastguard Worker         } monitor;
274*e82f7db8SAndroid Build Coastguard Worker     } u;
275*e82f7db8SAndroid Build Coastguard Worker 
276*e82f7db8SAndroid Build Coastguard Worker } EventInfo;
277*e82f7db8SAndroid Build Coastguard Worker 
278*e82f7db8SAndroid Build Coastguard Worker /* Structure to hold dynamic array of objects */
279*e82f7db8SAndroid Build Coastguard Worker typedef struct ObjectBatch {
280*e82f7db8SAndroid Build Coastguard Worker     jobject *objects;
281*e82f7db8SAndroid Build Coastguard Worker     jint     count;
282*e82f7db8SAndroid Build Coastguard Worker } ObjectBatch;
283*e82f7db8SAndroid Build Coastguard Worker 
284*e82f7db8SAndroid Build Coastguard Worker /*
285*e82f7db8SAndroid Build Coastguard Worker  * JNI signature constants, beyond those defined in JDWP_TAG(*)
286*e82f7db8SAndroid Build Coastguard Worker  */
287*e82f7db8SAndroid Build Coastguard Worker #define SIGNATURE_BEGIN_ARGS    '('
288*e82f7db8SAndroid Build Coastguard Worker #define SIGNATURE_END_ARGS      ')'
289*e82f7db8SAndroid Build Coastguard Worker #define SIGNATURE_END_CLASS     ';'
290*e82f7db8SAndroid Build Coastguard Worker 
291*e82f7db8SAndroid Build Coastguard Worker /*
292*e82f7db8SAndroid Build Coastguard Worker  * Modifier flags for classes, fields, methods
293*e82f7db8SAndroid Build Coastguard Worker  */
294*e82f7db8SAndroid Build Coastguard Worker #define MOD_PUBLIC       0x0001     /* visible to everyone */
295*e82f7db8SAndroid Build Coastguard Worker #define MOD_PRIVATE      0x0002     /* visible only to the defining class */
296*e82f7db8SAndroid Build Coastguard Worker #define MOD_PROTECTED    0x0004     /* visible to subclasses */
297*e82f7db8SAndroid Build Coastguard Worker #define MOD_STATIC       0x0008     /* instance variable is static */
298*e82f7db8SAndroid Build Coastguard Worker #define MOD_FINAL        0x0010     /* no further subclassing, overriding */
299*e82f7db8SAndroid Build Coastguard Worker #define MOD_SYNCHRONIZED 0x0020     /* wrap method call in monitor lock */
300*e82f7db8SAndroid Build Coastguard Worker #define MOD_VOLATILE     0x0040     /* can cache in registers */
301*e82f7db8SAndroid Build Coastguard Worker #define MOD_TRANSIENT    0x0080     /* not persistant */
302*e82f7db8SAndroid Build Coastguard Worker #define MOD_NATIVE       0x0100     /* implemented in C */
303*e82f7db8SAndroid Build Coastguard Worker #define MOD_INTERFACE    0x0200     /* class is an interface */
304*e82f7db8SAndroid Build Coastguard Worker #define MOD_ABSTRACT     0x0400     /* no definition provided */
305*e82f7db8SAndroid Build Coastguard Worker /*
306*e82f7db8SAndroid Build Coastguard Worker  * Additional modifiers not defined as such in the JVM spec
307*e82f7db8SAndroid Build Coastguard Worker  */
308*e82f7db8SAndroid Build Coastguard Worker #define MOD_SYNTHETIC    0xf0000000  /* not in source code */
309*e82f7db8SAndroid Build Coastguard Worker 
310*e82f7db8SAndroid Build Coastguard Worker /*
311*e82f7db8SAndroid Build Coastguard Worker  * jlong conversion macros
312*e82f7db8SAndroid Build Coastguard Worker  */
313*e82f7db8SAndroid Build Coastguard Worker #define jlong_zero       ((jlong) 0)
314*e82f7db8SAndroid Build Coastguard Worker #define jlong_one        ((jlong) 1)
315*e82f7db8SAndroid Build Coastguard Worker 
316*e82f7db8SAndroid Build Coastguard Worker #define jlong_to_ptr(a)  ((void*)(intptr_t)(a))
317*e82f7db8SAndroid Build Coastguard Worker #define ptr_to_jlong(a)  ((jlong)(intptr_t)(a))
318*e82f7db8SAndroid Build Coastguard Worker #define jint_to_jlong(a) ((jlong)(a))
319*e82f7db8SAndroid Build Coastguard Worker #define jlong_to_jint(a) ((jint)(a))
320*e82f7db8SAndroid Build Coastguard Worker 
321*e82f7db8SAndroid Build Coastguard Worker 
322*e82f7db8SAndroid Build Coastguard Worker /*
323*e82f7db8SAndroid Build Coastguard Worker  * util funcs
324*e82f7db8SAndroid Build Coastguard Worker  */
325*e82f7db8SAndroid Build Coastguard Worker void util_initialize(JNIEnv *env);
326*e82f7db8SAndroid Build Coastguard Worker void util_reset(void);
327*e82f7db8SAndroid Build Coastguard Worker 
328*e82f7db8SAndroid Build Coastguard Worker struct PacketInputStream;
329*e82f7db8SAndroid Build Coastguard Worker struct PacketOutputStream;
330*e82f7db8SAndroid Build Coastguard Worker 
331*e82f7db8SAndroid Build Coastguard Worker jint uniqueID(void);
332*e82f7db8SAndroid Build Coastguard Worker jbyte referenceTypeTag(jclass clazz);
333*e82f7db8SAndroid Build Coastguard Worker jbyte specificTypeKey(JNIEnv *env, jobject object);
334*e82f7db8SAndroid Build Coastguard Worker jboolean isObjectTag(jbyte tag);
335*e82f7db8SAndroid Build Coastguard Worker jvmtiError spawnNewThread(jvmtiStartFunction func, void *arg, char *name);
336*e82f7db8SAndroid Build Coastguard Worker void convertSignatureToClassname(char *convert);
337*e82f7db8SAndroid Build Coastguard Worker void writeCodeLocation(struct PacketOutputStream *out, jclass clazz,
338*e82f7db8SAndroid Build Coastguard Worker                        jmethodID method, jlocation location);
339*e82f7db8SAndroid Build Coastguard Worker 
340*e82f7db8SAndroid Build Coastguard Worker jvmtiError classInstances(jclass klass, ObjectBatch *instances, int maxInstances);
341*e82f7db8SAndroid Build Coastguard Worker jvmtiError classInstanceCounts(jint classCount, jclass *classes, jlong *counts);
342*e82f7db8SAndroid Build Coastguard Worker jvmtiError objectReferrers(jobject obj, ObjectBatch *referrers, int maxObjects);
343*e82f7db8SAndroid Build Coastguard Worker 
344*e82f7db8SAndroid Build Coastguard Worker // ANDROID-CHANGED: Helper function to get current time in milliseconds on CLOCK_MONOTONIC
345*e82f7db8SAndroid Build Coastguard Worker jlong milliTime(void);
346*e82f7db8SAndroid Build Coastguard Worker jlong nsTime(void);
347*e82f7db8SAndroid Build Coastguard Worker 
348*e82f7db8SAndroid Build Coastguard Worker /*
349*e82f7db8SAndroid Build Coastguard Worker  * Command handling helpers shared among multiple command sets
350*e82f7db8SAndroid Build Coastguard Worker  */
351*e82f7db8SAndroid Build Coastguard Worker int filterDebugThreads(jthread *threads, int count);
352*e82f7db8SAndroid Build Coastguard Worker 
353*e82f7db8SAndroid Build Coastguard Worker 
354*e82f7db8SAndroid Build Coastguard Worker void sharedGetFieldValues(struct PacketInputStream *in,
355*e82f7db8SAndroid Build Coastguard Worker                           struct PacketOutputStream *out,
356*e82f7db8SAndroid Build Coastguard Worker                           jboolean isStatic);
357*e82f7db8SAndroid Build Coastguard Worker jboolean sharedInvoke(struct PacketInputStream *in,
358*e82f7db8SAndroid Build Coastguard Worker                       struct PacketOutputStream *out);
359*e82f7db8SAndroid Build Coastguard Worker 
360*e82f7db8SAndroid Build Coastguard Worker jvmtiError fieldSignature(jclass, jfieldID, char **, char **, char **);
361*e82f7db8SAndroid Build Coastguard Worker jvmtiError fieldModifiers(jclass, jfieldID, jint *);
362*e82f7db8SAndroid Build Coastguard Worker jvmtiError methodSignature(jmethodID, char **, char **, char **);
363*e82f7db8SAndroid Build Coastguard Worker jvmtiError methodReturnType(jmethodID, char *);
364*e82f7db8SAndroid Build Coastguard Worker jvmtiError methodModifiers(jmethodID, jint *);
365*e82f7db8SAndroid Build Coastguard Worker jvmtiError methodClass(jmethodID, jclass *);
366*e82f7db8SAndroid Build Coastguard Worker jvmtiError methodLocation(jmethodID, jlocation*, jlocation*);
367*e82f7db8SAndroid Build Coastguard Worker jvmtiError classLoader(jclass, jobject *);
368*e82f7db8SAndroid Build Coastguard Worker 
369*e82f7db8SAndroid Build Coastguard Worker /*
370*e82f7db8SAndroid Build Coastguard Worker  * Thin wrappers on top of JNI
371*e82f7db8SAndroid Build Coastguard Worker  */
372*e82f7db8SAndroid Build Coastguard Worker JNIEnv *getEnv(void);
373*e82f7db8SAndroid Build Coastguard Worker jboolean isClass(jobject object);
374*e82f7db8SAndroid Build Coastguard Worker jboolean isThread(jobject object);
375*e82f7db8SAndroid Build Coastguard Worker jboolean isThreadGroup(jobject object);
376*e82f7db8SAndroid Build Coastguard Worker jboolean isString(jobject object);
377*e82f7db8SAndroid Build Coastguard Worker jboolean isClassLoader(jobject object);
378*e82f7db8SAndroid Build Coastguard Worker jboolean isArray(jobject object);
379*e82f7db8SAndroid Build Coastguard Worker 
380*e82f7db8SAndroid Build Coastguard Worker /*
381*e82f7db8SAndroid Build Coastguard Worker  * Thin wrappers on top of JVMTI
382*e82f7db8SAndroid Build Coastguard Worker  */
383*e82f7db8SAndroid Build Coastguard Worker jvmtiError jvmtiGetCapabilities(jvmtiCapabilities *caps);
384*e82f7db8SAndroid Build Coastguard Worker jint jvmtiMajorVersion(void);
385*e82f7db8SAndroid Build Coastguard Worker jint jvmtiMinorVersion(void);
386*e82f7db8SAndroid Build Coastguard Worker jint jvmtiMicroVersion(void);
387*e82f7db8SAndroid Build Coastguard Worker jvmtiError getSourceDebugExtension(jclass clazz, char **extensionPtr);
388*e82f7db8SAndroid Build Coastguard Worker jboolean canSuspendResumeThreadLists(void);
389*e82f7db8SAndroid Build Coastguard Worker 
390*e82f7db8SAndroid Build Coastguard Worker jrawMonitorID debugMonitorCreate(char *name);
391*e82f7db8SAndroid Build Coastguard Worker void debugMonitorEnter(jrawMonitorID theLock);
392*e82f7db8SAndroid Build Coastguard Worker void debugMonitorExit(jrawMonitorID theLock);
393*e82f7db8SAndroid Build Coastguard Worker 
394*e82f7db8SAndroid Build Coastguard Worker /* ANDROID-CHANGED: extension functions that will enter and exit a mutex without allowing suspension
395*e82f7db8SAndroid Build Coastguard Worker  * to occur. Caller must not use monitor-wait.
396*e82f7db8SAndroid Build Coastguard Worker  */
397*e82f7db8SAndroid Build Coastguard Worker void debugMonitorEnterNoSuspend(jrawMonitorID theLock);
398*e82f7db8SAndroid Build Coastguard Worker 
399*e82f7db8SAndroid Build Coastguard Worker void debugMonitorWait(jrawMonitorID theLock);
400*e82f7db8SAndroid Build Coastguard Worker void debugMonitorTimedWait(jrawMonitorID theLock, jlong millis);
401*e82f7db8SAndroid Build Coastguard Worker void debugMonitorNotify(jrawMonitorID theLock);
402*e82f7db8SAndroid Build Coastguard Worker void debugMonitorNotifyAll(jrawMonitorID theLock);
403*e82f7db8SAndroid Build Coastguard Worker void debugMonitorDestroy(jrawMonitorID theLock);
404*e82f7db8SAndroid Build Coastguard Worker 
405*e82f7db8SAndroid Build Coastguard Worker jthread *allThreads(jint *count);
406*e82f7db8SAndroid Build Coastguard Worker 
407*e82f7db8SAndroid Build Coastguard Worker void threadGroupInfo(jthreadGroup, jvmtiThreadGroupInfo *info);
408*e82f7db8SAndroid Build Coastguard Worker 
409*e82f7db8SAndroid Build Coastguard Worker /* ANDROID-CHANGED: Add isArrayClass */
410*e82f7db8SAndroid Build Coastguard Worker jboolean isArrayClass(jclass);
411*e82f7db8SAndroid Build Coastguard Worker 
412*e82f7db8SAndroid Build Coastguard Worker char *getClassname(jclass);
413*e82f7db8SAndroid Build Coastguard Worker jvmtiError classSignature(jclass, char**, char**);
414*e82f7db8SAndroid Build Coastguard Worker jint classStatus(jclass);
415*e82f7db8SAndroid Build Coastguard Worker void writeGenericSignature(struct PacketOutputStream *, char *);
416*e82f7db8SAndroid Build Coastguard Worker jboolean isMethodNative(jmethodID);
417*e82f7db8SAndroid Build Coastguard Worker jboolean isMethodObsolete(jmethodID);
418*e82f7db8SAndroid Build Coastguard Worker jvmtiError isMethodSynthetic(jmethodID, jboolean*);
419*e82f7db8SAndroid Build Coastguard Worker jvmtiError isFieldSynthetic(jclass, jfieldID, jboolean*);
420*e82f7db8SAndroid Build Coastguard Worker 
421*e82f7db8SAndroid Build Coastguard Worker jboolean isSameObject(JNIEnv *env, jobject o1, jobject o2);
422*e82f7db8SAndroid Build Coastguard Worker 
423*e82f7db8SAndroid Build Coastguard Worker jint objectHashCode(jobject);
424*e82f7db8SAndroid Build Coastguard Worker 
425*e82f7db8SAndroid Build Coastguard Worker jvmtiError allInterfaces(jclass clazz, jclass **ppinterfaces, jint *count);
426*e82f7db8SAndroid Build Coastguard Worker jvmtiError allLoadedClasses(jclass **ppclasses, jint *count);
427*e82f7db8SAndroid Build Coastguard Worker jvmtiError allClassLoaderClasses(jobject loader, jclass **ppclasses, jint *count);
428*e82f7db8SAndroid Build Coastguard Worker jvmtiError allNestedClasses(jclass clazz, jclass **ppnested, jint *pcount);
429*e82f7db8SAndroid Build Coastguard Worker 
430*e82f7db8SAndroid Build Coastguard Worker void setAgentPropertyValue(JNIEnv *env, char *propertyName, char* propertyValue);
431*e82f7db8SAndroid Build Coastguard Worker 
432*e82f7db8SAndroid Build Coastguard Worker void *jvmtiAllocate(jint numBytes);
433*e82f7db8SAndroid Build Coastguard Worker void jvmtiDeallocate(void *buffer);
434*e82f7db8SAndroid Build Coastguard Worker 
435*e82f7db8SAndroid Build Coastguard Worker void             eventIndexInit(void);
436*e82f7db8SAndroid Build Coastguard Worker jdwpEvent        eventIndex2jdwp(EventIndex i);
437*e82f7db8SAndroid Build Coastguard Worker jvmtiEvent       eventIndex2jvmti(EventIndex i);
438*e82f7db8SAndroid Build Coastguard Worker EventIndex       jdwp2EventIndex(jdwpEvent eventType);
439*e82f7db8SAndroid Build Coastguard Worker EventIndex       jvmti2EventIndex(jvmtiEvent kind);
440*e82f7db8SAndroid Build Coastguard Worker 
441*e82f7db8SAndroid Build Coastguard Worker jvmtiError       map2jvmtiError(jdwpError);
442*e82f7db8SAndroid Build Coastguard Worker jdwpError        map2jdwpError(jvmtiError);
443*e82f7db8SAndroid Build Coastguard Worker jdwpThreadStatus map2jdwpThreadStatus(jint state);
444*e82f7db8SAndroid Build Coastguard Worker jint             map2jdwpSuspendStatus(jint state);
445*e82f7db8SAndroid Build Coastguard Worker jint             map2jdwpClassStatus(jint);
446*e82f7db8SAndroid Build Coastguard Worker 
447*e82f7db8SAndroid Build Coastguard Worker void log_debugee_location(const char *func,
448*e82f7db8SAndroid Build Coastguard Worker                 jthread thread, jmethodID method, jlocation location);
449*e82f7db8SAndroid Build Coastguard Worker 
450*e82f7db8SAndroid Build Coastguard Worker /*
451*e82f7db8SAndroid Build Coastguard Worker  * Local Reference management. The two macros below are used
452*e82f7db8SAndroid Build Coastguard Worker  * throughout the back end whenever space for JNI local references
453*e82f7db8SAndroid Build Coastguard Worker  * is needed in the current frame.
454*e82f7db8SAndroid Build Coastguard Worker  */
455*e82f7db8SAndroid Build Coastguard Worker 
456*e82f7db8SAndroid Build Coastguard Worker void createLocalRefSpace(JNIEnv *env, jint capacity);
457*e82f7db8SAndroid Build Coastguard Worker 
458*e82f7db8SAndroid Build Coastguard Worker #define WITH_LOCAL_REFS(env, number) \
459*e82f7db8SAndroid Build Coastguard Worker     createLocalRefSpace(env, number); \
460*e82f7db8SAndroid Build Coastguard Worker     { /* BEGINNING OF WITH SCOPE */
461*e82f7db8SAndroid Build Coastguard Worker 
462*e82f7db8SAndroid Build Coastguard Worker #define END_WITH_LOCAL_REFS(env) \
463*e82f7db8SAndroid Build Coastguard Worker         JNI_FUNC_PTR(env,PopLocalFrame)(env, NULL); \
464*e82f7db8SAndroid Build Coastguard Worker     } /* END OF WITH SCOPE */
465*e82f7db8SAndroid Build Coastguard Worker 
466*e82f7db8SAndroid Build Coastguard Worker void saveGlobalRef(JNIEnv *env, jobject obj, jobject *pobj);
467*e82f7db8SAndroid Build Coastguard Worker void tossGlobalRef(JNIEnv *env, jobject *pobj);
468*e82f7db8SAndroid Build Coastguard Worker 
469*e82f7db8SAndroid Build Coastguard Worker /* ANDROID_CHANGED: Expose this method publicly.
470*e82f7db8SAndroid Build Coastguard Worker  * This returns a newly allocated jvmtiEnv* with the can_tag_objects capability.
471*e82f7db8SAndroid Build Coastguard Worker  */
472*e82f7db8SAndroid Build Coastguard Worker jvmtiEnv *getSpecialJvmti(void);
473*e82f7db8SAndroid Build Coastguard Worker 
474*e82f7db8SAndroid Build Coastguard Worker #endif
475