* Get the maximum number of CPUs via a sysctl.

* Handle the different ioctl design.
* Support the freopen() changes.
* Use functions in FreeBSD's process library rather than the CDDL
  library that Solaris has which sits on top of their process file
  system and is therefore unsuitable for use on FreeBSD. The libproc
  API for FreeBSD is deliberately different to that on Solaris because
  Sun wouldn't release the libproc.h header under a BSD license.
This commit is contained in:
John Birrell 2008-04-26 04:33:15 +00:00
parent 51e031e870
commit b29602e4d8
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=178556

View File

@ -26,7 +26,9 @@
#pragma ident "%Z%%M% %I% %E% SMI"
#if defined(sun)
#include <sys/sysmacros.h>
#endif
#include <strings.h>
#include <unistd.h>
@ -36,7 +38,11 @@
#include <stdio.h>
#include <errno.h>
#include <ctype.h>
#if defined(sun)
#include <alloca.h>
#else
#include <sys/sysctl.h>
#endif
#include <assert.h>
#include <libgen.h>
#include <limits.h>
@ -467,10 +473,19 @@ dt_dprintf(const char *format, ...)
}
int
#if defined(sun)
dt_ioctl(dtrace_hdl_t *dtp, int val, void *arg)
#else
dt_ioctl(dtrace_hdl_t *dtp, u_long val, void *arg)
#endif
{
const dtrace_vector_t *v = dtp->dt_vector;
#if !defined(sun)
/* Avoid sign extension. */
val &= 0xffffffff;
#endif
if (v != NULL)
return (v->dtv_ioctl(dtp->dt_varg, val, arg));
@ -486,8 +501,18 @@ dt_status(dtrace_hdl_t *dtp, processorid_t cpu)
{
const dtrace_vector_t *v = dtp->dt_vector;
if (v == NULL)
if (v == NULL) {
#if defined(sun)
return (p_online(cpu, P_STATUS));
#else
int maxid = 0;
size_t len = sizeof(maxid);
if (sysctlbyname("kern.smp.maxid", &maxid, &len, NULL, 0) != 0)
return (cpu == 0 ? 1 : -1);
else
return (cpu <= maxid ? 1 : -1);
#endif
}
return (v->dtv_status(dtp->dt_varg, cpu));
}
@ -554,6 +579,16 @@ dt_printf(dtrace_hdl_t *dtp, FILE *fp, const char *format, ...)
va_list ap;
int n;
#if !defined(sun)
/*
* On FreeBSD, check if output is currently being re-directed
* to another file. If so, output to that file instead of the
* one the caller has specified.
*/
if (dtp->dt_freopen_fp != NULL)
fp = dtp->dt_freopen_fp;
#endif
va_start(ap, format);
if (dtp->dt_sprintf_buflen != 0) {
@ -644,6 +679,7 @@ dt_printf(dtrace_hdl_t *dtp, FILE *fp, const char *format, ...)
}
n = vfprintf(fp, format, ap);
fflush(fp);
va_end(ap);
if (n < 0) {
@ -693,6 +729,11 @@ dt_zalloc(dtrace_hdl_t *dtp, size_t size)
{
void *data;
if (size > 16 * 1024 * 1024) {
(void) dt_set_errno(dtp, EDT_NOMEM);
return (NULL);
}
if ((data = malloc(size)) == NULL)
(void) dt_set_errno(dtp, EDT_NOMEM);
else
@ -706,6 +747,11 @@ dt_alloc(dtrace_hdl_t *dtp, size_t size)
{
void *data;
if (size > 16 * 1024 * 1024) {
(void) dt_set_errno(dtp, EDT_NOMEM);
return (NULL);
}
if ((data = malloc(size)) == NULL)
(void) dt_set_errno(dtp, EDT_NOMEM);
@ -803,6 +849,7 @@ dt_popcb(const ulong_t *bp, ulong_t n)
return (popc + dt_popc(bp[maxw] & ((1UL << maxb) - 1)));
}
#if defined(sun)
struct _rwlock;
struct _lwp_mutex;
@ -819,12 +866,17 @@ dt_rw_write_held(pthread_rwlock_t *lock)
extern int _rw_write_held(struct _rwlock *);
return (_rw_write_held((struct _rwlock *)lock));
}
#endif
int
dt_mutex_held(pthread_mutex_t *lock)
{
#if defined(sun)
extern int _mutex_held(struct _lwp_mutex *);
return (_mutex_held((struct _lwp_mutex *)lock));
#else
return (1);
#endif
}
static int
@ -911,8 +963,13 @@ dtrace_uaddr2str(dtrace_hdl_t *dtp, pid_t pid,
dt_proc_lock(dtp, P);
#if defined(sun)
if (Plookup_by_addr(P, addr, name, sizeof (name), &sym) == 0) {
(void) Pobjname(P, addr, objname, sizeof (objname));
#else
if (proc_addr2sym(P, addr, name, sizeof (name), &sym) == 0) {
(void) proc_objname(P, addr, objname, sizeof (objname));
#endif
obj = dt_basename(objname);
@ -922,7 +979,11 @@ dtrace_uaddr2str(dtrace_hdl_t *dtp, pid_t pid,
} else {
(void) snprintf(c, sizeof (c), "%s`%s", obj, name);
}
} else if (Pobjname(P, addr, objname, sizeof (objname)) != NULL) {
#if defined(sun)
} else if (Pobjname(P, addr, objname, sizeof (objname)) != 0) {
#else
} else if (proc_objname(P, addr, objname, sizeof (objname)) != 0) {
#endif
(void) snprintf(c, sizeof (c), "%s`0x%llx",
dt_basename(objname), addr);
} else {