Changeset View
Changeset View
Standalone View
Standalone View
cddl/contrib/opensolaris/lib/libdtrace/common/dt_handle.c
| Show All 30 Lines | |||||
| #include <errno.h> | #include <errno.h> | ||||
| #include <unistd.h> | #include <unistd.h> | ||||
| #include <assert.h> | #include <assert.h> | ||||
| #ifdef illumos | #ifdef illumos | ||||
| #include <alloca.h> | #include <alloca.h> | ||||
| #endif | #endif | ||||
| #include <dt_impl.h> | #include <dt_impl.h> | ||||
| #include <dt_oformat.h> | |||||
| #include <dt_program.h> | #include <dt_program.h> | ||||
| static const char _dt_errprog[] = | static const char _dt_errprog[] = | ||||
| "dtrace:::ERROR" | "dtrace:::ERROR" | ||||
| "{" | "{" | ||||
| " trace(arg1);" | " trace(arg1);" | ||||
| " trace(arg2);" | " trace(arg2);" | ||||
| " trace(arg3);" | " trace(arg3);" | ||||
| ▲ Show 20 Lines • Show All 263 Lines • ▼ Show 20 Lines | |||||
| int | int | ||||
| dt_handle_cpudrop(dtrace_hdl_t *dtp, processorid_t cpu, | dt_handle_cpudrop(dtrace_hdl_t *dtp, processorid_t cpu, | ||||
| dtrace_dropkind_t what, uint64_t howmany) | dtrace_dropkind_t what, uint64_t howmany) | ||||
| { | { | ||||
| dtrace_dropdata_t drop; | dtrace_dropdata_t drop; | ||||
| char str[80], *s; | char str[80], *s; | ||||
| int size; | int size; | ||||
| struct timeval tv; | |||||
| assert(what == DTRACEDROP_PRINCIPAL || what == DTRACEDROP_AGGREGATION); | assert(what == DTRACEDROP_PRINCIPAL || what == DTRACEDROP_AGGREGATION); | ||||
| bzero(&drop, sizeof (drop)); | bzero(&drop, sizeof (drop)); | ||||
| drop.dtdda_handle = dtp; | drop.dtdda_handle = dtp; | ||||
| drop.dtdda_cpu = cpu; | drop.dtdda_cpu = cpu; | ||||
| drop.dtdda_kind = what; | drop.dtdda_kind = what; | ||||
| drop.dtdda_drops = howmany; | drop.dtdda_drops = howmany; | ||||
| drop.dtdda_msg = str; | drop.dtdda_msg = str; | ||||
| if (dtp->dt_droptags) { | if (dtp->dt_droptags) { | ||||
| (void) snprintf(str, sizeof (str), "[%s] ", dt_droptag(what)); | (void) snprintf(str, sizeof (str), "[%s] ", dt_droptag(what)); | ||||
| s = &str[strlen(str)]; | s = &str[strlen(str)]; | ||||
| size = sizeof (str) - (s - str); | size = sizeof (str) - (s - str); | ||||
| } else { | } else { | ||||
| s = str; | s = str; | ||||
| size = sizeof (str); | size = sizeof (str); | ||||
| } | } | ||||
| (void) snprintf(s, size, "%llu %sdrop%s on CPU %d\n", | (void) snprintf(s, size, "%llu %sdrop%s on CPU %d\n", | ||||
| (u_longlong_t)howmany, | (u_longlong_t)howmany, | ||||
| what == DTRACEDROP_PRINCIPAL ? "" : "aggregation ", | what == DTRACEDROP_PRINCIPAL ? "" : "aggregation ", | ||||
| howmany > 1 ? "s" : "", cpu); | howmany > 1 ? "s" : "", cpu); | ||||
| if (dtp->dt_oformat) { | |||||
| (void) gettimeofday(&tv, NULL); | |||||
| xo_emit("{:timestamp/%ld.%06ld} {:count/%ju} " | |||||
| "{:total/%ju} {:kind/%d} {:msg/%s}", | |||||
| tv.tv_sec, tv.tv_usec, (uintmax_t)drop.dtdda_drops, | |||||
| (uintmax_t)drop.dtdda_total, drop.dtdda_kind, | |||||
| drop.dtdda_msg); | |||||
| } | |||||
| if (dtp->dt_drophdlr == NULL) | if (dtp->dt_drophdlr == NULL) | ||||
| return (dt_set_errno(dtp, EDT_DROPABORT)); | return (dt_set_errno(dtp, EDT_DROPABORT)); | ||||
| if ((*dtp->dt_drophdlr)(&drop, dtp->dt_droparg) == DTRACE_HANDLE_ABORT) | if ((*dtp->dt_drophdlr)(&drop, dtp->dt_droparg) == DTRACE_HANDLE_ABORT) | ||||
| return (dt_set_errno(dtp, EDT_DROPABORT)); | return (dt_set_errno(dtp, EDT_DROPABORT)); | ||||
| return (0); | return (0); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | |||||
| int | int | ||||
| dt_handle_status(dtrace_hdl_t *dtp, dtrace_status_t *old, dtrace_status_t *new) | dt_handle_status(dtrace_hdl_t *dtp, dtrace_status_t *old, dtrace_status_t *new) | ||||
| { | { | ||||
| dtrace_dropdata_t drop; | dtrace_dropdata_t drop; | ||||
| char str[80], *s; | char str[80], *s; | ||||
| uintptr_t base = (uintptr_t)new, obase = (uintptr_t)old; | uintptr_t base = (uintptr_t)new, obase = (uintptr_t)old; | ||||
| int i, size; | int i, size; | ||||
| struct timeval tv; | |||||
| bzero(&drop, sizeof (drop)); | bzero(&drop, sizeof (drop)); | ||||
| drop.dtdda_handle = dtp; | drop.dtdda_handle = dtp; | ||||
| drop.dtdda_cpu = DTRACE_CPUALL; | drop.dtdda_cpu = DTRACE_CPUALL; | ||||
| drop.dtdda_msg = str; | drop.dtdda_msg = str; | ||||
| /* | /* | ||||
| * First, check to see if we've been killed -- in which case we abort. | * First, check to see if we've been killed -- in which case we abort. | ||||
| */ | */ | ||||
| if (new->dtst_killed && !old->dtst_killed) | if (new->dtst_killed && !old->dtst_killed) | ||||
| return (dt_set_errno(dtp, EDT_BRICKED)); | return (dt_set_errno(dtp, EDT_BRICKED)); | ||||
| (void) gettimeofday(&tv, NULL); | |||||
markj: In general libdtrace doesn't report errors this way. I don't think you really need to check for… | |||||
| for (i = 0; _dt_droptab[i].dtdrt_str != NULL; i++) { | for (i = 0; _dt_droptab[i].dtdrt_str != NULL; i++) { | ||||
| uintptr_t naddr = base + _dt_droptab[i].dtdrt_offset; | uintptr_t naddr = base + _dt_droptab[i].dtdrt_offset; | ||||
| uintptr_t oaddr = obase + _dt_droptab[i].dtdrt_offset; | uintptr_t oaddr = obase + _dt_droptab[i].dtdrt_offset; | ||||
| uint64_t nval = *((uint64_t *)naddr); | uint64_t nval = *((uint64_t *)naddr); | ||||
| uint64_t oval = *((uint64_t *)oaddr); | uint64_t oval = *((uint64_t *)oaddr); | ||||
| if (nval == oval) | if (nval == oval) | ||||
| Show All 14 Lines | (void) snprintf(s, size, "%llu %s%s%s\n", | ||||
| _dt_droptab[i].dtdrt_str, (nval - oval > 1) ? "s" : "", | _dt_droptab[i].dtdrt_str, (nval - oval > 1) ? "s" : "", | ||||
| _dt_droptab[i].dtdrt_msg != NULL ? | _dt_droptab[i].dtdrt_msg != NULL ? | ||||
| _dt_droptab[i].dtdrt_msg : ""); | _dt_droptab[i].dtdrt_msg : ""); | ||||
| drop.dtdda_kind = _dt_droptab[i].dtdrt_kind; | drop.dtdda_kind = _dt_droptab[i].dtdrt_kind; | ||||
| drop.dtdda_total = nval; | drop.dtdda_total = nval; | ||||
| drop.dtdda_drops = nval - oval; | drop.dtdda_drops = nval - oval; | ||||
| if (dtp->dt_drophdlr == NULL) | if (dtp->dt_oformat) { | ||||
| xo_open_instance("probes"); | |||||
| dt_oformat_drop(dtp, DTRACE_CPUALL); | |||||
| xo_emit("{:timestamp/%ld.%06ld} {:count/%ju} " | |||||
| "{:total/%ju} {:kind/%d} {:msg/%s}", | |||||
| tv.tv_sec, tv.tv_usec, (uintmax_t)drop.dtdda_drops, | |||||
| (uintmax_t)drop.dtdda_total, drop.dtdda_kind, | |||||
| drop.dtdda_msg); | |||||
| } | |||||
| if (dtp->dt_drophdlr == NULL) { | |||||
| if (dtp->dt_oformat) | |||||
| xo_close_instance("probes"); | |||||
| return (dt_set_errno(dtp, EDT_DROPABORT)); | return (dt_set_errno(dtp, EDT_DROPABORT)); | ||||
| } | |||||
| if ((*dtp->dt_drophdlr)(&drop, | if ((*dtp->dt_drophdlr)(&drop, | ||||
| dtp->dt_droparg) == DTRACE_HANDLE_ABORT) | dtp->dt_droparg) == DTRACE_HANDLE_ABORT) { | ||||
| if (dtp->dt_oformat) | |||||
| xo_close_instance("probes"); | |||||
| return (dt_set_errno(dtp, EDT_DROPABORT)); | return (dt_set_errno(dtp, EDT_DROPABORT)); | ||||
| } | |||||
| if (dtp->dt_oformat) | |||||
| xo_close_instance("probes"); | |||||
| } | } | ||||
| return (0); | return (0); | ||||
| } | } | ||||
| int | int | ||||
| dt_handle_setopt(dtrace_hdl_t *dtp, dtrace_setoptdata_t *data) | dt_handle_setopt(dtrace_hdl_t *dtp, dtrace_setoptdata_t *data) | ||||
| { | { | ||||
| Show All 31 Lines | |||||
In general libdtrace doesn't report errors this way. I don't think you really need to check for errors at all.