DTracers,
I realize you''re only now getting access to builds of OpenSolaris with
the
new USDT methodology I posted about recently:
http://www.opensolaris.org/jive/thread.jspa?messageID=23815崇
But, we couldn''t rest on our laurels. As has been alluded to on this
forum,
build 38 will contain a further enhancement to USDT (building on that previous
addition) that allows for a new probe-like structure: a conditional that tells
you if tracing is enabled:
if (PROVIDER_PROBE_ENABLED()) {
PROVIDER_PROBE(args, ...);
}
This isn''t appropriate for all USDT uses -- USDT probes are basically
free
(''dtrace -G'' converts a call to a fake-o function to a nop
operation).
Basically free and not completely free because they incur not only the cost
of a nop (or 5) but also the cost of setting up the arguments to the probe
(as well as register pressure, I$ impact, etc). The
''is-enabled'' probes are
designed to be used in situations where setting up the arguments is
prohibitively expensive. The ''PROVIDER_PROBE_ENABLED()'' call
becomes a move
of zero into the return value register. The overhead is, therefore, is a
move, a compare, and a branch. When the probe is enabled, we stuff a one
into that register thus altering the flow of control.
Here are two specific cases where you might want to use the is-enabled probes:
If you''re using USDT probes to instrument function entry points for a
dynamic language it can often be _very_ expensive to invoke the introspection
mechanisms to identify the types and values of arguments to function entry.
This is an ideal place to use is-enabled probes.
Another is for using a USDT provider in lieu of debug printfs for a
''debug<pid>:::message'' probe (I''m particularly
fond of this):
void
dprintf(const char *fmt, ...)
{
va_list ap;
char *buf, c;
int n;
if (DEBUG_MESSAGE_ENABLED()) {
va_start(ap, fmt);
n = vsnprintf(NULL, 0, fmt, ap);
va_end(ap);
buf = malloc(n + 1);
va_start(ap, fmt);
n = vsprintf(buf, fmt, ap);
va_end(ap);
DEBUG_MESSAGE(buf);
free(buf);
}
}
This, of course, requires a provider definition like this:
provider debug {
probe message(char *);
};
If you run into any trouble using USDT or build something interesting let
us know!
Adam
--
Adam Leventhal, Solaris Kernel Development http://blogs.sun.com/ahl