21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
22 * or visit www.oracle.com if you need additional information or have any |
22 * or visit www.oracle.com if you need additional information or have any |
23 * questions. |
23 * questions. |
24 */ |
24 */ |
25 |
25 |
|
26 #include <stdlib.h> |
26 #include <jni.h> |
27 #include <jni.h> |
27 #include "management.h" |
28 #include "management.h" |
28 #include "sun_management_DiagnosticCommandImpl.h" |
29 #include "sun_management_DiagnosticCommandImpl.h" |
29 |
30 |
30 JNIEXPORT void JNICALL Java_sun_management_DiagnosticCommandImpl_setNotificationEnabled |
31 JNIEXPORT void JNICALL Java_sun_management_DiagnosticCommandImpl_setNotificationEnabled |
54 jclass arraysCls; |
55 jclass arraysCls; |
55 jmethodID mid; |
56 jmethodID mid; |
56 jobject resultList; |
57 jobject resultList; |
57 |
58 |
58 dcmd_arg_info_array = (dcmdArgInfo*) malloc(num_arg * sizeof(dcmdArgInfo)); |
59 dcmd_arg_info_array = (dcmdArgInfo*) malloc(num_arg * sizeof(dcmdArgInfo)); |
59 if (dcmd_arg_info_array == NULL) { |
60 /* According to ISO C it is perfectly legal for malloc to return zero if called with a zero argument */ |
|
61 if (dcmd_arg_info_array == NULL && num_arg != 0) { |
60 return NULL; |
62 return NULL; |
61 } |
63 } |
62 jmm_interface->GetDiagnosticCommandArgumentsInfo(env, command, |
64 jmm_interface->GetDiagnosticCommandArgumentsInfo(env, command, |
63 dcmd_arg_info_array); |
65 dcmd_arg_info_array); |
64 dcmdArgInfoCls = (*env)->FindClass(env, |
66 dcmdArgInfoCls = (*env)->FindClass(env, |
115 if (commands == NULL) { |
117 if (commands == NULL) { |
116 JNU_ThrowNullPointerException(env, "Invalid String Array"); |
118 JNU_ThrowNullPointerException(env, "Invalid String Array"); |
117 return NULL; |
119 return NULL; |
118 } |
120 } |
119 num_commands = (*env)->GetArrayLength(env, commands); |
121 num_commands = (*env)->GetArrayLength(env, commands); |
120 dcmd_info_array = (dcmdInfo*) malloc(num_commands * |
122 dcmdInfoCls = (*env)->FindClass(env, |
121 sizeof(dcmdInfo)); |
123 "sun/management/DiagnosticCommandInfo"); |
|
124 result = (*env)->NewObjectArray(env, num_commands, dcmdInfoCls, NULL); |
|
125 if (result == NULL) { |
|
126 JNU_ThrowOutOfMemoryError(env, 0); |
|
127 } |
|
128 if (num_commands == 0) { |
|
129 /* Handle the 'zero commands' case specially to avoid calling 'malloc()' */ |
|
130 /* with a zero argument because that may legally return a NULL pointer. */ |
|
131 return result; |
|
132 } |
|
133 dcmd_info_array = (dcmdInfo*) malloc(num_commands * sizeof(dcmdInfo)); |
122 if (dcmd_info_array == NULL) { |
134 if (dcmd_info_array == NULL) { |
123 JNU_ThrowOutOfMemoryError(env, NULL); |
135 JNU_ThrowOutOfMemoryError(env, NULL); |
124 } |
136 } |
125 jmm_interface->GetDiagnosticCommandInfo(env, commands, dcmd_info_array); |
137 jmm_interface->GetDiagnosticCommandInfo(env, commands, dcmd_info_array); |
126 dcmdInfoCls = (*env)->FindClass(env, |
|
127 "sun/management/DiagnosticCommandInfo"); |
|
128 result = (*env)->NewObjectArray(env, num_commands, dcmdInfoCls, NULL); |
|
129 if (result == NULL) { |
|
130 free(dcmd_info_array); |
|
131 JNU_ThrowOutOfMemoryError(env, 0); |
|
132 } |
|
133 for (i=0; i<num_commands; i++) { |
138 for (i=0; i<num_commands; i++) { |
134 args = getDiagnosticCommandArgumentInfoArray(env, |
139 args = getDiagnosticCommandArgumentInfoArray(env, |
135 (*env)->GetObjectArrayElement(env,commands,i), |
140 (*env)->GetObjectArrayElement(env,commands,i), |
136 dcmd_info_array[i].num_arguments); |
141 dcmd_info_array[i].num_arguments); |
137 if (args == NULL) { |
142 if (args == NULL) { |