static void exacct_do_commit_proc(ac_info_t *ac_proc, proc_t *p, int wstat) { size_t size; proc_usage_t *pu; ulong_t mask[AC_MASK_SZ]; mutex_enter(&ac_proc->ac_lock); if (ac_proc->ac_state == AC_ON) { bt_copy(&ac_proc->ac_mask[0], mask, AC_MASK_SZ); mutex_exit(&ac_proc->ac_lock); } else { mutex_exit(&ac_proc->ac_lock); return; } mutex_enter(&p->p_lock); size = strlen(p->p_user.u_comm) + 1; mutex_exit(&p->p_lock); pu = kmem_alloc(sizeof (proc_usage_t), KM_SLEEP); pu->pu_command = kmem_alloc(size, KM_SLEEP); mutex_enter(&p->p_lock); exacct_calculate_proc_usage(p, pu, mask, EW_FINAL, wstat); mutex_exit(&p->p_lock); (void) exacct_assemble_proc_usage(ac_proc, pu, exacct_commit_callback, NULL, 0, &size, EW_FINAL); kmem_free(pu->pu_command, strlen(pu->pu_command) + 1); kmem_free(pu, sizeof (proc_usage_t)); }
static int getacct_proc(ac_info_t *ac_proc, pid_t pid, void *buf, size_t bufsize, size_t *sizep) { proc_t *p; proc_usage_t *pu; ulong_t mask[AC_MASK_SZ]; ulong_t *ac_mask = &mask[0]; int error; mutex_enter(&ac_proc->ac_lock); if (ac_proc->ac_state == AC_OFF) { mutex_exit(&ac_proc->ac_lock); return (ENOTACTIVE); } bt_copy(&ac_proc->ac_mask[0], ac_mask, AC_MASK_SZ); mutex_exit(&ac_proc->ac_lock); pu = kmem_zalloc(sizeof (proc_usage_t), KM_SLEEP); pu->pu_command = kmem_zalloc(MAXCOMLEN + 1, KM_SLEEP); mutex_enter(&pidlock); if ((p = prfind(pid)) == NULL) { mutex_exit(&pidlock); kmem_free(pu->pu_command, MAXCOMLEN + 1); kmem_free(pu, sizeof (proc_usage_t)); return (ESRCH); } mutex_enter(&p->p_lock); mutex_exit(&pidlock); exacct_calculate_proc_usage(p, pu, ac_mask, EW_PARTIAL, 0); mutex_exit(&p->p_lock); error = exacct_assemble_proc_usage(ac_proc, pu, getacct_callback, buf, bufsize, sizep, EW_PARTIAL); kmem_free(pu->pu_command, MAXCOMLEN + 1); kmem_free(pu, sizeof (proc_usage_t)); return (error); }