trace: handle CTF keyword collision
Some of the keyword like align, event, "." and "->" etc will be used in CTF metadata syntax. This patch support for handling those keywords with DPDK events name. Signed-off-by: Sunil Kumar Kori <skori@marvell.com> Acked-by: David Marchand <david.marchand@redhat.com>
This commit is contained in:
parent
f1a099f5b1
commit
ffed0853e6
@ -215,12 +215,131 @@ meta_stream_emit(char **meta, int *offset)
|
|||||||
return meta_copy(meta, offset, str, rc);
|
return meta_copy(meta, offset, str, rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
string_fixed_replace(char *input, const char *search, const char *replace)
|
||||||
|
{
|
||||||
|
char *found;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
found = strstr(input, search);
|
||||||
|
if (found == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (strlen(found) != strlen(search))
|
||||||
|
return;
|
||||||
|
|
||||||
|
len = strlen(replace);
|
||||||
|
memcpy(found, replace, len);
|
||||||
|
found[len] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ctf_fixup_align(char *str)
|
||||||
|
{
|
||||||
|
string_fixed_replace(str, "align", "_align");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ctf_fixup_arrow_deref(char *str)
|
||||||
|
{
|
||||||
|
const char *replace = "_";
|
||||||
|
const char *search = "->";
|
||||||
|
char *found;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
found = strstr(str, search);
|
||||||
|
if (found == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
do {
|
||||||
|
memcpy(found, replace, strlen(replace));
|
||||||
|
len = strlen(found + 2);
|
||||||
|
memcpy(found + 1, found + 2, len);
|
||||||
|
found[len + 1] = '\0';
|
||||||
|
found = strstr(str, search);
|
||||||
|
} while (found != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ctf_fixup_dot_deref(char *str)
|
||||||
|
{
|
||||||
|
const char *replace = "_";
|
||||||
|
const char *search = ".";
|
||||||
|
char *found;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
found = strstr(str, search);
|
||||||
|
if (found == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
len = strlen(replace);
|
||||||
|
do {
|
||||||
|
memcpy(found, replace, len);
|
||||||
|
found = strstr(str, search);
|
||||||
|
} while (found != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ctf_fixup_event(char *str)
|
||||||
|
{
|
||||||
|
string_fixed_replace(str, "event", "_event");
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
ctf_fixup_keyword(char *str)
|
||||||
|
{
|
||||||
|
char dup_str[TRACE_CTF_FIELD_SIZE];
|
||||||
|
char input[TRACE_CTF_FIELD_SIZE];
|
||||||
|
const char *delim = ";";
|
||||||
|
char *from;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
if (str == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
len = strlen(str);
|
||||||
|
if (len >= TRACE_CTF_FIELD_SIZE) {
|
||||||
|
trace_err("ctf_field reached its maximum limit");
|
||||||
|
return -EMSGSIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create duplicate string */
|
||||||
|
strcpy(dup_str, str);
|
||||||
|
|
||||||
|
len = 0;
|
||||||
|
from = strtok(dup_str, delim);
|
||||||
|
while (from != NULL) {
|
||||||
|
strcpy(input, from);
|
||||||
|
ctf_fixup_align(input);
|
||||||
|
ctf_fixup_dot_deref(input);
|
||||||
|
ctf_fixup_arrow_deref(input);
|
||||||
|
ctf_fixup_event(input);
|
||||||
|
|
||||||
|
strcpy(&input[strlen(input)], delim);
|
||||||
|
if ((len + strlen(input)) >= TRACE_CTF_FIELD_SIZE) {
|
||||||
|
trace_err("ctf_field reached its maximum limit");
|
||||||
|
return -EMSGSIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
strcpy(str + len, input);
|
||||||
|
len += strlen(input);
|
||||||
|
from = strtok(NULL, delim);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
meta_event_emit(char **meta, int *offset, struct trace_point *tp)
|
meta_event_emit(char **meta, int *offset, struct trace_point *tp)
|
||||||
{
|
{
|
||||||
char *str = NULL;
|
char *str = NULL;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
/* Fixup ctf field string in case it using reserved ctf keywords */
|
||||||
|
rc = ctf_fixup_keyword(tp->ctf_field);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
rc = metadata_printf(&str,
|
rc = metadata_printf(&str,
|
||||||
"event {\n"
|
"event {\n"
|
||||||
" id = %d;\n"
|
" id = %d;\n"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user