[DTrace-devel] [PATCH 1/2] Replace dt_variable_read()
Eugene Loh
eugene.loh at oracle.com
Mon Sep 25 18:27:03 UTC 2023
Reviewed-by: Eugene Loh <eugene.loh at oracle.com>
few nits...
On 9/23/23 15:14, Kris Van Hees via DTrace-devel wrote:
> The dt_variable_read() function is only used in a few placed, all of
s/placed/places/
> them involving reading data from a data record. Callers adjust the
> base address using the record offset, and then pass in the data size
> from the record as well. The new dt_read_scalar() function takes a
> base address and a pointer to a record descriptor which is more in
> line with the nature of data record descriptors.
>
> Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
>
> diff --git a/libdtrace/dt_consume.c b/libdtrace/dt_consume.c
> @@ -506,6 +506,31 @@ dt_nullrec()
> return DTRACE_CONSUME_NEXT;
> }
>
> +int
> +dt_read_scalar(caddr_t addr, const dtrace_recdesc_t *rec, uint64_t *valp)
Make function "static"?
> +{
> + addr += rec->dtrd_offset;
> +
> + switch (rec->dtrd_size) {
> + case sizeof(uint64_t):
> + *valp = *((uint64_t *)addr);
> + break;
> + case sizeof(uint32_t):
> + *valp = *((uint32_t *)addr);
> + break;
> + case sizeof(uint16_t):
> + *valp = *((uint16_t *)addr);
> + break;
> + case sizeof(uint8_t):
> + *valp = *((uint8_t *)addr);
> + break;
> + default:
> + return -1;
> + }
> +
> + return 0;
> +}
> +
> int
> dt_print_quantline(dtrace_hdl_t *dtp, FILE *fp, int64_t val,
> uint64_t normal, long double total, char positives, char negatives)
> @@ -1017,7 +1042,6 @@ dt_print_tracemem(dtrace_hdl_t *dtp, FILE *fp, const dtrace_recdesc_t *rec,
> if (arg == DTRACE_TRACEMEM_DYNAMIC) {
> const dtrace_recdesc_t *drec;
> uint64_t darg;
> - caddr_t daddr;
> uint64_t dsize;
> int dpositive;
>
> @@ -1026,14 +1050,13 @@ dt_print_tracemem(dtrace_hdl_t *dtp, FILE *fp, const dtrace_recdesc_t *rec,
>
> drec = rec + 1;
> darg = drec->dtrd_arg;
> - daddr = buf + drec->dtrd_offset;
>
> if (drec->dtrd_action != DTRACEACT_TRACEMEM ||
> (darg != DTRACE_TRACEMEM_SIZE &&
> darg != DTRACE_TRACEMEM_SSIZE))
> return dt_set_errno(dtp, EDT_TRACEMEM);
>
> - if (dt_variable_read(daddr, drec->dtrd_size, &dsize) < 0)
> + if (dt_read_scalar(buf, drec, &dsize) < 0)
> return dt_set_errno(dtp, EDT_TRACEMEM);
>
> dpositive = drec->dtrd_arg == DTRACE_TRACEMEM_SIZE ||
> @@ -1407,16 +1430,14 @@ int
> dt_print_pcap(dtrace_hdl_t *dtp, FILE *fp, dtrace_recdesc_t *rec,
> const caddr_t buf)
> {
> - caddr_t paddr, addr;
> - const dtrace_recdesc_t *prec;
> + caddr_t addr;
> uint64_t time, proto, pktlen, maxlen;
> const char *filename;
>
> addr = (caddr_t)buf + rec->dtrd_offset;
>
> - if (dt_variable_read(addr, sizeof(uint64_t), &time) < 0 ||
> - dt_variable_read(addr + sizeof(uint64_t), sizeof(uint64_t),
> - &pktlen) < 0)
> + if (dt_read_scalar(buf, rec, &time) < 0 ||
> + dt_read_scalar(buf + sizeof(uint64_t), rec, &pktlen) < 0)
Add assert(rec->dtrd_size == sizeof(uint64_t))?
> return dt_set_errno(dtp, EDT_PCAP);
>
> if (pktlen == 0) {
> @@ -1427,11 +1448,7 @@ dt_print_pcap(dtrace_hdl_t *dtp, FILE *fp, dtrace_recdesc_t *rec,
> }
> maxlen = DT_PCAPSIZE(dtp->dt_options[DTRACEOPT_PCAPSIZE]);
>
> - prec = rec + 1;
> -
> - paddr = (caddr_t)buf + prec->dtrd_offset;
> -
> - if (dt_variable_read(paddr, prec->dtrd_size, &proto) < 0)
> + if (dt_read_scalar(buf, rec + 1, &proto) < 0)
> return dt_set_errno(dtp, EDT_PCAP);
More information about the DTrace-devel
mailing list