fprintf(fd, "off_t");
break;
case STRING:
- fprintf(fd, "char *");
+ fprintf(fd, "const char *");
break;
case ENUM:
fprintf(fd, "enum lttng_%s", basename);
fprintf(fd, " %s", field_name);
break;
case STRING:
- fprintf(fd, "char *");
+ fprintf(fd, "const char *");
fprintf(fd, " %s", field_name);
break;
case ENUM:
* (possibly)). */
int print_type_alignment(type_descriptor_t * td, FILE *fd, unsigned int tabs,
- char *nest_name, char *field_name)
+ char *nest_name, char *field_name, char *obj_prefix)
{
char basename[PATH_MAX];
unsigned int basename_len = 0;
strncat(basename, field_name, PATH_MAX - basename_len);
}
- switch(td->type) {
- case INT_FIXED:
- case UINT_FIXED:
- case CHAR:
- case UCHAR:
- case SHORT:
- case USHORT:
- case INT:
- case UINT:
- case FLOAT:
- case POINTER:
- case LONG:
- case ULONG:
- case SIZE_T:
- case SSIZE_T:
- case OFF_T:
- case ENUM:
- fprintf(fd, "sizeof(");
- if(print_type(td, fd, 0, basename, "")) return 1;
- fprintf(fd, ")");
- break;
- case STRING:
- fprintf(fd, "sizeof(char)");
- break;
- case SEQUENCE:
- fprintf(fd, "lttng_get_alignment_sequence_%s(&obj->%s)", basename,
- field_name);
- break;
- case STRUCT:
- fprintf(fd, "lttng_get_alignment_struct_%s(&obj->%s)", basename,
- field_name);
- break;
- case UNION:
- fprintf(fd, "lttng_get_alignment_union_%s(&obj->%s)", basename,
- field_name);
- break;
- case ARRAY:
- fprintf(fd, "lttng_get_alignment_array_%s(obj->%s)", basename,
- field_name);
- break;
- case NONE:
- printf("error : type NONE unexpected\n");
- return 1;
- break;
+ if(field_name[0] == '\0') {
+ /* We are in a write function : it's the obj that we must align. */
+ switch(td->type) {
+ case SEQUENCE:
+ fprintf(fd, "lttng_get_alignment_sequence_%s(%s)", basename,
+ obj_prefix);
+ break;
+ case STRUCT:
+ fprintf(fd, "lttng_get_alignment_struct_%s(%s)", basename,
+ obj_prefix);
+ break;
+ case UNION:
+ fprintf(fd, "lttng_get_alignment_union_%s(%s)", basename,
+ obj_prefix);
+ break;
+ case ARRAY:
+ fprintf(fd, "lttng_get_alignment_array_%s(%s)", basename,
+ obj_prefix);
+ break;
+ default:
+ printf("error : type unexpected\n");
+ return 1;
+ break;
+ }
+ } else {
+
+ switch(td->type) {
+ case INT_FIXED:
+ case UINT_FIXED:
+ case CHAR:
+ case UCHAR:
+ case SHORT:
+ case USHORT:
+ case INT:
+ case UINT:
+ case FLOAT:
+ case POINTER:
+ case LONG:
+ case ULONG:
+ case SIZE_T:
+ case SSIZE_T:
+ case OFF_T:
+ case ENUM:
+ fprintf(fd, "sizeof(");
+ if(print_type(td, fd, 0, basename, "")) return 1;
+ fprintf(fd, ")");
+ break;
+ case STRING:
+ fprintf(fd, "sizeof(char)");
+ break;
+ case SEQUENCE:
+ fprintf(fd, "lttng_get_alignment_sequence_%s(&%s%s)", basename,
+ obj_prefix, field_name);
+ break;
+ case STRUCT:
+ fprintf(fd, "lttng_get_alignment_struct_%s(&%s%s)", basename,
+ obj_prefix, field_name);
+ break;
+ case UNION:
+ fprintf(fd, "lttng_get_alignment_union_%s(&%s%s)", basename,
+ obj_prefix, field_name);
+ break;
+ case ARRAY:
+ fprintf(fd, "lttng_get_alignment_array_%s(%s%s)", basename,
+ obj_prefix, field_name);
+ break;
+ case NONE:
+ printf("error : type NONE unexpected\n");
+ return 1;
+ break;
+ }
}
-
+
return 0;
}
* (possibly)). */
int print_type_write(type_descriptor_t * td, FILE *fd, unsigned int tabs,
- char *nest_name, char *field_name)
+ char *nest_name, char *field_name, char *obj_prefix)
{
char basename[PATH_MAX];
unsigned int basename_len = 0;
break;
case STRING:
print_tabs(tabs, fd);
- fprintf(fd, "lttng_write_string_%s(buffer, to_base, to, from, len, obj->%s);\n", basename, field_name);
+ fprintf(fd,
+ "lttng_write_string_%s(buffer, to_base, to, from, len, %s%s);\n",
+ basename, obj_prefix, field_name);
break;
case SEQUENCE:
print_tabs(tabs, fd);
- fprintf(fd, "lttng_write_%s(buffer, to_base, to, from, len, &obj->%s)", basename,
- field_name);
+ fprintf(fd,
+ "lttng_write_%s(buffer, to_base, to, from, len, &%s%s)",
+ basename, obj_prefix, field_name);
break;
case STRUCT:
print_tabs(tabs, fd);
- fprintf(fd, "lttng_write_struct_%s(buffer, to_base, to, from, len, &obj->%s)", basename,
- field_name);
+ fprintf(fd,
+ "lttng_write_struct_%s(buffer, to_base, to, from, len, &%s%s)",
+ basename, obj_prefix, field_name);
break;
case UNION:
print_tabs(tabs, fd);
- fprintf(fd, "lttng_write_union_%s(buffer, to_base, to, from, len, &obj->%s)", basename,
- field_name);
+ fprintf(fd,
+ "lttng_write_union_%s(buffer, to_base, to, from, len, &%s%s)",
+ basename, obj_prefix, field_name);
break;
case ARRAY:
print_tabs(tabs, fd);
- fprintf(fd, "lttng_write_array_%s(buffer, to_base, to, from, len, obj->%s)", basename,
- field_name);
+ fprintf(fd,
+ "lttng_write_array_%s(buffer, to_base, to, from, len, %s%s)",
+ basename, obj_prefix, field_name);
break;
case NONE:
printf("Error : type NONE unexpected\n");
print_tabs(1, fd);
fprintf(fd, "localign = ");
if(print_type_alignment(((field_t*)td->fields.array[0])->type,
- fd, 0, basename, ((field_t*)td->fields.array[0])->name)) return 1;
+ fd, 0, basename, "len", "obj->")) return 1;
fprintf(fd, ";\n");
print_tabs(1, fd);
fprintf(fd, "align = max(align, localign);\n");
print_tabs(1, fd);
fprintf(fd, "localign = ");
if(print_type_alignment(((field_t*)td->fields.array[1])->type,
- fd, 0, basename, ((field_t*)td->fields.array[1])->name)) return 1;
+ fd, 0, basename, "array[0]", "obj->")) return 1;
fprintf(fd, ";\n");
print_tabs(1, fd);
fprintf(fd, "align = max(align, localign);\n");
type_descriptor_t *type = field->type;
print_tabs(1, fd);
fprintf(fd, "localign = ");
- if(print_type_alignment(type, fd, 0, basename, field->name)) return 1;
+ if(print_type_alignment(type, fd, 0, basename, field->name, "obj->"))
+ return 1;
fprintf(fd, ";\n");
print_tabs(1, fd);
fprintf(fd, "align = max(align, localign);\n");
type_descriptor_t *type = field->type;
print_tabs(1, fd);
fprintf(fd, "localign = ");
- if(print_type_alignment(type, fd, 0, basename, field->name)) return 1;
+ if(print_type_alignment(type, fd, 0, basename, field->name, "obj->"))
+ return 1;
fprintf(fd, ";\n");
print_tabs(1, fd);
fprintf(fd, "align = max(align, localign);\n");
print_tabs(1, fd);
fprintf(fd, "return \n");
if(print_type_alignment(((field_t*)td->fields.array[0])->type,
- fd, 0, basename, ((field_t*)td->fields.array[0])->name)) return 1;
+ fd, 0, basename, "", "obj[0]"))
+ return 1;
fprintf(fd, ";\n");
break;
default:
print_tabs(1, fd);
fprintf(fd, "align = ");
- if(print_type_alignment(td, fd, 0, basename, field_name)) return 1;
+ if(print_type_alignment(td, fd, 0, basename, "", "obj->")) return 1;
fprintf(fd, ";\n");
fprintf(fd, "\n");
print_tabs(1, fd);
fprintf(fd, "/* Contains only fixed size fields : use compiler sizeof() */\n");
fprintf(fd, "\n");
print_tabs(1, fd);
- fprintf(fd, "*len += sizeof(");
+ fprintf(fd, "size = sizeof(");
if(print_type(td, fd, 0, basename, field_name)) return 1;
fprintf(fd, ");\n");
+ print_tabs(1, fd);
+ fprintf(fd, "*len += size;\n");
} else {
/* The type contains nested variable size subtypes :
* we must write field by field. */
case SEQUENCE:
print_tabs(1, fd);
fprintf(fd, "/* Copy members */\n");
- print_tabs(1, fd);
- fprintf(fd, "size = sizeof(\n");
+// print_tabs(1, fd);
+// fprintf(fd, "size = sizeof(\n");
if(print_type_write(((field_t*)td->fields.array[0])->type,
- fd, 1, basename, ((field_t*)td->fields.array[0])->name)) return 1;
- fprintf(fd, ");\n");
- print_tabs(1, fd);
- fprintf(fd, "*to += ltt_align(*to, size);\n");
+ fd, 1, basename, "len", "obj->")) return 1;
+ fprintf(fd, "\n");
+// fprintf(fd, ");\n");
+// print_tabs(1, fd);
+// fprintf(fd, "*to += ltt_align(*to, size);\n");
print_tabs(1, fd);
fprintf(fd, "if(buffer != NULL)\n");
print_tabs(2, fd);
/* Write the child : varlen child or not ? */
if(has_type_fixed_size(((field_t*)td->fields.array[1])->type)) {
/* Fixed size len child : use a multiplication of its size */
- print_tabs(1, fd);
- fprintf(fd, "size = sizeof(\n");
+// print_tabs(1, fd);
+// fprintf(fd, "size = sizeof(\n");
if(print_type_write(((field_t*)td->fields.array[1])->type,
- fd, 1, basename, ((field_t*)td->fields.array[1])->name)) return 1;
- fprintf(fd, ");\n");
- print_tabs(1, fd);
+ fd, 1, basename, "array[0]", "obj->")) return 1;
+// fprintf(fd, ");\n");
+// print_tabs(1, fd);
fprintf(fd, "*to += ltt_align(*to, size);\n");
print_tabs(1, fd);
fprintf(fd, "size = obj->len * size;\n");
print_tabs(1, fd);
fprintf(fd, "for(unsigned int i=0; i<obj->len; i++) {\n");
if(print_type_write(((field_t*)td->fields.array[1])->type,
- fd, 2, basename, ((field_t*)td->fields.array[1])->name)) return 1;
+ fd, 2, basename, "array[i]", "obj->")) return 1;
print_tabs(1, fd);
fprintf(fd, "}\n");
}
fprintf(fd, "*from = obj+1;\n");
break;
case STRING:
- fprintf(fd, "size = strlen(obj);\n");
+ fprintf(fd, "size = strlen(obj) + 1; /* Include final NULL char. */\n");
print_tabs(1, fd);
fprintf(fd, "if(buffer != NULL)\n");
print_tabs(2, fd);
field_t *field = (field_t*)(td->fields.array[i]);
type_descriptor_t *type = field->type;
if(print_type_write(type,
- fd, 1, basename, field->name)) return 1;
+ fd, 1, basename, field->name, "obj->")) return 1;
fprintf(fd, "\n");
}
break;
fprintf(fd, "/* Variable length child : iter. */\n");
print_tabs(1, fd);
fprintf(fd, "for(unsigned int i=0; i<LTTNG_ARRAY_SIZE_%s; i++) {\n", basename);
- if(print_type_write(((field_t*)td->fields.array[1])->type,
- fd, 2, basename, ((field_t*)td->fields.array[1])->name)) return 1;
+ if(print_type_write(((field_t*)td->fields.array[0])->type,
+ fd, 2, basename, "", "obj->array[i]")) return 1;
print_tabs(1, fd);
fprintf(fd, "}\n");
}
event_t *event, FILE *fd)
{
fprintf(fd, "static inline void trace_%s(\n", basename);
+ int has_argument = 0;
+
+ /* Does it support per trace tracing ? */
+ if(event->per_trace) {
+ print_tabs(2, fd);
+ fprintf(fd, "struct ltt_trace_struct *dest_trace");
+ has_argument = 1;
+ }
+
+ /* Does it support per tracefile tracing ? */
+ if(event->per_tracefile) {
+ if(has_argument) {
+ fprintf(fd, ",");
+ fprintf(fd, "\n");
+ }
+ fprintf(fd, "unsigned int tracefile_index");
+ has_argument = 1;
+ }
+
for(unsigned int j = 0; j < event->fields.position; j++) {
/* For each field, print the function argument */
field_t *f = (field_t*)event->fields.array[j];
type_descriptor_t *t = f->type;
- if(print_arg(t, fd, 2, basename, f->name)) return 1;
- if(j < event->fields.position-1) {
+ if(has_argument) {
fprintf(fd, ",");
fprintf(fd, "\n");
}
+ if(print_arg(t, fd, 2, basename, f->name)) return 1;
+ has_argument = 1;
}
- if(event->fields.position == 0) {
+ if(!has_argument) {
print_tabs(2, fd);
fprintf(fd, "void");
}
field_t *field = (field_t*)(event->fields.array[i]);
type_descriptor_t *type = field->type;
if(print_type_write(type,
- fd, 1, basename, field->name)) return 1;
+ fd, 1, basename, field->name, "")) return 1;
fprintf(fd, "\n");
}
print_tabs(1, fd);
if(print_type_write(type,
- fd, 2, basename, field->name)) return 1;
+ fd, 2, basename, field->name, "")) return 1;
fprintf(fd, "\n");
/* Don't forget to flush pending memcpy */
{
fprintf(fd, "#ifndef _LTT_FACILITY_%s_H_\n", fac->capname);
fprintf(fd, "#define _LTT_FACILITY_%s_H_\n\n", fac->capname);
+ fprintf(fd, "#include <linux/types.h>\n");
+ fprintf(fd, "#include <linux/ltt/ltt-facility-id-%s.h>\n", fac->name);
+ fprintf(fd, "#include <linux/ltt-core.h>\n");
fprintf(fd, "\n");
}