JNIEXPORT jlongArray SIGAR_JNI(ptql_SigarProcessQuery_find)
(JNIEnv *env, jobject obj, jobject sigar_obj)
{
    int status;
    jlongArray procarray;
    sigar_proc_list_t proclist;
    jlong *pids = NULL;
    jni_ptql_re_data_t re;
    sigar_ptql_query_t *query =
        (sigar_ptql_query_t *)sigar_get_pointer(env, obj);
    dSIGAR(NULL);

    re_impl_set(env, sigar, obj, &re);

    status = sigar_ptql_query_find(sigar, query, &proclist);

    sigar_ptql_re_impl_set(sigar, NULL, NULL);

    if (status < 0) {
        sigar_throw_exception(env, sigar->errbuf);
        return NULL;
    }
    else if (status != SIGAR_OK) {
        sigar_throw_error(env, jsigar, status);
        return NULL;
    }

    procarray = JENV->NewLongArray(env, proclist.number);
    SIGAR_CHEX;

    if (sizeof(jlong) == sizeof(sigar_pid_t)) {
        pids = (jlong *)proclist.data;
    }
    else {
        unsigned int i;
        pids = (jlong *)malloc(sizeof(jlong) * proclist.number);

        for (i=0; i<proclist.number; i++) {
            pids[i] = proclist.data[i];
        }
    }

    JENV->SetLongArrayRegion(env, procarray, 0,
                             proclist.number, pids);

    if (pids != (jlong *)proclist.data) {
        free(pids);
    }

    sigar_proc_list_destroy(sigar, &proclist);

    return procarray;
}
Exemple #2
0
static VALUE rb_sigar_proc_list(int argc, VALUE *argv, VALUE obj)
{
    SIGAR_GET;

    int status;
    sigar_proc_list_t list;
    VALUE RETVAL;
    VALUE vptql;

    rb_scan_args(argc, argv, "01", &vptql);
    if (NIL_P(vptql)) {
        status = sigar_proc_list_get(sigar, &list);

        if (status != SIGAR_OK) {
            RB_SIGAR_CROAK;
        }
    }
    else {
        sigar_ptql_query_t *query;
        sigar_ptql_error_t error;
        char *ptql = StringValuePtr(vptql);

        status = sigar_ptql_query_create(&query, ptql, &error);

        if (status != SIGAR_OK) {
            RB_SIGAR_RAISE(error.message);
        }
        sigar_ptql_re_impl_set(sigar, NULL, rbsigar_ptql_re_impl);
        status = sigar_ptql_query_find(sigar, query, &list);
        sigar_ptql_re_impl_set(sigar, NULL, NULL);
        sigar_ptql_query_destroy(query);
        if (status != SIGAR_OK) {
            RB_SIGAR_RAISE(sigar_strerror(sigar, status));
        }
    }

    RETVAL = rb_sigar_new_intlist(&list.data[0],
                                  list.number);

    sigar_proc_list_destroy(sigar, &list);

    return RETVAL;
}