X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fjava.c;h=10d837e6701fcc9f4532b0a4f19c4c5e12a03532;hb=b6fbfb1b864be53e71d755fba59d633f5c30da7e;hp=528ec9c475656140b4572bf30361c1c082fbd46b;hpb=37676c3b280e15df8efbef2a3dc6c9096d1ae03b;p=collectd.git diff --git a/src/java.c b/src/java.c index 528ec9c4..10d837e6 100644 --- a/src/java.c +++ b/src/java.c @@ -109,7 +109,7 @@ static int cjni_callback_register (JNIEnv *jvm_env, jobject o_name, static int cjni_read (user_data_t *user_data); static int cjni_write (const data_set_t *ds, const value_list_t *vl, user_data_t *ud); -static int cjni_flush (int timeout, const char *identifier, user_data_t *ud); +static int cjni_flush (cdtime_t timeout, const char *identifier, user_data_t *ud); static void cjni_log (int severity, const char *message, user_data_t *ud); static int cjni_notification (const notification_t *n, user_data_t *ud); @@ -809,7 +809,7 @@ static jobject ctoj_value_list (JNIEnv *jvm_env, /* {{{ */ #undef SET_STRING /* Set the `time' member. Java stores time in milliseconds. */ - status = ctoj_long (jvm_env, ((jlong) vl->time) * ((jlong) 1000), + status = ctoj_long (jvm_env, (jlong) CDTIME_T_TO_MS (vl->time), c_valuelist, o_valuelist, "setTime"); if (status != 0) { @@ -819,7 +819,8 @@ static jobject ctoj_value_list (JNIEnv *jvm_env, /* {{{ */ } /* Set the `interval' member.. */ - status = ctoj_long (jvm_env, (jlong) vl->interval, + status = ctoj_long (jvm_env, + (jlong) CDTIME_T_TO_MS (vl->interval), c_valuelist, o_valuelist, "setInterval"); if (status != 0) { @@ -905,7 +906,7 @@ static jobject ctoj_notification (JNIEnv *jvm_env, /* {{{ */ #undef SET_STRING /* Set the `time' member. Java stores time in milliseconds. */ - status = ctoj_long (jvm_env, ((jlong) n->time) * ((jlong) 1000), + status = ctoj_long (jvm_env, (jlong) CDTIME_T_TO_MS (n->time), c_notification, o_notification, "setTime"); if (status != 0) { @@ -914,7 +915,7 @@ static jobject ctoj_notification (JNIEnv *jvm_env, /* {{{ */ return (NULL); } - /* Set the `interval' member.. */ + /* Set the `severity' member.. */ status = ctoj_int (jvm_env, (jint) n->severity, c_notification, o_notification, "setSeverity"); if (status != 0) @@ -1242,7 +1243,7 @@ static int jtoc_value_list (JNIEnv *jvm_env, value_list_t *vl, /* {{{ */ return (-1); } /* Java measures time in milliseconds. */ - vl->time = (time_t) (tmp_long / ((jlong) 1000)); + vl->time = MS_TO_CDTIME_T (tmp_long); status = jtoc_long (jvm_env, &tmp_long, class_ptr, object_ptr, "getInterval"); @@ -1251,7 +1252,7 @@ static int jtoc_value_list (JNIEnv *jvm_env, value_list_t *vl, /* {{{ */ ERROR ("java plugin: jtoc_value_list: jtoc_long (getInterval) failed."); return (-1); } - vl->interval = (int) tmp_long; + vl->interval = MS_TO_CDTIME_T (tmp_long); status = jtoc_values_array (jvm_env, ds, vl, class_ptr, object_ptr); if (status != 0) @@ -1305,7 +1306,7 @@ static int jtoc_notification (JNIEnv *jvm_env, notification_t *n, /* {{{ */ return (-1); } /* Java measures time in milliseconds. */ - n->time = (time_t) (tmp_long / ((jlong) 1000)); + n->time = MS_TO_CDTIME_T(tmp_long); status = jtoc_int (jvm_env, &tmp_int, class_ptr, object_ptr, "getSeverity"); @@ -1729,7 +1730,7 @@ static cjni_callback_info_t *cjni_callback_info_create (JNIEnv *jvm_env, /* {{{ case CB_TYPE_FLUSH: method_name = "flush"; - method_signature = "(ILjava/lang/String;)I"; + method_signature = "(Ljava/lang/Number;Ljava/lang/String;)I"; break; case CB_TYPE_SHUTDOWN: @@ -1931,7 +1932,9 @@ static int cjni_init_native (JNIEnv *jvm_env) /* {{{ */ api_class_ptr = (*jvm_env)->FindClass (jvm_env, "org/collectd/api/Collectd"); if (api_class_ptr == NULL) { - ERROR ("cjni_init_native: Cannot find API class `org/collectd/api/Collectd'."); + ERROR ("cjni_init_native: Cannot find the API class \"org.collectd.api" + ".Collectd\". Please set the correct class path " + "using 'JVMArg \"-Djava.class.path=...\"'."); return (-1); } @@ -2112,7 +2115,7 @@ static int cjni_thread_detach (void) /* {{{ */ cjni_env->jvm_env = NULL; return (0); -} /* }}} JNIEnv *cjni_thread_attach */ +} /* }}} int cjni_thread_detach */ static int cjni_config_add_jvm_arg (oconfig_item_t *ci) /* {{{ */ { @@ -2253,7 +2256,6 @@ static int cjni_config_plugin_block (oconfig_item_t *ci) /* {{{ */ cjni_callback_info_t *cbi; jobject o_ocitem; const char *name; - int status; size_t i; jclass class; @@ -2308,7 +2310,7 @@ static int cjni_config_plugin_block (oconfig_item_t *ci) /* {{{ */ method = (*jvm_env)->GetMethodID (jvm_env, class, "config", "(Lorg/collectd/api/OConfigItem;)I"); - status = (*jvm_env)->CallIntMethod (jvm_env, + (*jvm_env)->CallIntMethod (jvm_env, cbi->object, method, o_ocitem); (*jvm_env)->DeleteLocalRef (jvm_env, o_ocitem); @@ -2466,7 +2468,6 @@ static int cjni_read (user_data_t *ud) /* {{{ */ { JNIEnv *jvm_env; cjni_callback_info_t *cbi; - int status; int ret_status; if (jvm == NULL) @@ -2490,13 +2491,7 @@ static int cjni_read (user_data_t *ud) /* {{{ */ ret_status = (*jvm_env)->CallIntMethod (jvm_env, cbi->object, cbi->method); - status = cjni_thread_detach (); - if (status != 0) - { - ERROR ("java plugin: cjni_read: cjni_thread_detach failed."); - return (-1); - } - + cjni_thread_detach (); return (ret_status); } /* }}} int cjni_read */ @@ -2507,7 +2502,6 @@ static int cjni_write (const data_set_t *ds, const value_list_t *vl, /* {{{ */ JNIEnv *jvm_env; cjni_callback_info_t *cbi; jobject vl_java; - int status; int ret_status; if (jvm == NULL) @@ -2532,6 +2526,7 @@ static int cjni_write (const data_set_t *ds, const value_list_t *vl, /* {{{ */ if (vl_java == NULL) { ERROR ("java plugin: cjni_write: ctoj_value_list failed."); + cjni_thread_detach (); return (-1); } @@ -2540,24 +2535,18 @@ static int cjni_write (const data_set_t *ds, const value_list_t *vl, /* {{{ */ (*jvm_env)->DeleteLocalRef (jvm_env, vl_java); - status = cjni_thread_detach (); - if (status != 0) - { - ERROR ("java plugin: cjni_write: cjni_thread_detach failed."); - return (-1); - } - + cjni_thread_detach (); return (ret_status); } /* }}} int cjni_write */ /* Call the CB_TYPE_FLUSH callback pointed to by the `user_data_t' pointer. */ -static int cjni_flush (int timeout, const char *identifier, /* {{{ */ +static int cjni_flush (cdtime_t timeout, const char *identifier, /* {{{ */ user_data_t *ud) { JNIEnv *jvm_env; cjni_callback_info_t *cbi; + jobject o_timeout; jobject o_identifier; - int status; int ret_status; if (jvm == NULL) @@ -2578,29 +2567,36 @@ static int cjni_flush (int timeout, const char *identifier, /* {{{ */ cbi = (cjni_callback_info_t *) ud->data; + o_timeout = ctoj_jdouble_to_number (jvm_env, + (jdouble) CDTIME_T_TO_DOUBLE (timeout)); + if (o_timeout == NULL) + { + ERROR ("java plugin: cjni_flush: Converting double " + "to Number object failed."); + cjni_thread_detach (); + return (-1); + } + o_identifier = NULL; if (identifier != NULL) { o_identifier = (*jvm_env)->NewStringUTF (jvm_env, identifier); if (o_identifier == NULL) { + (*jvm_env)->DeleteLocalRef (jvm_env, o_timeout); ERROR ("java plugin: cjni_flush: NewStringUTF failed."); + cjni_thread_detach (); return (-1); } } ret_status = (*jvm_env)->CallIntMethod (jvm_env, - cbi->object, cbi->method, (jint) timeout, o_identifier); + cbi->object, cbi->method, o_timeout, o_identifier); (*jvm_env)->DeleteLocalRef (jvm_env, o_identifier); + (*jvm_env)->DeleteLocalRef (jvm_env, o_timeout); - status = cjni_thread_detach (); - if (status != 0) - { - ERROR ("java plugin: cjni_flush: cjni_thread_detach failed."); - return (-1); - } - + cjni_thread_detach (); return (ret_status); } /* }}} int cjni_flush */ @@ -2626,7 +2622,10 @@ static void cjni_log (int severity, const char *message, /* {{{ */ o_message = (*jvm_env)->NewStringUTF (jvm_env, message); if (o_message == NULL) + { + cjni_thread_detach (); return; + } (*jvm_env)->CallVoidMethod (jvm_env, cbi->object, cbi->method, (jint) severity, o_message); @@ -2644,7 +2643,6 @@ static int cjni_notification (const notification_t *n, /* {{{ */ JNIEnv *jvm_env; cjni_callback_info_t *cbi; jobject o_notification; - int status; int ret_status; if (jvm == NULL) @@ -2669,6 +2667,7 @@ static int cjni_notification (const notification_t *n, /* {{{ */ if (o_notification == NULL) { ERROR ("java plugin: cjni_notification: ctoj_notification failed."); + cjni_thread_detach (); return (-1); } @@ -2677,13 +2676,7 @@ static int cjni_notification (const notification_t *n, /* {{{ */ (*jvm_env)->DeleteLocalRef (jvm_env, o_notification); - status = cjni_thread_detach (); - if (status != 0) - { - ERROR ("java plugin: cjni_read: cjni_thread_detach failed."); - return (-1); - } - + cjni_thread_detach (); return (ret_status); } /* }}} int cjni_notification */ @@ -2711,24 +2704,20 @@ static int cjni_match_target_create (const oconfig_item_t *ci, /* {{{ */ (*jvm_env)->DeleteLocalRef (jvm_env, cbi_ret->object); \ } \ free (cbi_ret); \ - if (jvm_env != NULL) { \ - if (o_ci != NULL) \ - (*jvm_env)->DeleteLocalRef (jvm_env, o_ci); \ - cjni_thread_detach (); \ - } \ + if (o_ci != NULL) \ + (*jvm_env)->DeleteLocalRef (jvm_env, o_ci); \ + cjni_thread_detach (); \ return (status) if (jvm == NULL) { ERROR ("java plugin: cjni_read: jvm == NULL"); - BAIL_OUT (-1); + return (-1); } jvm_env = cjni_thread_attach (); if (jvm_env == NULL) - { - BAIL_OUT (-1); - } + return (-1); /* Find out whether to create a match or a target. */ if (strcasecmp ("Match", ci->key) == 0) @@ -2922,10 +2911,7 @@ static int cjni_match_target_invoke (const data_set_t *ds, /* {{{ */ } } /* if (cbi->type == CB_TYPE_TARGET) */ - status = cjni_thread_detach (); - if (status != 0) - ERROR ("java plugin: cjni_read: cjni_thread_detach failed."); - + cjni_thread_detach (); return (ret_status); } /* }}} int cjni_match_target_invoke */ @@ -3065,11 +3051,8 @@ static int cjni_init (void) /* {{{ */ if (config_block != NULL) { - int status; - - status = cjni_config_perform (config_block); + cjni_config_perform (config_block); oconfig_free (config_block); - config_block = NULL; } if (jvm == NULL)