strncpy((char *)data, ctx->comm, TS_COMM_LEN);
break;
case PROCESS_ATTR_PGID:
+ if (ctx->pgid < 0) {
+ char *stat_fields[PROCESS_STAT_FIELD_MAX];
+ char buffer[BUFF_MAX];
+ int ret;
+
+ ret = kernel_get_process_stat_fields(ctx->tgid, buffer,
+ BUFF_MAX, stat_fields);
+ if (ret < 0)
+ break;
+
+ ctx->pgid = atoi(stat_fields[PROCESS_STAT_FIELD_PGID]);
+ }
+
*((int *)data) = ctx->pgid;
break;
case PROCESS_ATTR_PPID:
const struct resource_control *ctrl,
const void *data)
{
- char buf[BUFF_MAX];
- char *stat_fields[PROCESS_STAT_FIELD_MAX];
struct process_context *ctx;
u_int64_t total_memory;
int ret;
ctx->prev_total_time = get_total_cpu_time();
/* update initial status */
- ret = kernel_get_process_taskstats(&ctx->curr, ctx->tgid, false);
- if (ret < 0)
- return ret;
-
- ret = kernel_get_process_stat_fields(ctx->tgid, buf, BUFF_MAX, stat_fields);
+ ret = kernel_get_thread_group_taskstats(&ctx->curr, ctx->tgid, true);
if (ret < 0)
return ret;
- /* save comm with removing parentheses */
- strncpy(ctx->comm, stat_fields[PROCESS_STAT_FIELD_COMM] + 1,
- strlen(stat_fields[PROCESS_STAT_FIELD_COMM]) - 2 /* '(', ')' */);
+ memcpy(ctx->comm, ctx->curr.ac_comm, strlen(ctx->curr.ac_comm) + 1);
- ctx->pgid = atoi(stat_fields[PROCESS_STAT_FIELD_PGID]);
- ctx->ppid = atoi(stat_fields[PROCESS_STAT_FIELD_PPID]);
+ ctx->pgid = -1;
+ ctx->ppid = ctx->curr.ac_ppid;
return 0;
}