jdk/src/share/native/sun/management/DiagnosticCommandImpl.c
changeset 22605 dba3d6b22818
parent 18299 627400b6bdcf
child 22624 860bde7fa0eb
equal deleted inserted replaced
22604:9b394795e216 22605:dba3d6b22818
    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) {