[DTrace-devel] [PATCH 42/61] Fix dtrace_aggregate_clear() for min() and max()

eugene.loh at oracle.com eugene.loh at oracle.com
Fri Jul 8 14:45:26 UTC 2022


From: Eugene Loh <eugene.loh at oracle.com>

NB:  This function is apparently unused in both legacy DTrace as well
as the port to BPF, but we will be able to make use of it in up-coming
patches.

Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
---
 libdtrace/dt_aggregate.c | 26 ++++++++++++++++++++------
 1 file changed, 20 insertions(+), 6 deletions(-)

diff --git a/libdtrace/dt_aggregate.c b/libdtrace/dt_aggregate.c
index f2501ad4..84b79207 100644
--- a/libdtrace/dt_aggregate.c
+++ b/libdtrace/dt_aggregate.c
@@ -1800,13 +1800,27 @@ dtrace_aggregate_clear(dtrace_hdl_t *dtp)
 		rec = &aggdesc->dtagd_recs[aggdesc->dtagd_nrecs - 1];
 		data = &h->dtahe_data;
 
-		memset(&data->dtada_data[rec->dtrd_offset], 0, rec->dtrd_size);
-
-		if (data->dtada_percpu == NULL)
-			continue;
+		switch (rec->dtrd_action) {
+		case DT_AGG_MIN:
+			*((uint64_t*)(&data->dtada_data[rec->dtrd_offset])) = INT64_MAX;
+			if (data->dtada_percpu)
+				for (i = 0; i < max_cpus; i++)
+					*((uint64_t*)data->dtada_percpu[i]) = INT64_MAX;
+			break;
+		case DT_AGG_MAX:
+			*((uint64_t*)(&data->dtada_data[rec->dtrd_offset])) = INT64_MIN;
+			if (data->dtada_percpu)
+				for (i = 0; i < max_cpus; i++)
+					*((uint64_t*)data->dtada_percpu[i]) = INT64_MIN;
+			break;
+		default:
+			memset(&data->dtada_data[rec->dtrd_offset], 0, rec->dtrd_size);
+			if (data->dtada_percpu)
+				for (i = 0; i < max_cpus; i++)
+					memset(data->dtada_percpu[i], 0, rec->dtrd_size);
+			break;
+		}
 
-		for (i = 0; i < max_cpus; i++)
-			memset(data->dtada_percpu[i], 0, rec->dtrd_size);
 	}
 }
 
-- 
2.18.4




More information about the DTrace-devel mailing list