diff options
author | Nicholas Marriott <nicholas.marriott@gmail.com> | 2009-02-13 00:43:04 +0000 |
---|---|---|
committer | Nicholas Marriott <nicholas.marriott@gmail.com> | 2009-02-13 00:43:04 +0000 |
commit | cce03e138b6363036d9b6c3c96925b3a372e421b (patch) | |
tree | 0a35dd6ae5cc69dc77423576d203f9b24a59b147 /osdep-openbsd.c | |
parent | b1e911aff02d8381018fca067e7783c6a72da593 (diff) | |
download | rtmux-cce03e138b6363036d9b6c3c96925b3a372e421b.tar.gz rtmux-cce03e138b6363036d9b6c3c96925b3a372e421b.tar.bz2 rtmux-cce03e138b6363036d9b6c3c96925b3a372e421b.zip |
Looking up argv[0] is expensive, so just use p_comm for the window name which is good enough. Also increase name update time to 500 ms.
Diffstat (limited to 'osdep-openbsd.c')
-rw-r--r-- | osdep-openbsd.c | 74 |
1 files changed, 14 insertions, 60 deletions
diff --git a/osdep-openbsd.c b/osdep-openbsd.c index 2321f5e8..5e06d671 100644 --- a/osdep-openbsd.c +++ b/osdep-openbsd.c @@ -1,4 +1,4 @@ -/* $Id: osdep-openbsd.c,v 1.12 2009-02-09 18:08:01 nicm Exp $ */ +/* $Id: osdep-openbsd.c,v 1.13 2009-02-13 00:43:04 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> @@ -35,11 +35,10 @@ #define is_stopped(p) \ ((p)->p_stat == SSTOP || (p)->p_stat == SZOMB || (p)->p_stat == SDEAD) -int osdep_get_name(int, char *, pid_t *, char **); -char *osdep_get_argv0(pid_t); +char *osdep_get_name(int, char *); -int -osdep_get_name(int fd, char *tty, pid_t *last_pid, char **name) +char * +osdep_get_name(int fd, char *tty) { int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PGRP, 0 }; struct stat sb; @@ -47,24 +46,23 @@ osdep_get_name(int fd, char *tty, pid_t *last_pid, char **name) struct kinfo_proc *buf, *newbuf; struct proc *p, *bestp; u_int i; - - *name = NULL; + char *name; buf = NULL; if (stat(tty, &sb) == -1) - return (-1); + return (NULL); if ((mib[3] = tcgetpgrp(fd)) == -1) - return (-1); + return (NULL); retry: if (sysctl(mib, nitems(mib), NULL, &len, NULL, 0) == -1) - return (-1); + return (NULL); len = (len * 5) / 4; if ((newbuf = realloc(buf, len)) == NULL) { free(buf); - return (-1); + return (NULL); } buf = newbuf; @@ -72,7 +70,7 @@ retry: if (errno == ENOMEM) goto retry; free(buf); - return (-1); + return (NULL); } bestp = NULL; @@ -126,56 +124,12 @@ retry: bestp = p; } - if (bestp == NULL) { - free(buf); - return (-1); - } + name = NULL; + if (bestp != NULL) + name = strdup(bestp->p_comm); - if (bestp->p_pid == *last_pid) { - free(buf); - return (1); - } - *last_pid = bestp->p_pid; - - *name = osdep_get_argv0(bestp->p_pid); - if (*name == NULL || **name == '\0') { - free(*name); - *name = strdup(bestp->p_comm); - } free(buf); - return (0); -} - -char * -osdep_get_argv0(pid_t pid) -{ - int mib[4] = { CTL_KERN, KERN_PROC_ARGS, 0, KERN_PROC_ARGV }; - size_t size; - char **args, **args2, *procname; - - procname = NULL; - - mib[2] = pid; - - args = NULL; - size = 128; - while (size < SIZE_MAX / 2) { - size *= 2; - if ((args2 = realloc(args, size)) == NULL) - break; - args = args2; - if (sysctl(mib, 4, args, &size, NULL, 0) == -1) { - if (errno == ENOMEM) - continue; - break; - } - if (*args != NULL) - procname = strdup(*args); - break; - } - free(args); - - return (procname); + return (name); } #endif |