diff options
author | rpaulo <rpaulo@FreeBSD.org> | 2010-08-21 13:54:33 +0000 |
---|---|---|
committer | rpaulo <rpaulo@FreeBSD.org> | 2010-08-21 13:54:33 +0000 |
commit | a25bd1909597388c679b212fb8b6b48ddd491807 (patch) | |
tree | adf9ae3842b9569e11c85025f5123cb2f20efde7 /cddl | |
parent | 26d140a225ce9d9a3a4ef4765c2345be9c08e514 (diff) | |
download | FreeBSD-src-a25bd1909597388c679b212fb8b6b48ddd491807.zip FreeBSD-src-a25bd1909597388c679b212fb8b6b48ddd491807.tar.gz |
Port plockstat to FreeBSD. This will be connected to the build later.
Sponsored by: The FreeBSD Foundation
Diffstat (limited to 'cddl')
-rw-r--r-- | cddl/contrib/opensolaris/cmd/plockstat/plockstat.c | 47 | ||||
-rw-r--r-- | cddl/usr.sbin/plockstat/Makefile | 27 |
2 files changed, 63 insertions, 11 deletions
diff --git a/cddl/contrib/opensolaris/cmd/plockstat/plockstat.c b/cddl/contrib/opensolaris/cmd/plockstat/plockstat.c index 0dfd700..aa2c1f9 100644 --- a/cddl/contrib/opensolaris/cmd/plockstat/plockstat.c +++ b/cddl/contrib/opensolaris/cmd/plockstat/plockstat.c @@ -24,7 +24,9 @@ * Use is subject to license terms. */ +#if defined(sun) #pragma ident "%Z%%M% %I% %E% SMI" +#endif #include <assert.h> #include <dtrace.h> @@ -41,6 +43,7 @@ #include <sys/wait.h> #include <libgen.h> #include <libproc.h> +#include <libproc_compat.h> static char *g_pname; static dtrace_hdl_t *g_dtp; @@ -502,7 +505,12 @@ getsym(struct ps_prochandle *P, uintptr_t addr, char *buf, size_t size, { char name[256]; GElf_Sym sym; +#if defined(sun) prsyminfo_t info; +#else + prmap_t *map; + int info; /* XXX unused */ +#endif size_t len; if (P == NULL || Pxlookup_by_addr(P, addr, name, sizeof (name), @@ -510,6 +518,7 @@ getsym(struct ps_prochandle *P, uintptr_t addr, char *buf, size_t size, (void) snprintf(buf, size, "%#lx", addr); return (0); } +#if defined(sun) if (info.prs_object == NULL) info.prs_object = "<unknown>"; @@ -520,15 +529,19 @@ getsym(struct ps_prochandle *P, uintptr_t addr, char *buf, size_t size, } len = snprintf(buf, size, "%s`%s", info.prs_object, info.prs_name); +#else + map = proc_addr2map(P, addr); + len = snprintf(buf, size, "%s`%s", map->pr_mapname, name); +#endif buf += len; size -= len; if (sym.st_value != addr) len = snprintf(buf, size, "+%#lx", addr - sym.st_value); - if (nolocks && strcmp("libc.so.1", info.prs_object) == 0 && - (strstr("mutex", info.prs_name) == 0 || - strstr("rw", info.prs_name) == 0)) + if (nolocks && strcmp("libc.so.1", map->pr_mapname) == 0 && + (strstr("mutex", name) == 0 || + strstr("rw", name) == 0)) return (-1); return (0); @@ -655,8 +668,13 @@ process_aggregate(const dtrace_aggdata_t **aggsdata, int naggvars, void *arg) static void prochandler(struct ps_prochandle *P, const char *msg, void *arg) { +#if defined(sun) const psinfo_t *prp = Ppsinfo(P); int pid = Pstatus(P)->pr_pid; +#else + int pid = proc_getpid(P); + int wstat = proc_getwstat(P); +#endif char name[SIG2STR_MAX]; if (msg != NULL) { @@ -674,13 +692,13 @@ prochandler(struct ps_prochandle *P, const char *msg, void *arg) * When /proc provides a stable pr_wstat in the status file, * this code can be improved by examining this new pr_wstat. */ - if (prp != NULL && WIFSIGNALED(prp->pr_wstat)) { + if (WIFSIGNALED(wstat)) { notice("pid %d terminated by %s\n", pid, - proc_signame(WTERMSIG(prp->pr_wstat), + proc_signame(WTERMSIG(wstat), name, sizeof (name))); - } else if (prp != NULL && WEXITSTATUS(prp->pr_wstat) != 0) { + } else if (WEXITSTATUS(wstat) != 0) { notice("pid %d exited with status %d\n", - pid, WEXITSTATUS(prp->pr_wstat)); + pid, WEXITSTATUS(wstat)); } else { notice("pid %d has exited\n", pid); } @@ -755,7 +773,9 @@ intr(int signo) int main(int argc, char **argv) { +#if defined(sun) ucred_t *ucp; +#endif int err; int opt_C = 0, opt_H = 0, opt_p = 0, opt_v = 0; char c, *p, *end; @@ -764,7 +784,7 @@ main(int argc, char **argv) g_pname = basename(argv[0]); argv[0] = g_pname; /* rewrite argv[0] for getopt errors */ - +#if defined(sun) /* * Make sure we have the required dtrace_proc privilege. */ @@ -777,6 +797,7 @@ main(int argc, char **argv) ucred_free(ucp); } +#endif while ((c = getopt(argc, argv, PLOCKSTAT_OPTSTR)) != EOF) { switch (c) { @@ -907,7 +928,7 @@ main(int argc, char **argv) if (opt_H) { dprog_add(g_hold_init); - if (g_opt_s == NULL) + if (!g_opt_s) dprog_add(g_hold_times); else dprog_add(g_hold_histogram); @@ -915,7 +936,7 @@ main(int argc, char **argv) if (opt_C) { dprog_add(g_ctnd_init); - if (g_opt_s == NULL) + if (!g_opt_s) dprog_add(g_ctnd_times); else dprog_add(g_ctnd_histogram); @@ -941,7 +962,7 @@ main(int argc, char **argv) if ((g_pr = dtrace_proc_grab(g_dtp, (pid_t)pid, 0)) == NULL) dfatal(NULL); } else { - if ((g_pr = dtrace_proc_create(g_dtp, argv[0], argv)) == NULL) + if ((g_pr = dtrace_proc_create(g_dtp, argv[0], argv, NULL, NULL)) == NULL) dfatal(NULL); } @@ -966,7 +987,11 @@ main(int argc, char **argv) if (opt_v) (void) printf("%s: tracing enabled for pid %d\n", g_pname, +#if defined(sun) (int)Pstatus(g_pr)->pr_pid); +#else + (int)proc_getpid(g_pr)); +#endif do { if (!g_intr && !done) diff --git a/cddl/usr.sbin/plockstat/Makefile b/cddl/usr.sbin/plockstat/Makefile new file mode 100644 index 0000000..2068311 --- /dev/null +++ b/cddl/usr.sbin/plockstat/Makefile @@ -0,0 +1,27 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR}/../../../cddl/contrib/opensolaris/cmd/plockstat + +PROG= plockstat +NO_MAN= +SRCS= plockstat.c +BINDIR?= /usr/sbin + +WARNS?= 1 + +CFLAGS+= -I${.CURDIR}/../../../sys/cddl/compat/opensolaris \ + -I${.CURDIR}/../../../cddl/compat/opensolaris/include \ + -I${OPENSOLARIS_USR_DISTDIR}/head \ + -I${OPENSOLARIS_USR_DISTDIR}/lib/libdtrace/common \ + -I${OPENSOLARIS_USR_DISTDIR}/lib/libproc/common \ + -I${OPENSOLARIS_SYS_DISTDIR}/uts/common \ + -I${OPENSOLARIS_SYS_DISTDIR}/compat \ + -I${.CURDIR}/../../../cddl/lib/libdtrace \ + -I${.CURDIR}/../../../sys + +DPADD= ${LIBPTHREAD} ${LIBDTRACE} ${LIBY} ${LIBL} ${LIBPROC} ${LIBCTF}\ + ${LIBELF} ${LIBZ} ${LIBRT} ${LIBRTLD_DB} ${LIBUTIL} +LDADD= -lpthread -ldtrace -ly -ll -lproc -lctf -lelf -lz -lrt \ + -lrtld_db -lutil + +.include <bsd.prog.mk> |