@@ -97,13 +97,27 @@ struct traceeval_data {
(data).member = (val); \
} while (0)
-#define TRACEEVAL_SET_NUMBER(data, val) __TRACEEVAL_SET(data, NUMBER, number, val)
-#define TRACEEVAL_SET_NUMBER_8(data, val) __TRACEEVAL_SET(data, NUMBER_8, number_8, val)
-#define TRACEEVAL_SET_NUMBER_16(data, val) __TRACEEVAL_SET(data, NUMBER_16, number_16, val)
-#define TRACEEVAL_SET_NUMBER_32(data, val) __TRACEEVAL_SET(data, NUMBER_32, number_32, val)
-#define TRACEEVAL_SET_NUMBER_64(data, val) __TRACEEVAL_SET(data, NUMBER_64, number_64, val)
-#define TRACEEVAL_SET_STRING(data, val) __TRACEEVAL_SET(data, STRING, string, val)
-#define TRACEEVAL_SET_CSTRING(data, val) __TRACEEVAL_SET(data, STRING, cstring, val)
+/* Have strings and pointers fail to be set to numbers */
+#define __TRACEEVAL_SET_NUM(data, data_type, member, val) \
+ do { \
+ char *__test__[val] __attribute__((unused)); \
+ __TRACEEVAL_SET(data, data_type, member, val); \
+ } while (0)
+
+/* Have numbers fail to be assigned as strings */
+#define __TRACEEVAL_SET_STR(data, data_type, member, val) \
+ do { \
+ char __test__ __attribute__((unused)) = (val)[0]; \
+ __TRACEEVAL_SET(data, data_type, member, val); \
+ } while (0)
+
+#define TRACEEVAL_SET_NUMBER(data, val) __TRACEEVAL_SET_NUM(data, NUMBER, number, val)
+#define TRACEEVAL_SET_NUMBER_8(data, val) __TRACEEVAL_SET_NUM(data, NUMBER_8, number_8, val)
+#define TRACEEVAL_SET_NUMBER_16(data, val) __TRACEEVAL_SET_NUM(data, NUMBER_16, number_16, val)
+#define TRACEEVAL_SET_NUMBER_32(data, val) __TRACEEVAL_SET_NUM(data, NUMBER_32, number_32, val)
+#define TRACEEVAL_SET_NUMBER_64(data, val) __TRACEEVAL_SET_NUM(data, NUMBER_64, number_64, val)
+#define TRACEEVAL_SET_STRING(data, val) __TRACEEVAL_SET_STR(data, STRING, string, val)
+#define TRACEEVAL_SET_CSTRING(data, val) __TRACEEVAL_SET_STR(data, STRING, cstring, val)
#define TRACEEVAL_SET_POINTER(data, val) __TRACEEVAL_SET(data, POINTER, pointer, val)
struct traceeval_type;
@@ -84,6 +84,7 @@ static int sched_callback(struct tracecmd_input *handle, struct tep_event *event
struct traceeval_data keys[2];
struct traceeval_data vals[2];
const struct traceeval_data *results;
+ const char *comm;
if (!next_pid_field) {
next_pid_field = tep_find_field(event, "next_pid");
@@ -101,7 +102,8 @@ static int sched_callback(struct tracecmd_input *handle, struct tep_event *event
delta = record->ts - results[0].number_64;
traceeval_results_release(data->teval_wakeup, results);
- TRACEEVAL_SET_CSTRING(keys[0], record->data + next_comm_field->offset);
+ comm = (char *)record->data + next_comm_field->offset;
+ TRACEEVAL_SET_CSTRING(keys[0],comm);
TRACEEVAL_SET_NUMBER(keys[1], pid);
TRACEEVAL_SET_NUMBER_64(vals[0], record->ts);