int proctrack_p_plugin_get_pids(uint64_t cont_id, pid_t **pids, int *npids) { int pidcnt, bufsize; pid_t *p; pidcnt = job_getpidcnt((jid_t)cont_id); if (pidcnt > 0) { /* * FIXME - The "+ 128" is a rough attempt to allow for * the fact that _job_getpidcnt() followed by _job_get_pidlist * is not atomic. */ bufsize = sizeof(pid_t) * (pidcnt + 128); p = (pid_t *)xmalloc(bufsize); pidcnt = job_getpidlist((jid_t)cont_id, p, bufsize); if (pidcnt == -1) { error("job_getpidlist() failed: %m"); *pids = NULL; *npids = 0; xfree(p); return SLURM_ERROR; } *pids = p; *npids = pidcnt; } else { *pids = NULL; *npids = 0; } return SLURM_SUCCESS; }
int proctrack_p_get_pids(uint64_t cont_id, pid_t **pids, int *npids) { int pidcnt, bufsize; pid_t *p; DEF_TIMERS; START_TIMER; pidcnt = job_getpidcnt((jid_t)cont_id); if (pidcnt > 0) { /* * FIXME - The "+ 128" is a rough attempt to allow for * the fact that _job_getpidcnt() followed by _job_get_pidlist * is not atomic. */ bufsize = sizeof(pid_t) * (pidcnt + 128); p = (pid_t *)xmalloc(bufsize); pidcnt = job_getpidlist((jid_t)cont_id, p, bufsize); if (pidcnt == -1) { int rc = SLURM_SUCCESS; /* There is a possiblity for a race condition where if the last task in the job exits between job_getpidcnt and job_getpidlist. That is ok, so just return SUCCESS; */ if (errno != ENODATA) { rc = SLURM_ERROR; error("job_getpidlist() failed: %m"); } *pids = NULL; *npids = 0; xfree(p); return rc; } *pids = p; *npids = pidcnt; } else { *pids = NULL; *npids = 0; } END_TIMER; if (debug_flags & DEBUG_FLAG_TIME_CRAY) INFO_LINE("call took: %s", TIME_STR); return SLURM_SUCCESS; }