implement parent flag
This commit is contained in:
parent
cbaec00d98
commit
0bf91e99ad
|
@ -47,11 +47,14 @@ typedef enum {
|
||||||
PTQL_VALUE_TYPE_ANY
|
PTQL_VALUE_TYPE_ANY
|
||||||
} ptql_value_type_t;
|
} ptql_value_type_t;
|
||||||
|
|
||||||
|
#define PTQL_OP_FLAG_PARENT 1
|
||||||
|
|
||||||
struct ptql_parse_branch_t {
|
struct ptql_parse_branch_t {
|
||||||
char *name;
|
char *name;
|
||||||
char *attr;
|
char *attr;
|
||||||
char *op;
|
char *op;
|
||||||
char *value;
|
char *value;
|
||||||
|
unsigned int op_flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -71,6 +74,7 @@ struct ptql_branch_t {
|
||||||
void *data;
|
void *data;
|
||||||
unsigned int data_size;
|
unsigned int data_size;
|
||||||
unsigned int flags;
|
unsigned int flags;
|
||||||
|
unsigned int op_flags;
|
||||||
union {
|
union {
|
||||||
ptql_op_ui64_t ui64;
|
ptql_op_ui64_t ui64;
|
||||||
ptql_op_ui32_t ui32;
|
ptql_op_ui32_t ui32;
|
||||||
|
@ -722,6 +726,8 @@ static int ptql_branch_parse(char *query, ptql_parse_branch_t *branch)
|
||||||
return SIGAR_PTQL_MALFORMED_QUERY;
|
return SIGAR_PTQL_MALFORMED_QUERY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
branch->op_flags = 0;
|
||||||
|
|
||||||
*ptr = '\0';
|
*ptr = '\0';
|
||||||
branch->value = ++ptr;
|
branch->value = ++ptr;
|
||||||
|
|
||||||
|
@ -744,6 +750,20 @@ static int ptql_branch_parse(char *query, ptql_parse_branch_t *branch)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*query) {
|
if (*query) {
|
||||||
|
char flag;
|
||||||
|
|
||||||
|
while (isupper((flag = *query))) {
|
||||||
|
switch (flag) {
|
||||||
|
case 'P':
|
||||||
|
branch->op_flags |= PTQL_OP_FLAG_PARENT;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return SIGAR_PTQL_MALFORMED_QUERY;
|
||||||
|
}
|
||||||
|
|
||||||
|
++query;
|
||||||
|
}
|
||||||
|
|
||||||
branch->op = query;
|
branch->op = query;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -763,6 +783,7 @@ static int ptql_branch_add(ptql_parse_branch_t *parsed,
|
||||||
|
|
||||||
branch->data = NULL;
|
branch->data = NULL;
|
||||||
branch->data_size = 0;
|
branch->data_size = 0;
|
||||||
|
branch->op_flags = parsed->op_flags;
|
||||||
|
|
||||||
op = ptql_op_code_get(parsed->op);
|
op = ptql_op_code_get(parsed->op);
|
||||||
if (op == PTQL_OP_MAX) {
|
if (op == PTQL_OP_MAX) {
|
||||||
|
@ -916,15 +937,27 @@ SIGAR_DECLARE(int) sigar_ptql_query_destroy(sigar_t *sigar,
|
||||||
|
|
||||||
SIGAR_DECLARE(int) sigar_ptql_query_match(sigar_t *sigar,
|
SIGAR_DECLARE(int) sigar_ptql_query_match(sigar_t *sigar,
|
||||||
sigar_ptql_query_t *query,
|
sigar_ptql_query_t *query,
|
||||||
sigar_pid_t pid)
|
sigar_pid_t query_pid)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i=0; i<query->branches.number; i++) {
|
for (i=0; i<query->branches.number; i++) {
|
||||||
|
sigar_pid_t pid = query_pid;
|
||||||
int status, matched=0;
|
int status, matched=0;
|
||||||
ptql_branch_t *branch = &query->branches.data[i];
|
ptql_branch_t *branch = &query->branches.data[i];
|
||||||
ptql_lookup_t *lookup = branch->lookup;
|
ptql_lookup_t *lookup = branch->lookup;
|
||||||
|
|
||||||
|
if (branch->op_flags & PTQL_OP_FLAG_PARENT) {
|
||||||
|
sigar_proc_state_t state;
|
||||||
|
|
||||||
|
status = sigar_proc_state_get(sigar, pid, &state);
|
||||||
|
if (status != SIGAR_OK) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
pid = state.ppid;
|
||||||
|
}
|
||||||
|
|
||||||
if (lookup->type == PTQL_VALUE_TYPE_ANY) {
|
if (lookup->type == PTQL_VALUE_TYPE_ANY) {
|
||||||
/* Args, Env, etc. */
|
/* Args, Env, etc. */
|
||||||
status = lookup->get(sigar, pid, branch);
|
status = lookup->get(sigar, pid, branch);
|
||||||
|
|
Loading…
Reference in New Issue