1*e82f7db8SAndroid Build Coastguard Worker /*
2*e82f7db8SAndroid Build Coastguard Worker * Copyright (c) 1998, 2006, 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 #include "util.h"
27*e82f7db8SAndroid Build Coastguard Worker #include "VirtualMachineImpl.h"
28*e82f7db8SAndroid Build Coastguard Worker #include "commonRef.h"
29*e82f7db8SAndroid Build Coastguard Worker #include "inStream.h"
30*e82f7db8SAndroid Build Coastguard Worker #include "outStream.h"
31*e82f7db8SAndroid Build Coastguard Worker #include "eventHandler.h"
32*e82f7db8SAndroid Build Coastguard Worker #include "eventHelper.h"
33*e82f7db8SAndroid Build Coastguard Worker #include "threadControl.h"
34*e82f7db8SAndroid Build Coastguard Worker #include "SDE.h"
35*e82f7db8SAndroid Build Coastguard Worker #include "FrameID.h"
36*e82f7db8SAndroid Build Coastguard Worker
37*e82f7db8SAndroid Build Coastguard Worker // ANDROID-CHANGED: Need to sent metrics before doExit
38*e82f7db8SAndroid Build Coastguard Worker #include "timing.h"
39*e82f7db8SAndroid Build Coastguard Worker
40*e82f7db8SAndroid Build Coastguard Worker
41*e82f7db8SAndroid Build Coastguard Worker static char *versionName = "Java Debug Wire Protocol (Reference Implementation)";
42*e82f7db8SAndroid Build Coastguard Worker static int majorVersion = 1; /* JDWP major version */
43*e82f7db8SAndroid Build Coastguard Worker static int minorVersion = 8; /* JDWP minor version */
44*e82f7db8SAndroid Build Coastguard Worker
45*e82f7db8SAndroid Build Coastguard Worker static jboolean
version(PacketInputStream * in,PacketOutputStream * out)46*e82f7db8SAndroid Build Coastguard Worker version(PacketInputStream *in, PacketOutputStream *out)
47*e82f7db8SAndroid Build Coastguard Worker {
48*e82f7db8SAndroid Build Coastguard Worker char buf[500];
49*e82f7db8SAndroid Build Coastguard Worker char *vmName;
50*e82f7db8SAndroid Build Coastguard Worker char *vmVersion;
51*e82f7db8SAndroid Build Coastguard Worker char *vmInfo;
52*e82f7db8SAndroid Build Coastguard Worker
53*e82f7db8SAndroid Build Coastguard Worker if (gdata->vmDead) {
54*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, JDWP_ERROR(VM_DEAD));
55*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
56*e82f7db8SAndroid Build Coastguard Worker }
57*e82f7db8SAndroid Build Coastguard Worker
58*e82f7db8SAndroid Build Coastguard Worker vmVersion = gdata->property_java_version;
59*e82f7db8SAndroid Build Coastguard Worker if (vmVersion == NULL) {
60*e82f7db8SAndroid Build Coastguard Worker vmVersion = "<unknown>";
61*e82f7db8SAndroid Build Coastguard Worker }
62*e82f7db8SAndroid Build Coastguard Worker // ANDROID-CHANGED: The runtime value of the java.version property has always been "0" on
63*e82f7db8SAndroid Build Coastguard Worker // android but the old debugger just sent a different value. Simply sending "0"
64*e82f7db8SAndroid Build Coastguard Worker // can confuse some JDWP clients so we will simply say that we are version "8".
65*e82f7db8SAndroid Build Coastguard Worker if (strcmp(gdata->property_java_vm_name, "Dalvik") == 0 && strcmp(vmVersion, "0") == 0) {
66*e82f7db8SAndroid Build Coastguard Worker vmVersion = "8";
67*e82f7db8SAndroid Build Coastguard Worker }
68*e82f7db8SAndroid Build Coastguard Worker vmName = gdata->property_java_vm_name;
69*e82f7db8SAndroid Build Coastguard Worker if (vmName == NULL) {
70*e82f7db8SAndroid Build Coastguard Worker vmName = "<unknown>";
71*e82f7db8SAndroid Build Coastguard Worker }
72*e82f7db8SAndroid Build Coastguard Worker vmInfo = gdata->property_java_vm_info;
73*e82f7db8SAndroid Build Coastguard Worker if (vmInfo == NULL) {
74*e82f7db8SAndroid Build Coastguard Worker vmInfo = "<unknown>";
75*e82f7db8SAndroid Build Coastguard Worker }
76*e82f7db8SAndroid Build Coastguard Worker
77*e82f7db8SAndroid Build Coastguard Worker /*
78*e82f7db8SAndroid Build Coastguard Worker * Write the descriptive version information
79*e82f7db8SAndroid Build Coastguard Worker */
80*e82f7db8SAndroid Build Coastguard Worker (void)snprintf(buf, sizeof(buf),
81*e82f7db8SAndroid Build Coastguard Worker "%s version %d.%d\nJVM Debug Interface version %d.%d\n"
82*e82f7db8SAndroid Build Coastguard Worker "JVM version %s (%s, %s)",
83*e82f7db8SAndroid Build Coastguard Worker versionName, majorVersion, minorVersion,
84*e82f7db8SAndroid Build Coastguard Worker jvmtiMajorVersion(), jvmtiMinorVersion(),
85*e82f7db8SAndroid Build Coastguard Worker vmVersion, vmName, vmInfo);
86*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeString(out, buf);
87*e82f7db8SAndroid Build Coastguard Worker
88*e82f7db8SAndroid Build Coastguard Worker /*
89*e82f7db8SAndroid Build Coastguard Worker * Write the JDWP version numbers
90*e82f7db8SAndroid Build Coastguard Worker */
91*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeInt(out, majorVersion);
92*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeInt(out, minorVersion);
93*e82f7db8SAndroid Build Coastguard Worker
94*e82f7db8SAndroid Build Coastguard Worker /*
95*e82f7db8SAndroid Build Coastguard Worker * Write the VM version and name
96*e82f7db8SAndroid Build Coastguard Worker */
97*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeString(out, vmVersion);
98*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeString(out, vmName);
99*e82f7db8SAndroid Build Coastguard Worker
100*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
101*e82f7db8SAndroid Build Coastguard Worker }
102*e82f7db8SAndroid Build Coastguard Worker
103*e82f7db8SAndroid Build Coastguard Worker static jboolean
classesForSignature(PacketInputStream * in,PacketOutputStream * out)104*e82f7db8SAndroid Build Coastguard Worker classesForSignature(PacketInputStream *in, PacketOutputStream *out)
105*e82f7db8SAndroid Build Coastguard Worker {
106*e82f7db8SAndroid Build Coastguard Worker JNIEnv *env;
107*e82f7db8SAndroid Build Coastguard Worker char *signature;
108*e82f7db8SAndroid Build Coastguard Worker
109*e82f7db8SAndroid Build Coastguard Worker if (gdata->vmDead) {
110*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, JDWP_ERROR(VM_DEAD));
111*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
112*e82f7db8SAndroid Build Coastguard Worker }
113*e82f7db8SAndroid Build Coastguard Worker
114*e82f7db8SAndroid Build Coastguard Worker signature = inStream_readString(in);
115*e82f7db8SAndroid Build Coastguard Worker if (signature == NULL) {
116*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, JDWP_ERROR(OUT_OF_MEMORY));
117*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
118*e82f7db8SAndroid Build Coastguard Worker }
119*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in)) {
120*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
121*e82f7db8SAndroid Build Coastguard Worker }
122*e82f7db8SAndroid Build Coastguard Worker
123*e82f7db8SAndroid Build Coastguard Worker env = getEnv();
124*e82f7db8SAndroid Build Coastguard Worker
125*e82f7db8SAndroid Build Coastguard Worker WITH_LOCAL_REFS(env, 1) {
126*e82f7db8SAndroid Build Coastguard Worker
127*e82f7db8SAndroid Build Coastguard Worker jint classCount;
128*e82f7db8SAndroid Build Coastguard Worker jclass *theClasses;
129*e82f7db8SAndroid Build Coastguard Worker jvmtiError error;
130*e82f7db8SAndroid Build Coastguard Worker
131*e82f7db8SAndroid Build Coastguard Worker error = allLoadedClasses(&theClasses, &classCount);
132*e82f7db8SAndroid Build Coastguard Worker if ( error == JVMTI_ERROR_NONE ) {
133*e82f7db8SAndroid Build Coastguard Worker /* Count classes in theClasses which match signature */
134*e82f7db8SAndroid Build Coastguard Worker int matchCount = 0;
135*e82f7db8SAndroid Build Coastguard Worker /* Count classes written to the JDWP connection */
136*e82f7db8SAndroid Build Coastguard Worker int writtenCount = 0;
137*e82f7db8SAndroid Build Coastguard Worker int i;
138*e82f7db8SAndroid Build Coastguard Worker
139*e82f7db8SAndroid Build Coastguard Worker for (i=0; i<classCount; i++) {
140*e82f7db8SAndroid Build Coastguard Worker jclass clazz = theClasses[i];
141*e82f7db8SAndroid Build Coastguard Worker jint status = classStatus(clazz);
142*e82f7db8SAndroid Build Coastguard Worker char *candidate_signature = NULL;
143*e82f7db8SAndroid Build Coastguard Worker jint wanted =
144*e82f7db8SAndroid Build Coastguard Worker (JVMTI_CLASS_STATUS_PREPARED|JVMTI_CLASS_STATUS_ARRAY|
145*e82f7db8SAndroid Build Coastguard Worker JVMTI_CLASS_STATUS_PRIMITIVE);
146*e82f7db8SAndroid Build Coastguard Worker
147*e82f7db8SAndroid Build Coastguard Worker /* We want prepared classes, primitives, and arrays only */
148*e82f7db8SAndroid Build Coastguard Worker if ((status & wanted) == 0) {
149*e82f7db8SAndroid Build Coastguard Worker continue;
150*e82f7db8SAndroid Build Coastguard Worker }
151*e82f7db8SAndroid Build Coastguard Worker
152*e82f7db8SAndroid Build Coastguard Worker error = classSignature(clazz, &candidate_signature, NULL);
153*e82f7db8SAndroid Build Coastguard Worker if (error != JVMTI_ERROR_NONE) {
154*e82f7db8SAndroid Build Coastguard Worker break;
155*e82f7db8SAndroid Build Coastguard Worker }
156*e82f7db8SAndroid Build Coastguard Worker
157*e82f7db8SAndroid Build Coastguard Worker if (strcmp(candidate_signature, signature) == 0) {
158*e82f7db8SAndroid Build Coastguard Worker /* Float interesting classes (those that
159*e82f7db8SAndroid Build Coastguard Worker * are matching and are prepared) to the
160*e82f7db8SAndroid Build Coastguard Worker * beginning of the array.
161*e82f7db8SAndroid Build Coastguard Worker */
162*e82f7db8SAndroid Build Coastguard Worker theClasses[i] = theClasses[matchCount];
163*e82f7db8SAndroid Build Coastguard Worker theClasses[matchCount++] = clazz;
164*e82f7db8SAndroid Build Coastguard Worker }
165*e82f7db8SAndroid Build Coastguard Worker jvmtiDeallocate(candidate_signature);
166*e82f7db8SAndroid Build Coastguard Worker }
167*e82f7db8SAndroid Build Coastguard Worker
168*e82f7db8SAndroid Build Coastguard Worker /* At this point matching prepared classes occupy
169*e82f7db8SAndroid Build Coastguard Worker * indicies 0 thru matchCount-1 of theClasses.
170*e82f7db8SAndroid Build Coastguard Worker */
171*e82f7db8SAndroid Build Coastguard Worker
172*e82f7db8SAndroid Build Coastguard Worker if ( error == JVMTI_ERROR_NONE ) {
173*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeInt(out, matchCount);
174*e82f7db8SAndroid Build Coastguard Worker for (; writtenCount < matchCount; writtenCount++) {
175*e82f7db8SAndroid Build Coastguard Worker jclass clazz = theClasses[writtenCount];
176*e82f7db8SAndroid Build Coastguard Worker jint status = classStatus(clazz);
177*e82f7db8SAndroid Build Coastguard Worker jbyte tag = referenceTypeTag(clazz);
178*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeByte(out, tag);
179*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeObjectRef(env, out, clazz);
180*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeInt(out, map2jdwpClassStatus(status));
181*e82f7db8SAndroid Build Coastguard Worker /* No point in continuing if there's an error */
182*e82f7db8SAndroid Build Coastguard Worker if (outStream_error(out)) {
183*e82f7db8SAndroid Build Coastguard Worker break;
184*e82f7db8SAndroid Build Coastguard Worker }
185*e82f7db8SAndroid Build Coastguard Worker }
186*e82f7db8SAndroid Build Coastguard Worker }
187*e82f7db8SAndroid Build Coastguard Worker
188*e82f7db8SAndroid Build Coastguard Worker jvmtiDeallocate(theClasses);
189*e82f7db8SAndroid Build Coastguard Worker }
190*e82f7db8SAndroid Build Coastguard Worker
191*e82f7db8SAndroid Build Coastguard Worker if ( error != JVMTI_ERROR_NONE ) {
192*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, map2jdwpError(error));
193*e82f7db8SAndroid Build Coastguard Worker }
194*e82f7db8SAndroid Build Coastguard Worker
195*e82f7db8SAndroid Build Coastguard Worker } END_WITH_LOCAL_REFS(env);
196*e82f7db8SAndroid Build Coastguard Worker
197*e82f7db8SAndroid Build Coastguard Worker jvmtiDeallocate(signature);
198*e82f7db8SAndroid Build Coastguard Worker
199*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
200*e82f7db8SAndroid Build Coastguard Worker }
201*e82f7db8SAndroid Build Coastguard Worker
202*e82f7db8SAndroid Build Coastguard Worker static jboolean
allClasses1(PacketInputStream * in,PacketOutputStream * out,int outputGenerics)203*e82f7db8SAndroid Build Coastguard Worker allClasses1(PacketInputStream *in, PacketOutputStream *out, int outputGenerics)
204*e82f7db8SAndroid Build Coastguard Worker {
205*e82f7db8SAndroid Build Coastguard Worker JNIEnv *env;
206*e82f7db8SAndroid Build Coastguard Worker
207*e82f7db8SAndroid Build Coastguard Worker if (gdata->vmDead) {
208*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, JDWP_ERROR(VM_DEAD));
209*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
210*e82f7db8SAndroid Build Coastguard Worker }
211*e82f7db8SAndroid Build Coastguard Worker
212*e82f7db8SAndroid Build Coastguard Worker env = getEnv();
213*e82f7db8SAndroid Build Coastguard Worker
214*e82f7db8SAndroid Build Coastguard Worker WITH_LOCAL_REFS(env, 1) {
215*e82f7db8SAndroid Build Coastguard Worker
216*e82f7db8SAndroid Build Coastguard Worker jint classCount;
217*e82f7db8SAndroid Build Coastguard Worker jclass *theClasses;
218*e82f7db8SAndroid Build Coastguard Worker jvmtiError error;
219*e82f7db8SAndroid Build Coastguard Worker
220*e82f7db8SAndroid Build Coastguard Worker error = allLoadedClasses(&theClasses, &classCount);
221*e82f7db8SAndroid Build Coastguard Worker if ( error != JVMTI_ERROR_NONE ) {
222*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, map2jdwpError(error));
223*e82f7db8SAndroid Build Coastguard Worker } else {
224*e82f7db8SAndroid Build Coastguard Worker /* Count classes in theClasses which are prepared */
225*e82f7db8SAndroid Build Coastguard Worker int prepCount = 0;
226*e82f7db8SAndroid Build Coastguard Worker /* Count classes written to the JDWP connection */
227*e82f7db8SAndroid Build Coastguard Worker int writtenCount = 0;
228*e82f7db8SAndroid Build Coastguard Worker int i;
229*e82f7db8SAndroid Build Coastguard Worker
230*e82f7db8SAndroid Build Coastguard Worker for (i=0; i<classCount; i++) {
231*e82f7db8SAndroid Build Coastguard Worker jclass clazz = theClasses[i];
232*e82f7db8SAndroid Build Coastguard Worker jint status = classStatus(clazz);
233*e82f7db8SAndroid Build Coastguard Worker jint wanted =
234*e82f7db8SAndroid Build Coastguard Worker (JVMTI_CLASS_STATUS_PREPARED|JVMTI_CLASS_STATUS_ARRAY);
235*e82f7db8SAndroid Build Coastguard Worker
236*e82f7db8SAndroid Build Coastguard Worker /* We want prepared classes and arrays only */
237*e82f7db8SAndroid Build Coastguard Worker if ((status & wanted) != 0) {
238*e82f7db8SAndroid Build Coastguard Worker /* Float interesting classes (those that
239*e82f7db8SAndroid Build Coastguard Worker * are prepared) to the beginning of the array.
240*e82f7db8SAndroid Build Coastguard Worker */
241*e82f7db8SAndroid Build Coastguard Worker theClasses[i] = theClasses[prepCount];
242*e82f7db8SAndroid Build Coastguard Worker theClasses[prepCount++] = clazz;
243*e82f7db8SAndroid Build Coastguard Worker }
244*e82f7db8SAndroid Build Coastguard Worker }
245*e82f7db8SAndroid Build Coastguard Worker
246*e82f7db8SAndroid Build Coastguard Worker /* At this point prepared classes occupy
247*e82f7db8SAndroid Build Coastguard Worker * indicies 0 thru prepCount-1 of theClasses.
248*e82f7db8SAndroid Build Coastguard Worker */
249*e82f7db8SAndroid Build Coastguard Worker
250*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeInt(out, prepCount);
251*e82f7db8SAndroid Build Coastguard Worker for (; writtenCount < prepCount; writtenCount++) {
252*e82f7db8SAndroid Build Coastguard Worker char *signature = NULL;
253*e82f7db8SAndroid Build Coastguard Worker char *genericSignature = NULL;
254*e82f7db8SAndroid Build Coastguard Worker jclass clazz = theClasses[writtenCount];
255*e82f7db8SAndroid Build Coastguard Worker jint status = classStatus(clazz);
256*e82f7db8SAndroid Build Coastguard Worker jbyte tag = referenceTypeTag(clazz);
257*e82f7db8SAndroid Build Coastguard Worker jvmtiError error;
258*e82f7db8SAndroid Build Coastguard Worker
259*e82f7db8SAndroid Build Coastguard Worker error = classSignature(clazz, &signature, &genericSignature);
260*e82f7db8SAndroid Build Coastguard Worker if (error != JVMTI_ERROR_NONE) {
261*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, map2jdwpError(error));
262*e82f7db8SAndroid Build Coastguard Worker break;
263*e82f7db8SAndroid Build Coastguard Worker }
264*e82f7db8SAndroid Build Coastguard Worker
265*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeByte(out, tag);
266*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeObjectRef(env, out, clazz);
267*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeString(out, signature);
268*e82f7db8SAndroid Build Coastguard Worker if (outputGenerics == 1) {
269*e82f7db8SAndroid Build Coastguard Worker writeGenericSignature(out, genericSignature);
270*e82f7db8SAndroid Build Coastguard Worker }
271*e82f7db8SAndroid Build Coastguard Worker
272*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeInt(out, map2jdwpClassStatus(status));
273*e82f7db8SAndroid Build Coastguard Worker jvmtiDeallocate(signature);
274*e82f7db8SAndroid Build Coastguard Worker if (genericSignature != NULL) {
275*e82f7db8SAndroid Build Coastguard Worker jvmtiDeallocate(genericSignature);
276*e82f7db8SAndroid Build Coastguard Worker }
277*e82f7db8SAndroid Build Coastguard Worker
278*e82f7db8SAndroid Build Coastguard Worker /* No point in continuing if there's an error */
279*e82f7db8SAndroid Build Coastguard Worker if (outStream_error(out)) {
280*e82f7db8SAndroid Build Coastguard Worker break;
281*e82f7db8SAndroid Build Coastguard Worker }
282*e82f7db8SAndroid Build Coastguard Worker }
283*e82f7db8SAndroid Build Coastguard Worker jvmtiDeallocate(theClasses);
284*e82f7db8SAndroid Build Coastguard Worker }
285*e82f7db8SAndroid Build Coastguard Worker
286*e82f7db8SAndroid Build Coastguard Worker } END_WITH_LOCAL_REFS(env);
287*e82f7db8SAndroid Build Coastguard Worker
288*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
289*e82f7db8SAndroid Build Coastguard Worker }
290*e82f7db8SAndroid Build Coastguard Worker
291*e82f7db8SAndroid Build Coastguard Worker static jboolean
allClasses(PacketInputStream * in,PacketOutputStream * out)292*e82f7db8SAndroid Build Coastguard Worker allClasses(PacketInputStream *in, PacketOutputStream *out)
293*e82f7db8SAndroid Build Coastguard Worker {
294*e82f7db8SAndroid Build Coastguard Worker return allClasses1(in, out, 0);
295*e82f7db8SAndroid Build Coastguard Worker }
296*e82f7db8SAndroid Build Coastguard Worker
297*e82f7db8SAndroid Build Coastguard Worker static jboolean
allClassesWithGeneric(PacketInputStream * in,PacketOutputStream * out)298*e82f7db8SAndroid Build Coastguard Worker allClassesWithGeneric(PacketInputStream *in, PacketOutputStream *out)
299*e82f7db8SAndroid Build Coastguard Worker {
300*e82f7db8SAndroid Build Coastguard Worker return allClasses1(in, out, 1);
301*e82f7db8SAndroid Build Coastguard Worker }
302*e82f7db8SAndroid Build Coastguard Worker
303*e82f7db8SAndroid Build Coastguard Worker /***********************************************************/
304*e82f7db8SAndroid Build Coastguard Worker
305*e82f7db8SAndroid Build Coastguard Worker
306*e82f7db8SAndroid Build Coastguard Worker static jboolean
instanceCounts(PacketInputStream * in,PacketOutputStream * out)307*e82f7db8SAndroid Build Coastguard Worker instanceCounts(PacketInputStream *in, PacketOutputStream *out)
308*e82f7db8SAndroid Build Coastguard Worker {
309*e82f7db8SAndroid Build Coastguard Worker jint classCount;
310*e82f7db8SAndroid Build Coastguard Worker jclass *classes;
311*e82f7db8SAndroid Build Coastguard Worker JNIEnv *env;
312*e82f7db8SAndroid Build Coastguard Worker int ii;
313*e82f7db8SAndroid Build Coastguard Worker
314*e82f7db8SAndroid Build Coastguard Worker if (gdata->vmDead) {
315*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, JDWP_ERROR(VM_DEAD));
316*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
317*e82f7db8SAndroid Build Coastguard Worker }
318*e82f7db8SAndroid Build Coastguard Worker
319*e82f7db8SAndroid Build Coastguard Worker classCount = inStream_readInt(in);
320*e82f7db8SAndroid Build Coastguard Worker
321*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in)) {
322*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
323*e82f7db8SAndroid Build Coastguard Worker }
324*e82f7db8SAndroid Build Coastguard Worker if (classCount == 0) {
325*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeInt(out, 0);
326*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
327*e82f7db8SAndroid Build Coastguard Worker }
328*e82f7db8SAndroid Build Coastguard Worker if (classCount < 0) {
329*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, JDWP_ERROR(ILLEGAL_ARGUMENT));
330*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
331*e82f7db8SAndroid Build Coastguard Worker }
332*e82f7db8SAndroid Build Coastguard Worker env = getEnv();
333*e82f7db8SAndroid Build Coastguard Worker classes = jvmtiAllocate(classCount * (int)sizeof(jclass));
334*e82f7db8SAndroid Build Coastguard Worker for (ii = 0; ii < classCount; ii++) {
335*e82f7db8SAndroid Build Coastguard Worker jdwpError errorCode;
336*e82f7db8SAndroid Build Coastguard Worker classes[ii] = inStream_readClassRef(env, in);
337*e82f7db8SAndroid Build Coastguard Worker errorCode = inStream_error(in);
338*e82f7db8SAndroid Build Coastguard Worker if (errorCode != JDWP_ERROR(NONE)) {
339*e82f7db8SAndroid Build Coastguard Worker /*
340*e82f7db8SAndroid Build Coastguard Worker * A class could have been unloaded/gc'd so
341*e82f7db8SAndroid Build Coastguard Worker * if we get an error, just ignore it and keep
342*e82f7db8SAndroid Build Coastguard Worker * going. An instanceCount of 0 will be returned.
343*e82f7db8SAndroid Build Coastguard Worker */
344*e82f7db8SAndroid Build Coastguard Worker if (errorCode == JDWP_ERROR(INVALID_OBJECT) ||
345*e82f7db8SAndroid Build Coastguard Worker errorCode == JDWP_ERROR(INVALID_CLASS)) {
346*e82f7db8SAndroid Build Coastguard Worker inStream_clearError(in);
347*e82f7db8SAndroid Build Coastguard Worker classes[ii] = NULL;
348*e82f7db8SAndroid Build Coastguard Worker continue;
349*e82f7db8SAndroid Build Coastguard Worker }
350*e82f7db8SAndroid Build Coastguard Worker jvmtiDeallocate(classes);
351*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
352*e82f7db8SAndroid Build Coastguard Worker }
353*e82f7db8SAndroid Build Coastguard Worker }
354*e82f7db8SAndroid Build Coastguard Worker
355*e82f7db8SAndroid Build Coastguard Worker WITH_LOCAL_REFS(env, 1) {
356*e82f7db8SAndroid Build Coastguard Worker jlong *counts;
357*e82f7db8SAndroid Build Coastguard Worker jvmtiError error;
358*e82f7db8SAndroid Build Coastguard Worker
359*e82f7db8SAndroid Build Coastguard Worker counts = jvmtiAllocate(classCount * (int)sizeof(jlong));
360*e82f7db8SAndroid Build Coastguard Worker /* Iterate over heap getting info on these classes */
361*e82f7db8SAndroid Build Coastguard Worker error = classInstanceCounts(classCount, classes, counts);
362*e82f7db8SAndroid Build Coastguard Worker if (error != JVMTI_ERROR_NONE) {
363*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, map2jdwpError(error));
364*e82f7db8SAndroid Build Coastguard Worker } else {
365*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeInt(out, classCount);
366*e82f7db8SAndroid Build Coastguard Worker for (ii = 0; ii < classCount; ii++) {
367*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeLong(out, counts[ii]);
368*e82f7db8SAndroid Build Coastguard Worker }
369*e82f7db8SAndroid Build Coastguard Worker }
370*e82f7db8SAndroid Build Coastguard Worker jvmtiDeallocate(counts);
371*e82f7db8SAndroid Build Coastguard Worker } END_WITH_LOCAL_REFS(env);
372*e82f7db8SAndroid Build Coastguard Worker jvmtiDeallocate(classes);
373*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
374*e82f7db8SAndroid Build Coastguard Worker }
375*e82f7db8SAndroid Build Coastguard Worker
376*e82f7db8SAndroid Build Coastguard Worker static jboolean
redefineClasses(PacketInputStream * in,PacketOutputStream * out)377*e82f7db8SAndroid Build Coastguard Worker redefineClasses(PacketInputStream *in, PacketOutputStream *out)
378*e82f7db8SAndroid Build Coastguard Worker {
379*e82f7db8SAndroid Build Coastguard Worker jvmtiClassDefinition *classDefs;
380*e82f7db8SAndroid Build Coastguard Worker jboolean ok = JNI_TRUE;
381*e82f7db8SAndroid Build Coastguard Worker jint classCount;
382*e82f7db8SAndroid Build Coastguard Worker jint i;
383*e82f7db8SAndroid Build Coastguard Worker JNIEnv *env;
384*e82f7db8SAndroid Build Coastguard Worker
385*e82f7db8SAndroid Build Coastguard Worker if (gdata->vmDead) {
386*e82f7db8SAndroid Build Coastguard Worker /* quietly ignore */
387*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
388*e82f7db8SAndroid Build Coastguard Worker }
389*e82f7db8SAndroid Build Coastguard Worker
390*e82f7db8SAndroid Build Coastguard Worker classCount = inStream_readInt(in);
391*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in)) {
392*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
393*e82f7db8SAndroid Build Coastguard Worker }
394*e82f7db8SAndroid Build Coastguard Worker if ( classCount == 0 ) {
395*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
396*e82f7db8SAndroid Build Coastguard Worker }
397*e82f7db8SAndroid Build Coastguard Worker /*LINTED*/
398*e82f7db8SAndroid Build Coastguard Worker classDefs = jvmtiAllocate(classCount*(int)sizeof(jvmtiClassDefinition));
399*e82f7db8SAndroid Build Coastguard Worker if (classDefs == NULL) {
400*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, JDWP_ERROR(OUT_OF_MEMORY));
401*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
402*e82f7db8SAndroid Build Coastguard Worker }
403*e82f7db8SAndroid Build Coastguard Worker /*LINTED*/
404*e82f7db8SAndroid Build Coastguard Worker (void)memset(classDefs, 0, classCount*sizeof(jvmtiClassDefinition));
405*e82f7db8SAndroid Build Coastguard Worker
406*e82f7db8SAndroid Build Coastguard Worker env = getEnv();
407*e82f7db8SAndroid Build Coastguard Worker for (i = 0; i < classCount; ++i) {
408*e82f7db8SAndroid Build Coastguard Worker int byteCount;
409*e82f7db8SAndroid Build Coastguard Worker unsigned char * bytes;
410*e82f7db8SAndroid Build Coastguard Worker jclass clazz;
411*e82f7db8SAndroid Build Coastguard Worker
412*e82f7db8SAndroid Build Coastguard Worker clazz = inStream_readClassRef(env, in);
413*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in)) {
414*e82f7db8SAndroid Build Coastguard Worker ok = JNI_FALSE;
415*e82f7db8SAndroid Build Coastguard Worker break;
416*e82f7db8SAndroid Build Coastguard Worker }
417*e82f7db8SAndroid Build Coastguard Worker byteCount = inStream_readInt(in);
418*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in)) {
419*e82f7db8SAndroid Build Coastguard Worker ok = JNI_FALSE;
420*e82f7db8SAndroid Build Coastguard Worker break;
421*e82f7db8SAndroid Build Coastguard Worker }
422*e82f7db8SAndroid Build Coastguard Worker if ( byteCount <= 0 ) {
423*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, JDWP_ERROR(INVALID_CLASS_FORMAT));
424*e82f7db8SAndroid Build Coastguard Worker ok = JNI_FALSE;
425*e82f7db8SAndroid Build Coastguard Worker break;
426*e82f7db8SAndroid Build Coastguard Worker }
427*e82f7db8SAndroid Build Coastguard Worker bytes = (unsigned char *)jvmtiAllocate(byteCount);
428*e82f7db8SAndroid Build Coastguard Worker if (bytes == NULL) {
429*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, JDWP_ERROR(OUT_OF_MEMORY));
430*e82f7db8SAndroid Build Coastguard Worker ok = JNI_FALSE;
431*e82f7db8SAndroid Build Coastguard Worker break;
432*e82f7db8SAndroid Build Coastguard Worker }
433*e82f7db8SAndroid Build Coastguard Worker (void)inStream_readBytes(in, byteCount, (jbyte *)bytes);
434*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in)) {
435*e82f7db8SAndroid Build Coastguard Worker ok = JNI_FALSE;
436*e82f7db8SAndroid Build Coastguard Worker break;
437*e82f7db8SAndroid Build Coastguard Worker }
438*e82f7db8SAndroid Build Coastguard Worker
439*e82f7db8SAndroid Build Coastguard Worker classDefs[i].klass = clazz;
440*e82f7db8SAndroid Build Coastguard Worker classDefs[i].class_byte_count = byteCount;
441*e82f7db8SAndroid Build Coastguard Worker classDefs[i].class_bytes = bytes;
442*e82f7db8SAndroid Build Coastguard Worker }
443*e82f7db8SAndroid Build Coastguard Worker
444*e82f7db8SAndroid Build Coastguard Worker if (ok == JNI_TRUE) {
445*e82f7db8SAndroid Build Coastguard Worker jvmtiError error;
446*e82f7db8SAndroid Build Coastguard Worker
447*e82f7db8SAndroid Build Coastguard Worker error = JVMTI_FUNC_PTR(gdata->jvmti,RedefineClasses)
448*e82f7db8SAndroid Build Coastguard Worker (gdata->jvmti, classCount, classDefs);
449*e82f7db8SAndroid Build Coastguard Worker if (error != JVMTI_ERROR_NONE) {
450*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, map2jdwpError(error));
451*e82f7db8SAndroid Build Coastguard Worker } else {
452*e82f7db8SAndroid Build Coastguard Worker /* zap our BP info */
453*e82f7db8SAndroid Build Coastguard Worker for ( i = 0 ; i < classCount; i++ ) {
454*e82f7db8SAndroid Build Coastguard Worker eventHandler_freeClassBreakpoints(classDefs[i].klass);
455*e82f7db8SAndroid Build Coastguard Worker }
456*e82f7db8SAndroid Build Coastguard Worker }
457*e82f7db8SAndroid Build Coastguard Worker }
458*e82f7db8SAndroid Build Coastguard Worker
459*e82f7db8SAndroid Build Coastguard Worker /* free up allocated memory */
460*e82f7db8SAndroid Build Coastguard Worker for ( i = 0 ; i < classCount; i++ ) {
461*e82f7db8SAndroid Build Coastguard Worker if ( classDefs[i].class_bytes != NULL ) {
462*e82f7db8SAndroid Build Coastguard Worker jvmtiDeallocate((void*)classDefs[i].class_bytes);
463*e82f7db8SAndroid Build Coastguard Worker }
464*e82f7db8SAndroid Build Coastguard Worker }
465*e82f7db8SAndroid Build Coastguard Worker jvmtiDeallocate(classDefs);
466*e82f7db8SAndroid Build Coastguard Worker
467*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
468*e82f7db8SAndroid Build Coastguard Worker }
469*e82f7db8SAndroid Build Coastguard Worker
470*e82f7db8SAndroid Build Coastguard Worker static jboolean
setDefaultStratum(PacketInputStream * in,PacketOutputStream * out)471*e82f7db8SAndroid Build Coastguard Worker setDefaultStratum(PacketInputStream *in, PacketOutputStream *out)
472*e82f7db8SAndroid Build Coastguard Worker {
473*e82f7db8SAndroid Build Coastguard Worker char *stratumId;
474*e82f7db8SAndroid Build Coastguard Worker
475*e82f7db8SAndroid Build Coastguard Worker if (gdata->vmDead) {
476*e82f7db8SAndroid Build Coastguard Worker /* quietly ignore */
477*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
478*e82f7db8SAndroid Build Coastguard Worker }
479*e82f7db8SAndroid Build Coastguard Worker
480*e82f7db8SAndroid Build Coastguard Worker stratumId = inStream_readString(in);
481*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in)) {
482*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
483*e82f7db8SAndroid Build Coastguard Worker } else if (strcmp(stratumId, "") == 0) {
484*e82f7db8SAndroid Build Coastguard Worker stratumId = NULL;
485*e82f7db8SAndroid Build Coastguard Worker }
486*e82f7db8SAndroid Build Coastguard Worker setGlobalStratumId(stratumId);
487*e82f7db8SAndroid Build Coastguard Worker
488*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
489*e82f7db8SAndroid Build Coastguard Worker }
490*e82f7db8SAndroid Build Coastguard Worker
491*e82f7db8SAndroid Build Coastguard Worker static jboolean
getAllThreads(PacketInputStream * in,PacketOutputStream * out)492*e82f7db8SAndroid Build Coastguard Worker getAllThreads(PacketInputStream *in, PacketOutputStream *out)
493*e82f7db8SAndroid Build Coastguard Worker {
494*e82f7db8SAndroid Build Coastguard Worker JNIEnv *env;
495*e82f7db8SAndroid Build Coastguard Worker
496*e82f7db8SAndroid Build Coastguard Worker if (gdata->vmDead) {
497*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, JDWP_ERROR(VM_DEAD));
498*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
499*e82f7db8SAndroid Build Coastguard Worker }
500*e82f7db8SAndroid Build Coastguard Worker
501*e82f7db8SAndroid Build Coastguard Worker env = getEnv();
502*e82f7db8SAndroid Build Coastguard Worker
503*e82f7db8SAndroid Build Coastguard Worker WITH_LOCAL_REFS(env, 1) {
504*e82f7db8SAndroid Build Coastguard Worker
505*e82f7db8SAndroid Build Coastguard Worker int i;
506*e82f7db8SAndroid Build Coastguard Worker jint threadCount;
507*e82f7db8SAndroid Build Coastguard Worker jthread *theThreads;
508*e82f7db8SAndroid Build Coastguard Worker
509*e82f7db8SAndroid Build Coastguard Worker theThreads = allThreads(&threadCount);
510*e82f7db8SAndroid Build Coastguard Worker if (theThreads == NULL) {
511*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, JDWP_ERROR(OUT_OF_MEMORY));
512*e82f7db8SAndroid Build Coastguard Worker } else {
513*e82f7db8SAndroid Build Coastguard Worker /* Squish out all of the debugger-spawned threads */
514*e82f7db8SAndroid Build Coastguard Worker threadCount = filterDebugThreads(theThreads, threadCount);
515*e82f7db8SAndroid Build Coastguard Worker
516*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeInt(out, threadCount);
517*e82f7db8SAndroid Build Coastguard Worker for (i = 0; i <threadCount; i++) {
518*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeObjectRef(env, out, theThreads[i]);
519*e82f7db8SAndroid Build Coastguard Worker }
520*e82f7db8SAndroid Build Coastguard Worker
521*e82f7db8SAndroid Build Coastguard Worker jvmtiDeallocate(theThreads);
522*e82f7db8SAndroid Build Coastguard Worker }
523*e82f7db8SAndroid Build Coastguard Worker
524*e82f7db8SAndroid Build Coastguard Worker } END_WITH_LOCAL_REFS(env);
525*e82f7db8SAndroid Build Coastguard Worker
526*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
527*e82f7db8SAndroid Build Coastguard Worker }
528*e82f7db8SAndroid Build Coastguard Worker
529*e82f7db8SAndroid Build Coastguard Worker static jboolean
topLevelThreadGroups(PacketInputStream * in,PacketOutputStream * out)530*e82f7db8SAndroid Build Coastguard Worker topLevelThreadGroups(PacketInputStream *in, PacketOutputStream *out)
531*e82f7db8SAndroid Build Coastguard Worker {
532*e82f7db8SAndroid Build Coastguard Worker JNIEnv *env;
533*e82f7db8SAndroid Build Coastguard Worker
534*e82f7db8SAndroid Build Coastguard Worker if (gdata->vmDead) {
535*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, JDWP_ERROR(VM_DEAD));
536*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
537*e82f7db8SAndroid Build Coastguard Worker }
538*e82f7db8SAndroid Build Coastguard Worker
539*e82f7db8SAndroid Build Coastguard Worker env = getEnv();
540*e82f7db8SAndroid Build Coastguard Worker
541*e82f7db8SAndroid Build Coastguard Worker WITH_LOCAL_REFS(env, 1) {
542*e82f7db8SAndroid Build Coastguard Worker
543*e82f7db8SAndroid Build Coastguard Worker jvmtiError error;
544*e82f7db8SAndroid Build Coastguard Worker jint groupCount;
545*e82f7db8SAndroid Build Coastguard Worker jthreadGroup *groups;
546*e82f7db8SAndroid Build Coastguard Worker
547*e82f7db8SAndroid Build Coastguard Worker groups = NULL;
548*e82f7db8SAndroid Build Coastguard Worker error = JVMTI_FUNC_PTR(gdata->jvmti,GetTopThreadGroups)
549*e82f7db8SAndroid Build Coastguard Worker (gdata->jvmti, &groupCount, &groups);
550*e82f7db8SAndroid Build Coastguard Worker if (error != JVMTI_ERROR_NONE) {
551*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, map2jdwpError(error));
552*e82f7db8SAndroid Build Coastguard Worker } else {
553*e82f7db8SAndroid Build Coastguard Worker int i;
554*e82f7db8SAndroid Build Coastguard Worker
555*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeInt(out, groupCount);
556*e82f7db8SAndroid Build Coastguard Worker for (i = 0; i < groupCount; i++) {
557*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeObjectRef(env, out, groups[i]);
558*e82f7db8SAndroid Build Coastguard Worker }
559*e82f7db8SAndroid Build Coastguard Worker
560*e82f7db8SAndroid Build Coastguard Worker jvmtiDeallocate(groups);
561*e82f7db8SAndroid Build Coastguard Worker }
562*e82f7db8SAndroid Build Coastguard Worker
563*e82f7db8SAndroid Build Coastguard Worker } END_WITH_LOCAL_REFS(env);
564*e82f7db8SAndroid Build Coastguard Worker
565*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
566*e82f7db8SAndroid Build Coastguard Worker }
567*e82f7db8SAndroid Build Coastguard Worker
568*e82f7db8SAndroid Build Coastguard Worker static jboolean
dispose(PacketInputStream * in,PacketOutputStream * out)569*e82f7db8SAndroid Build Coastguard Worker dispose(PacketInputStream *in, PacketOutputStream *out)
570*e82f7db8SAndroid Build Coastguard Worker {
571*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
572*e82f7db8SAndroid Build Coastguard Worker }
573*e82f7db8SAndroid Build Coastguard Worker
574*e82f7db8SAndroid Build Coastguard Worker static jboolean
idSizes(PacketInputStream * in,PacketOutputStream * out)575*e82f7db8SAndroid Build Coastguard Worker idSizes(PacketInputStream *in, PacketOutputStream *out)
576*e82f7db8SAndroid Build Coastguard Worker {
577*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeInt(out, sizeof(jfieldID)); /* fields */
578*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeInt(out, sizeof(jmethodID)); /* methods */
579*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeInt(out, sizeof(jlong)); /* objects */
580*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeInt(out, sizeof(jlong)); /* referent types */
581*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeInt(out, sizeof(FrameID)); /* frames */
582*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
583*e82f7db8SAndroid Build Coastguard Worker }
584*e82f7db8SAndroid Build Coastguard Worker
585*e82f7db8SAndroid Build Coastguard Worker static jboolean
suspend(PacketInputStream * in,PacketOutputStream * out)586*e82f7db8SAndroid Build Coastguard Worker suspend(PacketInputStream *in, PacketOutputStream *out)
587*e82f7db8SAndroid Build Coastguard Worker {
588*e82f7db8SAndroid Build Coastguard Worker jvmtiError error;
589*e82f7db8SAndroid Build Coastguard Worker
590*e82f7db8SAndroid Build Coastguard Worker if (gdata->vmDead) {
591*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, JDWP_ERROR(VM_DEAD));
592*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
593*e82f7db8SAndroid Build Coastguard Worker }
594*e82f7db8SAndroid Build Coastguard Worker error = threadControl_suspendAll();
595*e82f7db8SAndroid Build Coastguard Worker if (error != JVMTI_ERROR_NONE) {
596*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, map2jdwpError(error));
597*e82f7db8SAndroid Build Coastguard Worker }
598*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
599*e82f7db8SAndroid Build Coastguard Worker }
600*e82f7db8SAndroid Build Coastguard Worker
601*e82f7db8SAndroid Build Coastguard Worker static jboolean
resume(PacketInputStream * in,PacketOutputStream * out)602*e82f7db8SAndroid Build Coastguard Worker resume(PacketInputStream *in, PacketOutputStream *out)
603*e82f7db8SAndroid Build Coastguard Worker {
604*e82f7db8SAndroid Build Coastguard Worker jvmtiError error;
605*e82f7db8SAndroid Build Coastguard Worker
606*e82f7db8SAndroid Build Coastguard Worker if (gdata->vmDead) {
607*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, JDWP_ERROR(VM_DEAD));
608*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
609*e82f7db8SAndroid Build Coastguard Worker }
610*e82f7db8SAndroid Build Coastguard Worker error = threadControl_resumeAll();
611*e82f7db8SAndroid Build Coastguard Worker if (error != JVMTI_ERROR_NONE) {
612*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, map2jdwpError(error));
613*e82f7db8SAndroid Build Coastguard Worker }
614*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
615*e82f7db8SAndroid Build Coastguard Worker }
616*e82f7db8SAndroid Build Coastguard Worker
617*e82f7db8SAndroid Build Coastguard Worker static jboolean
doExit(PacketInputStream * in,PacketOutputStream * out)618*e82f7db8SAndroid Build Coastguard Worker doExit(PacketInputStream *in, PacketOutputStream *out)
619*e82f7db8SAndroid Build Coastguard Worker {
620*e82f7db8SAndroid Build Coastguard Worker // ANDROID-CHANGED: We are about to exit(). Send ART cmd processing time,
621*e82f7db8SAndroid Build Coastguard Worker // if there are any remaining.
622*e82f7db8SAndroid Build Coastguard Worker timings_flush();
623*e82f7db8SAndroid Build Coastguard Worker
624*e82f7db8SAndroid Build Coastguard Worker jint exitCode;
625*e82f7db8SAndroid Build Coastguard Worker
626*e82f7db8SAndroid Build Coastguard Worker exitCode = inStream_readInt(in);
627*e82f7db8SAndroid Build Coastguard Worker if (gdata->vmDead) {
628*e82f7db8SAndroid Build Coastguard Worker /* quietly ignore */
629*e82f7db8SAndroid Build Coastguard Worker return JNI_FALSE;
630*e82f7db8SAndroid Build Coastguard Worker }
631*e82f7db8SAndroid Build Coastguard Worker
632*e82f7db8SAndroid Build Coastguard Worker /* We send the reply from here because we are about to exit. */
633*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in)) {
634*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, inStream_error(in));
635*e82f7db8SAndroid Build Coastguard Worker }
636*e82f7db8SAndroid Build Coastguard Worker outStream_sendReply(out);
637*e82f7db8SAndroid Build Coastguard Worker
638*e82f7db8SAndroid Build Coastguard Worker forceExit(exitCode);
639*e82f7db8SAndroid Build Coastguard Worker
640*e82f7db8SAndroid Build Coastguard Worker /* Shouldn't get here */
641*e82f7db8SAndroid Build Coastguard Worker JDI_ASSERT(JNI_FALSE);
642*e82f7db8SAndroid Build Coastguard Worker
643*e82f7db8SAndroid Build Coastguard Worker /* Shut up the compiler */
644*e82f7db8SAndroid Build Coastguard Worker return JNI_FALSE;
645*e82f7db8SAndroid Build Coastguard Worker
646*e82f7db8SAndroid Build Coastguard Worker }
647*e82f7db8SAndroid Build Coastguard Worker
648*e82f7db8SAndroid Build Coastguard Worker static jboolean
createString(PacketInputStream * in,PacketOutputStream * out)649*e82f7db8SAndroid Build Coastguard Worker createString(PacketInputStream *in, PacketOutputStream *out)
650*e82f7db8SAndroid Build Coastguard Worker {
651*e82f7db8SAndroid Build Coastguard Worker JNIEnv *env;
652*e82f7db8SAndroid Build Coastguard Worker char *cstring;
653*e82f7db8SAndroid Build Coastguard Worker
654*e82f7db8SAndroid Build Coastguard Worker if (gdata->vmDead) {
655*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, JDWP_ERROR(VM_DEAD));
656*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
657*e82f7db8SAndroid Build Coastguard Worker }
658*e82f7db8SAndroid Build Coastguard Worker
659*e82f7db8SAndroid Build Coastguard Worker cstring = inStream_readString(in);
660*e82f7db8SAndroid Build Coastguard Worker if (cstring == NULL) {
661*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, JDWP_ERROR(OUT_OF_MEMORY));
662*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
663*e82f7db8SAndroid Build Coastguard Worker }
664*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in)) {
665*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
666*e82f7db8SAndroid Build Coastguard Worker }
667*e82f7db8SAndroid Build Coastguard Worker
668*e82f7db8SAndroid Build Coastguard Worker env = getEnv();
669*e82f7db8SAndroid Build Coastguard Worker
670*e82f7db8SAndroid Build Coastguard Worker WITH_LOCAL_REFS(env, 1) {
671*e82f7db8SAndroid Build Coastguard Worker
672*e82f7db8SAndroid Build Coastguard Worker jstring string;
673*e82f7db8SAndroid Build Coastguard Worker
674*e82f7db8SAndroid Build Coastguard Worker string = JNI_FUNC_PTR(env,NewStringUTF)(env, cstring);
675*e82f7db8SAndroid Build Coastguard Worker if (JNI_FUNC_PTR(env,ExceptionOccurred)(env)) {
676*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, JDWP_ERROR(OUT_OF_MEMORY));
677*e82f7db8SAndroid Build Coastguard Worker } else {
678*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeObjectRef(env, out, string);
679*e82f7db8SAndroid Build Coastguard Worker }
680*e82f7db8SAndroid Build Coastguard Worker
681*e82f7db8SAndroid Build Coastguard Worker } END_WITH_LOCAL_REFS(env);
682*e82f7db8SAndroid Build Coastguard Worker
683*e82f7db8SAndroid Build Coastguard Worker jvmtiDeallocate(cstring);
684*e82f7db8SAndroid Build Coastguard Worker
685*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
686*e82f7db8SAndroid Build Coastguard Worker }
687*e82f7db8SAndroid Build Coastguard Worker
688*e82f7db8SAndroid Build Coastguard Worker static jboolean
capabilities(PacketInputStream * in,PacketOutputStream * out)689*e82f7db8SAndroid Build Coastguard Worker capabilities(PacketInputStream *in, PacketOutputStream *out)
690*e82f7db8SAndroid Build Coastguard Worker {
691*e82f7db8SAndroid Build Coastguard Worker jvmtiCapabilities caps;
692*e82f7db8SAndroid Build Coastguard Worker jvmtiError error;
693*e82f7db8SAndroid Build Coastguard Worker
694*e82f7db8SAndroid Build Coastguard Worker if (gdata->vmDead) {
695*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, JDWP_ERROR(VM_DEAD));
696*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
697*e82f7db8SAndroid Build Coastguard Worker }
698*e82f7db8SAndroid Build Coastguard Worker error = jvmtiGetCapabilities(&caps);
699*e82f7db8SAndroid Build Coastguard Worker if (error != JVMTI_ERROR_NONE) {
700*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, map2jdwpError(error));
701*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
702*e82f7db8SAndroid Build Coastguard Worker }
703*e82f7db8SAndroid Build Coastguard Worker
704*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)caps.can_generate_field_modification_events);
705*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)caps.can_generate_field_access_events);
706*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)caps.can_get_bytecodes);
707*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)caps.can_get_synthetic_attribute);
708*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)caps.can_get_owned_monitor_info);
709*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)caps.can_get_current_contended_monitor);
710*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)caps.can_get_monitor_info);
711*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
712*e82f7db8SAndroid Build Coastguard Worker }
713*e82f7db8SAndroid Build Coastguard Worker
714*e82f7db8SAndroid Build Coastguard Worker static jboolean
capabilitiesNew(PacketInputStream * in,PacketOutputStream * out)715*e82f7db8SAndroid Build Coastguard Worker capabilitiesNew(PacketInputStream *in, PacketOutputStream *out)
716*e82f7db8SAndroid Build Coastguard Worker {
717*e82f7db8SAndroid Build Coastguard Worker jvmtiCapabilities caps;
718*e82f7db8SAndroid Build Coastguard Worker jvmtiError error;
719*e82f7db8SAndroid Build Coastguard Worker
720*e82f7db8SAndroid Build Coastguard Worker if (gdata->vmDead) {
721*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, JDWP_ERROR(VM_DEAD));
722*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
723*e82f7db8SAndroid Build Coastguard Worker }
724*e82f7db8SAndroid Build Coastguard Worker error = jvmtiGetCapabilities(&caps);
725*e82f7db8SAndroid Build Coastguard Worker if (error != JVMTI_ERROR_NONE) {
726*e82f7db8SAndroid Build Coastguard Worker outStream_setError(out, map2jdwpError(error));
727*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
728*e82f7db8SAndroid Build Coastguard Worker }
729*e82f7db8SAndroid Build Coastguard Worker
730*e82f7db8SAndroid Build Coastguard Worker // ANDROID-CHANGED: We want to adjust the capabilities slightly if we are on android.
731*e82f7db8SAndroid Build Coastguard Worker jboolean is_android_runtime = strcmp(gdata->property_java_vm_name, "Dalvik") == 0;
732*e82f7db8SAndroid Build Coastguard Worker
733*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)caps.can_generate_field_modification_events);
734*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)caps.can_generate_field_access_events);
735*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)caps.can_get_bytecodes);
736*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)caps.can_get_synthetic_attribute);
737*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)caps.can_get_owned_monitor_info);
738*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)caps.can_get_current_contended_monitor);
739*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)caps.can_get_monitor_info);
740*e82f7db8SAndroid Build Coastguard Worker
741*e82f7db8SAndroid Build Coastguard Worker /* new since JDWP version 1.4 */
742*e82f7db8SAndroid Build Coastguard Worker /* ANDROID-CHANGED: some jdwp clients will send us class files for redefineClasses which we do
743*e82f7db8SAndroid Build Coastguard Worker * not support. Set this capability to false and set reserved32 instead to indicate that we do
744*e82f7db8SAndroid Build Coastguard Worker * support .dex file class redefinition.
745*e82f7db8SAndroid Build Coastguard Worker */
746*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)caps.can_redefine_classes && !is_android_runtime);
747*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)JNI_FALSE /* can_add_method */ );
748*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)JNI_FALSE /* can_unrestrictedly_redefine_classes */ );
749*e82f7db8SAndroid Build Coastguard Worker /* 11: canPopFrames */
750*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)caps.can_pop_frame);
751*e82f7db8SAndroid Build Coastguard Worker /* 12: canUseInstanceFilters */
752*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)JNI_TRUE);
753*e82f7db8SAndroid Build Coastguard Worker /* 13: canGetSourceDebugExtension */
754*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)caps.can_get_source_debug_extension);
755*e82f7db8SAndroid Build Coastguard Worker /* 14: canRequestVMDeathEvent */
756*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)JNI_TRUE);
757*e82f7db8SAndroid Build Coastguard Worker /* 15: canSetDefaultStratum */
758*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)JNI_TRUE);
759*e82f7db8SAndroid Build Coastguard Worker /* 16: canGetInstanceInfo */
760*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)caps.can_tag_objects);
761*e82f7db8SAndroid Build Coastguard Worker /* 17: canRequestMonitorEvents */
762*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)caps.can_generate_monitor_events);
763*e82f7db8SAndroid Build Coastguard Worker /* 18: canGetMonitorFrameInfo */
764*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)caps.can_get_owned_monitor_stack_depth_info);
765*e82f7db8SAndroid Build Coastguard Worker /* remaining reserved */
766*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)JNI_FALSE); /* 19 */
767*e82f7db8SAndroid Build Coastguard Worker /* 20 Can get constant pool information */
768*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)caps.can_get_constant_pool);
769*e82f7db8SAndroid Build Coastguard Worker /* 21 Can force early return */
770*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)caps.can_force_early_return);
771*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)JNI_FALSE); /* 22 */
772*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)JNI_FALSE); /* 23 */
773*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)JNI_FALSE); /* 24 */
774*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)JNI_FALSE); /* 25 */
775*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)JNI_FALSE); /* 26 */
776*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)JNI_FALSE); /* 27 */
777*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)JNI_FALSE); /* 28 */
778*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)JNI_FALSE); /* 29 */
779*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)JNI_FALSE); /* 30 */
780*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)JNI_FALSE); /* 31 */
781*e82f7db8SAndroid Build Coastguard Worker /* ANDROID-CHANGED: Use the reserved32 capability to notify clients that we can support dex
782*e82f7db8SAndroid Build Coastguard Worker * class redefinition.
783*e82f7db8SAndroid Build Coastguard Worker */
784*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeBoolean(out, (jboolean)caps.can_redefine_classes && is_android_runtime);
785*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
786*e82f7db8SAndroid Build Coastguard Worker }
787*e82f7db8SAndroid Build Coastguard Worker
788*e82f7db8SAndroid Build Coastguard Worker static int
countPaths(char * string)789*e82f7db8SAndroid Build Coastguard Worker countPaths(char *string) {
790*e82f7db8SAndroid Build Coastguard Worker int cnt = 1; /* always have one */
791*e82f7db8SAndroid Build Coastguard Worker char *pos = string;
792*e82f7db8SAndroid Build Coastguard Worker char *ps;
793*e82f7db8SAndroid Build Coastguard Worker
794*e82f7db8SAndroid Build Coastguard Worker ps = gdata->property_path_separator;
795*e82f7db8SAndroid Build Coastguard Worker if ( ps == NULL ) {
796*e82f7db8SAndroid Build Coastguard Worker ps = ";";
797*e82f7db8SAndroid Build Coastguard Worker }
798*e82f7db8SAndroid Build Coastguard Worker while ((pos = strchr(pos, ps[0])) != NULL) {
799*e82f7db8SAndroid Build Coastguard Worker ++cnt;
800*e82f7db8SAndroid Build Coastguard Worker ++pos;
801*e82f7db8SAndroid Build Coastguard Worker }
802*e82f7db8SAndroid Build Coastguard Worker return cnt;
803*e82f7db8SAndroid Build Coastguard Worker }
804*e82f7db8SAndroid Build Coastguard Worker
805*e82f7db8SAndroid Build Coastguard Worker static void
writePaths(PacketOutputStream * out,char * string)806*e82f7db8SAndroid Build Coastguard Worker writePaths(PacketOutputStream *out, char *string) {
807*e82f7db8SAndroid Build Coastguard Worker char *pos;
808*e82f7db8SAndroid Build Coastguard Worker char *ps;
809*e82f7db8SAndroid Build Coastguard Worker char *buf;
810*e82f7db8SAndroid Build Coastguard Worker int npaths;
811*e82f7db8SAndroid Build Coastguard Worker int i;
812*e82f7db8SAndroid Build Coastguard Worker
813*e82f7db8SAndroid Build Coastguard Worker buf = jvmtiAllocate((int)strlen(string)+1);
814*e82f7db8SAndroid Build Coastguard Worker
815*e82f7db8SAndroid Build Coastguard Worker npaths = countPaths(string);
816*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeInt(out, npaths);
817*e82f7db8SAndroid Build Coastguard Worker
818*e82f7db8SAndroid Build Coastguard Worker ps = gdata->property_path_separator;
819*e82f7db8SAndroid Build Coastguard Worker if ( ps == NULL ) {
820*e82f7db8SAndroid Build Coastguard Worker ps = ";";
821*e82f7db8SAndroid Build Coastguard Worker }
822*e82f7db8SAndroid Build Coastguard Worker
823*e82f7db8SAndroid Build Coastguard Worker pos = string;
824*e82f7db8SAndroid Build Coastguard Worker for ( i = 0 ; i < npaths ; i++ ) {
825*e82f7db8SAndroid Build Coastguard Worker char *psPos;
826*e82f7db8SAndroid Build Coastguard Worker int plen;
827*e82f7db8SAndroid Build Coastguard Worker
828*e82f7db8SAndroid Build Coastguard Worker psPos = strchr(pos, ps[0]);
829*e82f7db8SAndroid Build Coastguard Worker if ( psPos == NULL ) {
830*e82f7db8SAndroid Build Coastguard Worker plen = (int)strlen(pos);
831*e82f7db8SAndroid Build Coastguard Worker } else {
832*e82f7db8SAndroid Build Coastguard Worker plen = (int)(psPos-pos);
833*e82f7db8SAndroid Build Coastguard Worker psPos++;
834*e82f7db8SAndroid Build Coastguard Worker }
835*e82f7db8SAndroid Build Coastguard Worker (void)memcpy(buf, pos, plen);
836*e82f7db8SAndroid Build Coastguard Worker buf[plen] = 0;
837*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeString(out, buf);
838*e82f7db8SAndroid Build Coastguard Worker pos = psPos;
839*e82f7db8SAndroid Build Coastguard Worker }
840*e82f7db8SAndroid Build Coastguard Worker
841*e82f7db8SAndroid Build Coastguard Worker jvmtiDeallocate(buf);
842*e82f7db8SAndroid Build Coastguard Worker }
843*e82f7db8SAndroid Build Coastguard Worker
844*e82f7db8SAndroid Build Coastguard Worker
845*e82f7db8SAndroid Build Coastguard Worker
846*e82f7db8SAndroid Build Coastguard Worker static jboolean
classPaths(PacketInputStream * in,PacketOutputStream * out)847*e82f7db8SAndroid Build Coastguard Worker classPaths(PacketInputStream *in, PacketOutputStream *out)
848*e82f7db8SAndroid Build Coastguard Worker {
849*e82f7db8SAndroid Build Coastguard Worker char *ud;
850*e82f7db8SAndroid Build Coastguard Worker char *bp;
851*e82f7db8SAndroid Build Coastguard Worker char *cp;
852*e82f7db8SAndroid Build Coastguard Worker
853*e82f7db8SAndroid Build Coastguard Worker ud = gdata->property_user_dir;
854*e82f7db8SAndroid Build Coastguard Worker if ( ud == NULL ) {
855*e82f7db8SAndroid Build Coastguard Worker ud = "";
856*e82f7db8SAndroid Build Coastguard Worker }
857*e82f7db8SAndroid Build Coastguard Worker cp = gdata->property_java_class_path;
858*e82f7db8SAndroid Build Coastguard Worker if ( cp == NULL ) {
859*e82f7db8SAndroid Build Coastguard Worker cp = "";
860*e82f7db8SAndroid Build Coastguard Worker }
861*e82f7db8SAndroid Build Coastguard Worker bp = gdata->property_sun_boot_class_path;
862*e82f7db8SAndroid Build Coastguard Worker if ( bp == NULL ) {
863*e82f7db8SAndroid Build Coastguard Worker bp = "";
864*e82f7db8SAndroid Build Coastguard Worker }
865*e82f7db8SAndroid Build Coastguard Worker (void)outStream_writeString(out, ud);
866*e82f7db8SAndroid Build Coastguard Worker writePaths(out, cp);
867*e82f7db8SAndroid Build Coastguard Worker writePaths(out, bp);
868*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
869*e82f7db8SAndroid Build Coastguard Worker }
870*e82f7db8SAndroid Build Coastguard Worker
871*e82f7db8SAndroid Build Coastguard Worker static jboolean
disposeObjects(PacketInputStream * in,PacketOutputStream * out)872*e82f7db8SAndroid Build Coastguard Worker disposeObjects(PacketInputStream *in, PacketOutputStream *out)
873*e82f7db8SAndroid Build Coastguard Worker {
874*e82f7db8SAndroid Build Coastguard Worker int i;
875*e82f7db8SAndroid Build Coastguard Worker int refCount;
876*e82f7db8SAndroid Build Coastguard Worker jlong id;
877*e82f7db8SAndroid Build Coastguard Worker int requestCount;
878*e82f7db8SAndroid Build Coastguard Worker JNIEnv *env;
879*e82f7db8SAndroid Build Coastguard Worker
880*e82f7db8SAndroid Build Coastguard Worker if (gdata->vmDead) {
881*e82f7db8SAndroid Build Coastguard Worker /* quietly ignore */
882*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
883*e82f7db8SAndroid Build Coastguard Worker }
884*e82f7db8SAndroid Build Coastguard Worker
885*e82f7db8SAndroid Build Coastguard Worker requestCount = inStream_readInt(in);
886*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in)) {
887*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
888*e82f7db8SAndroid Build Coastguard Worker }
889*e82f7db8SAndroid Build Coastguard Worker
890*e82f7db8SAndroid Build Coastguard Worker env = getEnv();
891*e82f7db8SAndroid Build Coastguard Worker for (i = 0; i < requestCount; i++) {
892*e82f7db8SAndroid Build Coastguard Worker id = inStream_readObjectID(in);
893*e82f7db8SAndroid Build Coastguard Worker refCount = inStream_readInt(in);
894*e82f7db8SAndroid Build Coastguard Worker if (inStream_error(in)) {
895*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
896*e82f7db8SAndroid Build Coastguard Worker }
897*e82f7db8SAndroid Build Coastguard Worker commonRef_releaseMultiple(env, id, refCount);
898*e82f7db8SAndroid Build Coastguard Worker }
899*e82f7db8SAndroid Build Coastguard Worker
900*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
901*e82f7db8SAndroid Build Coastguard Worker }
902*e82f7db8SAndroid Build Coastguard Worker
903*e82f7db8SAndroid Build Coastguard Worker static jboolean
holdEvents(PacketInputStream * in,PacketOutputStream * out)904*e82f7db8SAndroid Build Coastguard Worker holdEvents(PacketInputStream *in, PacketOutputStream *out)
905*e82f7db8SAndroid Build Coastguard Worker {
906*e82f7db8SAndroid Build Coastguard Worker eventHelper_holdEvents();
907*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
908*e82f7db8SAndroid Build Coastguard Worker }
909*e82f7db8SAndroid Build Coastguard Worker
910*e82f7db8SAndroid Build Coastguard Worker static jboolean
releaseEvents(PacketInputStream * in,PacketOutputStream * out)911*e82f7db8SAndroid Build Coastguard Worker releaseEvents(PacketInputStream *in, PacketOutputStream *out)
912*e82f7db8SAndroid Build Coastguard Worker {
913*e82f7db8SAndroid Build Coastguard Worker eventHelper_releaseEvents();
914*e82f7db8SAndroid Build Coastguard Worker return JNI_TRUE;
915*e82f7db8SAndroid Build Coastguard Worker }
916*e82f7db8SAndroid Build Coastguard Worker
917*e82f7db8SAndroid Build Coastguard Worker void *VirtualMachine_Cmds[] = { (void *)21
918*e82f7db8SAndroid Build Coastguard Worker ,(void *)version
919*e82f7db8SAndroid Build Coastguard Worker ,(void *)classesForSignature
920*e82f7db8SAndroid Build Coastguard Worker ,(void *)allClasses
921*e82f7db8SAndroid Build Coastguard Worker ,(void *)getAllThreads
922*e82f7db8SAndroid Build Coastguard Worker ,(void *)topLevelThreadGroups
923*e82f7db8SAndroid Build Coastguard Worker ,(void *)dispose
924*e82f7db8SAndroid Build Coastguard Worker ,(void *)idSizes
925*e82f7db8SAndroid Build Coastguard Worker ,(void *)suspend
926*e82f7db8SAndroid Build Coastguard Worker ,(void *)resume
927*e82f7db8SAndroid Build Coastguard Worker ,(void *)doExit
928*e82f7db8SAndroid Build Coastguard Worker ,(void *)createString
929*e82f7db8SAndroid Build Coastguard Worker ,(void *)capabilities
930*e82f7db8SAndroid Build Coastguard Worker ,(void *)classPaths
931*e82f7db8SAndroid Build Coastguard Worker ,(void *)disposeObjects
932*e82f7db8SAndroid Build Coastguard Worker ,(void *)holdEvents
933*e82f7db8SAndroid Build Coastguard Worker ,(void *)releaseEvents
934*e82f7db8SAndroid Build Coastguard Worker ,(void *)capabilitiesNew
935*e82f7db8SAndroid Build Coastguard Worker ,(void *)redefineClasses
936*e82f7db8SAndroid Build Coastguard Worker ,(void *)setDefaultStratum
937*e82f7db8SAndroid Build Coastguard Worker ,(void *)allClassesWithGeneric
938*e82f7db8SAndroid Build Coastguard Worker ,(void *)instanceCounts
939*e82f7db8SAndroid Build Coastguard Worker };
940