From owner-svn-src-projects@FreeBSD.ORG Sat Aug 1 12:51:17 2009 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 17A7C1065672; Sat, 1 Aug 2009 12:51:17 +0000 (UTC) (envelope-from stas@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 051208FC0A; Sat, 1 Aug 2009 12:51:17 +0000 (UTC) (envelope-from stas@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n71CpGs9081406; Sat, 1 Aug 2009 12:51:16 GMT (envelope-from stas@svn.freebsd.org) Received: (from stas@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n71CpGRZ081401; Sat, 1 Aug 2009 12:51:16 GMT (envelope-from stas@svn.freebsd.org) Message-Id: <200908011251.n71CpGRZ081401@svn.freebsd.org> From: Stanislav Sedov Date: Sat, 1 Aug 2009 12:51:16 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r196015 - projects/libprocstat/usr.bin/fstat X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 01 Aug 2009 12:51:17 -0000 Author: stas Date: Sat Aug 1 12:51:16 2009 New Revision: 196015 URL: http://svn.freebsd.org/changeset/base/196015 Log: - Fix resource deallocation routines. Modified: projects/libprocstat/usr.bin/fstat/fstat.c projects/libprocstat/usr.bin/fstat/fuser.c projects/libprocstat/usr.bin/fstat/libprocstat.c projects/libprocstat/usr.bin/fstat/libprocstat.h Modified: projects/libprocstat/usr.bin/fstat/fstat.c ============================================================================== --- projects/libprocstat/usr.bin/fstat/fstat.c Sat Aug 1 12:50:07 2009 (r196014) +++ projects/libprocstat/usr.bin/fstat/fstat.c Sat Aug 1 12:51:16 2009 (r196015) @@ -71,8 +71,8 @@ int vflg; /* be verbose */ typedef struct devs { struct devs *next; - long fsid; - long ino; + uint32_t fsid; + uint64_t ino; const char *name; } DEVS; @@ -194,7 +194,6 @@ do_fstat(int argc, char **argv) continue; dofiles(procstat, &p[i]); } - free(p); procstat_freeprocs(procstat, p); procstat_close(procstat); return (0); @@ -452,7 +451,7 @@ print_vnode_info(struct procstat *procst else { strmode(vn.vn_mode, mode); } - (void)printf(" %6ld %10s", vn.vn_fileid, mode); + (void)printf(" %6lld %10s", vn.vn_fileid, mode); if (vn.vn_type == PS_FST_VTYPE_VBLK || vn.vn_type == PS_FST_VTYPE_VCHR) { if (nflg || !*vn.vn_devname) @@ -461,7 +460,7 @@ print_vnode_info(struct procstat *procst printf(" %6s", vn.vn_devname); } } else - printf(" %6lu", vn.vn_size); + printf(" %6llu", vn.vn_size); print_access_flags(fst->fs_fflags); } Modified: projects/libprocstat/usr.bin/fstat/fuser.c ============================================================================== --- projects/libprocstat/usr.bin/fstat/fuser.c Sat Aug 1 12:50:07 2009 (r196014) +++ projects/libprocstat/usr.bin/fstat/fuser.c Sat Aug 1 12:51:16 2009 (r196015) @@ -162,7 +162,7 @@ int do_fuser(int argc, char *argv[]) { struct consumer *consumer; - struct kinfo_proc *p; + struct kinfo_proc *p, *procs; struct procstat *procstat; struct reqfile *reqfiles; char *ep, *nlistf, *memf; @@ -242,13 +242,14 @@ do_fuser(int argc, char *argv[]) procstat = procstat_open(nlistf, memf); if (procstat == NULL) errx(1, "procstat_open()"); - p = procstat_getprocs(procstat, KERN_PROC_PROC, 0, &cnt); - if (p == NULL) + procs = procstat_getprocs(procstat, KERN_PROC_PROC, 0, &cnt); + if (procs == NULL) errx(1, "procstat_getprocs()"); /* * Walk through process table and look for matching files. */ + p = procs; while(cnt--) if (p->ki_stat != SZOMB) dofiles(procstat, p++, reqfiles, nfiles); @@ -271,7 +272,7 @@ do_fuser(int argc, char *argv[]) } (void)fprintf(stderr, "\n"); } - procstat_freeprocs(procstat, p); + procstat_freeprocs(procstat, procs); procstat_close(procstat); free(reqfiles); return (0); Modified: projects/libprocstat/usr.bin/fstat/libprocstat.c ============================================================================== --- projects/libprocstat/usr.bin/fstat/libprocstat.c Sat Aug 1 12:50:07 2009 (r196014) +++ projects/libprocstat/usr.bin/fstat/libprocstat.c Sat Aug 1 12:51:16 2009 (r196015) @@ -101,10 +101,10 @@ int statfs(const char *, struct stat #define PROCSTAT_SYSCTL 2 static char *getmnton(kvm_t *kd, struct mount *m); -static struct filestat_list *procstat_getfiles_kvm(kvm_t *kd, - struct kinfo_proc *kp, int mmapped); +static struct filestat_list *procstat_getfiles_kvm( + struct procstat *procstat, struct kinfo_proc *kp, int mmapped); static struct filestat_list *procstat_getfiles_sysctl( - struct kinfo_proc *kp, int mmapped); + struct procstat *procstat, struct kinfo_proc *kp, int mmapped); static int procstat_get_pipe_info_sysctl(struct filestat *fst, struct pipestat *pipe, char *errbuf); static int procstat_get_pipe_info_kvm(kvm_t *kd, struct filestat *fst, @@ -239,9 +239,9 @@ procstat_getfiles(struct procstat *procs { if (procstat->type == PROCSTAT_SYSCTL) - return (procstat_getfiles_sysctl(kp, mmapped)); + return (procstat_getfiles_sysctl(procstat, kp, mmapped)); else if (procstat->type == PROCSTAT_KVM) - return (procstat_getfiles_kvm(procstat->kd, kp, mmapped)); + return (procstat_getfiles_kvm(procstat, kp, mmapped)); else return (NULL); } @@ -251,13 +251,13 @@ procstat_freefiles(struct procstat *proc { struct filestat *fst, *tmp; - STAILQ_FOREACH_SAFE(fst, head, next, tmp) { - if (procstat->type == PROCSTAT_SYSCTL && - fst->fs_typedep != NULL) - free(fst->fs_typedep); + STAILQ_FOREACH_SAFE(fst, head, next, tmp) free(fst); - } free(head); + if (procstat->vmentries != NULL) + free (procstat->vmentries); + if (procstat->files != NULL) + free (procstat->files); } static struct filestat * @@ -314,26 +314,30 @@ getctty(kvm_t *kd, struct kinfo_proc *kp } static struct filestat_list * -procstat_getfiles_kvm(kvm_t *kd, struct kinfo_proc *kp, int mmapped) +procstat_getfiles_kvm(struct procstat *procstat, struct kinfo_proc *kp, int mmapped) { struct file file; struct filedesc filed; struct vm_map_entry vmentry; struct vm_object object; struct vmspace vmspace; - struct vnode *vp; vm_map_entry_t entryp; vm_map_t map; vm_object_t objp; + struct vnode *vp; struct file **ofiles; struct filestat *entry; struct filestat_list *head; + kvm_t *kd; void *data; int i, fflags; int prot, type; unsigned int nfiles; - assert(kd); + assert(procstat); + kd = procstat->kd; + if (kd == NULL) + return (NULL); if (kp->ki_fd == NULL) return (NULL); if (!kvm_read_all(kd, (unsigned long)kp->ki_fd, &filed, @@ -601,7 +605,7 @@ kinfo_uflags2fst(int fd) } static struct filestat_list * -procstat_getfiles_sysctl(struct kinfo_proc *kp, int mmapped) +procstat_getfiles_sysctl(struct procstat *procstat, struct kinfo_proc *kp, int mmapped) { struct kinfo_file *kif, *files; struct kinfo_vmentry *kve, *vmentries; @@ -619,6 +623,7 @@ procstat_getfiles_sysctl(struct kinfo_pr warn("kinfo_getfile()"); return (NULL); } + procstat->files = files; /* * Allocate list head. @@ -644,6 +649,7 @@ procstat_getfiles_sysctl(struct kinfo_pr } if (mmapped != 0) { vmentries = kinfo_getvmmap(kp->ki_pid, &cnt); + procstat->vmentries = vmentries; if (vmentries == NULL || cnt == 0) goto fail; for (i = 0; i < cnt; i++) { Modified: projects/libprocstat/usr.bin/fstat/libprocstat.h ============================================================================== --- projects/libprocstat/usr.bin/fstat/libprocstat.h Sat Aug 1 12:50:07 2009 (r196014) +++ projects/libprocstat/usr.bin/fstat/libprocstat.h Sat Aug 1 12:51:16 2009 (r196015) @@ -90,8 +90,10 @@ #define PS_FST_FFLAG_HASLOCK 0x4000 struct procstat { - int type; - kvm_t *kd; + int type; + kvm_t *kd; + void *vmentries; + void *files; }; struct filestat { int fs_type; /* Descriptor type. */