add native single process finder
This commit is contained in:
parent
697412d938
commit
a1a9f3f494
|
@ -1163,6 +1163,16 @@ static int jsigar_ptql_re_impl(void *data,
|
||||||
JENV->NewStringUTF(env, needle));
|
JENV->NewStringUTF(env, needle));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void re_impl_set(JNIEnv *env, sigar_t *sigar, jobject obj, jni_ptql_re_data_t *re)
|
||||||
|
{
|
||||||
|
re->env = env;
|
||||||
|
re->cls = NULL;
|
||||||
|
re->obj = obj;
|
||||||
|
re->id = NULL;
|
||||||
|
|
||||||
|
sigar_ptql_re_impl_set(sigar, re, jsigar_ptql_re_impl);
|
||||||
|
}
|
||||||
|
|
||||||
JNIEXPORT jboolean SIGAR_JNI(ptql_SigarProcessQuery_match)
|
JNIEXPORT jboolean SIGAR_JNI(ptql_SigarProcessQuery_match)
|
||||||
(JNIEnv *env, jobject obj, jobject sigar_obj, jlong pid)
|
(JNIEnv *env, jobject obj, jobject sigar_obj, jlong pid)
|
||||||
{
|
{
|
||||||
|
@ -1172,12 +1182,7 @@ JNIEXPORT jboolean SIGAR_JNI(ptql_SigarProcessQuery_match)
|
||||||
(sigar_ptql_query_t *)sigar_get_pointer(env, obj);
|
(sigar_ptql_query_t *)sigar_get_pointer(env, obj);
|
||||||
dSIGAR(JNI_FALSE);
|
dSIGAR(JNI_FALSE);
|
||||||
|
|
||||||
re.env = env;
|
re_impl_set(env, sigar, obj, &re);
|
||||||
re.cls = NULL;
|
|
||||||
re.obj = obj;
|
|
||||||
re.id = NULL;
|
|
||||||
|
|
||||||
sigar_ptql_re_impl_set(sigar, &re, jsigar_ptql_re_impl);
|
|
||||||
|
|
||||||
status = sigar_ptql_query_match(sigar, query, pid);
|
status = sigar_ptql_query_match(sigar, query, pid);
|
||||||
|
|
||||||
|
@ -1233,6 +1238,32 @@ JNIEXPORT void SIGAR_JNI(ptql_SigarProcessQuery_destroy)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jlong SIGAR_JNI(ptql_SigarProcessQuery_findProcess)
|
||||||
|
(JNIEnv *env, jobject obj, jobject sigar_obj)
|
||||||
|
{
|
||||||
|
sigar_pid_t pid;
|
||||||
|
int status;
|
||||||
|
jni_ptql_re_data_t re;
|
||||||
|
sigar_ptql_query_t *query =
|
||||||
|
(sigar_ptql_query_t *)sigar_get_pointer(env, obj);
|
||||||
|
dSIGAR(0);
|
||||||
|
|
||||||
|
re_impl_set(env, sigar, obj, &re);
|
||||||
|
|
||||||
|
status = sigar_ptql_query_find_process(sigar, query, &pid);
|
||||||
|
|
||||||
|
sigar_ptql_re_impl_set(sigar, NULL, NULL);
|
||||||
|
|
||||||
|
if (status < 0) {
|
||||||
|
sigar_throw_ptql_malformed(env, sigar->errbuf);
|
||||||
|
}
|
||||||
|
else if (status != SIGAR_OK) {
|
||||||
|
sigar_throw_error(env, jsigar, status);
|
||||||
|
}
|
||||||
|
|
||||||
|
return pid;
|
||||||
|
}
|
||||||
|
|
||||||
#include "sigar_getline.h"
|
#include "sigar_getline.h"
|
||||||
|
|
||||||
JNIEXPORT jboolean SIGAR_JNI(util_Getline_isatty)
|
JNIEXPORT jboolean SIGAR_JNI(util_Getline_isatty)
|
||||||
|
|
|
@ -51,10 +51,10 @@ public class ProcessFinder {
|
||||||
public long findSingleProcess(ProcessQuery query)
|
public long findSingleProcess(ProcessQuery query)
|
||||||
throws SigarException, SigarNotImplementedException,
|
throws SigarException, SigarNotImplementedException,
|
||||||
MalformedQueryException {
|
MalformedQueryException {
|
||||||
//XXX bring back in another form
|
|
||||||
//if (query instanceof PidQuery) {
|
if (query instanceof SigarProcessQuery) {
|
||||||
// return ((PidQuery)query).getPid();
|
return ((SigarProcessQuery)query).findProcess(this.proxy);
|
||||||
//}
|
}
|
||||||
|
|
||||||
int i, matches = 0;
|
int i, matches = 0;
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,7 @@ package org.hyperic.sigar.ptql;
|
||||||
|
|
||||||
import org.hyperic.sigar.Sigar;
|
import org.hyperic.sigar.Sigar;
|
||||||
import org.hyperic.sigar.SigarException;
|
import org.hyperic.sigar.SigarException;
|
||||||
|
import org.hyperic.sigar.SigarNotImplementedException;
|
||||||
import org.hyperic.sigar.SigarProxy;
|
import org.hyperic.sigar.SigarProxy;
|
||||||
import org.hyperic.sigar.SigarProxyCache;
|
import org.hyperic.sigar.SigarProxyCache;
|
||||||
|
|
||||||
|
@ -45,6 +46,15 @@ public class SigarProcessQuery implements ProcessQuery {
|
||||||
return match(SigarProxyCache.getSigar(sigar), pid);
|
return match(SigarProxyCache.getSigar(sigar), pid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public native long findProcess(Sigar sigar)
|
||||||
|
throws SigarException, SigarNotImplementedException, MalformedQueryException;
|
||||||
|
|
||||||
|
public long findProcess(SigarProxy sigar)
|
||||||
|
throws SigarException, SigarNotImplementedException, MalformedQueryException {
|
||||||
|
|
||||||
|
return findProcess(SigarProxyCache.getSigar(sigar));
|
||||||
|
}
|
||||||
|
|
||||||
static boolean re(String haystack, String needle) {
|
static boolean re(String haystack, String needle) {
|
||||||
if (haystack == null) {
|
if (haystack == null) {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -37,4 +37,8 @@ SIGAR_DECLARE(int) sigar_ptql_query_match(sigar_t *sigar,
|
||||||
|
|
||||||
SIGAR_DECLARE(int) sigar_ptql_query_destroy(sigar_ptql_query_t *query);
|
SIGAR_DECLARE(int) sigar_ptql_query_destroy(sigar_ptql_query_t *query);
|
||||||
|
|
||||||
|
SIGAR_DECLARE(int) sigar_ptql_query_find_process(sigar_t *sigar,
|
||||||
|
sigar_ptql_query_t *query,
|
||||||
|
sigar_pid_t *pid);
|
||||||
|
|
||||||
#endif /*SIGAR_PTQL_H*/
|
#endif /*SIGAR_PTQL_H*/
|
||||||
|
|
|
@ -1363,3 +1363,52 @@ SIGAR_DECLARE(int) sigar_ptql_query_match(sigar_t *sigar,
|
||||||
|
|
||||||
return SIGAR_OK;
|
return SIGAR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SIGAR_DECLARE(int) sigar_ptql_query_find_process(sigar_t *sigar,
|
||||||
|
sigar_ptql_query_t *query,
|
||||||
|
sigar_pid_t *pid)
|
||||||
|
{
|
||||||
|
sigar_proc_list_t pids;
|
||||||
|
int status = sigar_proc_list_get(sigar, &pids);
|
||||||
|
int i, matches=0;
|
||||||
|
|
||||||
|
if (status != SIGAR_OK) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i=0; i<pids.number; i++) {
|
||||||
|
int query_status =
|
||||||
|
sigar_ptql_query_match(sigar, query, pids.data[i]);
|
||||||
|
|
||||||
|
if (query_status == SIGAR_OK) {
|
||||||
|
*pid = pids.data[i];
|
||||||
|
matches++;
|
||||||
|
}
|
||||||
|
else if (query_status == SIGAR_ENOTIMPL) {
|
||||||
|
/* let caller know query is invalid. */
|
||||||
|
status = query_status;
|
||||||
|
break;
|
||||||
|
} /* else ok, e.g. permission denied */
|
||||||
|
}
|
||||||
|
|
||||||
|
sigar_proc_list_destroy(sigar, &pids);
|
||||||
|
|
||||||
|
if (status != SIGAR_OK) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (matches == 1) {
|
||||||
|
return SIGAR_OK;
|
||||||
|
}
|
||||||
|
else if (matches == 0) {
|
||||||
|
sigar_strerror_set(sigar,
|
||||||
|
"Query did not match any processes");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sigar_strerror_printf(sigar,
|
||||||
|
"Query matched multiple processes (%d)",
|
||||||
|
matches);
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue