From: compudj Date: Sat, 20 Aug 2005 01:10:25 +0000 (+0000) Subject: add per trace and per tracefile optional logging X-Git-Tag: v0.12.20~2466 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=276a9e6fc8f3f6cb40f759a429cbd17c0b437043;p=lttv.git add per trace and per tracefile optional logging git-svn-id: http://ltt.polymtl.ca/svn@1023 04897980-b3bd-0310-b5e0-8ef037075253 --- diff --git a/genevent/core.xml b/genevent/core.xml index 0f2aa80e..c9004d3f 100644 --- a/genevent/core.xml +++ b/genevent/core.xml @@ -21,7 +21,7 @@ - + System time values sent periodically to detect cycle counter rollovers. Useful when only the 32 LSB of the TSC are saved in events header : we save the full 64 bits in this event. @@ -29,7 +29,7 @@ - + Facility is loaded while in state dump diff --git a/genevent/genevent.c b/genevent/genevent.c index 9c96d81f..316f15b7 100644 --- a/genevent/genevent.c +++ b/genevent/genevent.c @@ -417,6 +417,7 @@ void generateStructFunc(FILE * fp, char * facName, unsigned long checksum){ type_descriptor * td; int pos, pos1; int hasStrSeq, flag, structCount, seqCount,strCount, whichTypeFirst=0; + int args_empty; for(pos = 0; pos < fac->events.position; pos++){ ev = (event *) fac->events.array[pos]; @@ -457,23 +458,46 @@ void generateStructFunc(FILE * fp, char * facName, unsigned long checksum){ strCount = 0; fprintf(fp, "#ifndef CONFIG_LTT\n"); fprintf(fp,"static inline void trace_%s_%s(",facName,ev->name); - if(ev->type == 0) - fprintf(fp, "void"); - else + + args_empty = 1; + + /* Does it support per trace tracing ? */ + if(ev->per_trace) { + fprintf(fp, "struct ltt_trace_struct *dest_trace"); + args_empty = 0; + } + + /* Does it support per tracefile tracing ? */ + if(ev->per_tracefile) { + if(!args_empty) fprintf(fp, ", "); + fprintf(fp, "unsigned int tracefile_index"); + args_empty = 0; + } + + if(ev->type != 0) { for(pos1 = 0; pos1 < ev->type->fields.position; pos1++){ fld = (field *)ev->type->fields.array[pos1]; td = fld->type; + if(!args_empty) fprintf(fp, ", "); if(td->type == ARRAY ){ fprintf(fp,"%s * %s",getTypeStr(td), fld->name); + args_empty = 0; }else if(td->type == STRING){ fprintf(fp,"short int strlength_%d, %s * %s", ++strCount, getTypeStr(td), fld->name); - }else if(td->type == SEQUENCE){ + args_empty = 0; + }else if(td->type == SEQUENCE){ fprintf(fp,"%s seqlength_%d, %s * %s", uintOutputTypes[td->size], ++seqCount,getTypeStr(td), fld->name); - }else fprintf(fp,"%s %s",getTypeStr(td), fld->name); - if(pos1 != ev->type->fields.position - 1) fprintf(fp,", "); + args_empty = 0; + }else { + fprintf(fp,"%s %s",getTypeStr(td), fld->name); + args_empty = 0; + } } + } + if(args_empty) fprintf(fp, "void"); + fprintf(fp,")\n{\n"); fprintf(fp,"}\n"); fprintf(fp,"#else\n"); @@ -482,26 +506,47 @@ void generateStructFunc(FILE * fp, char * facName, unsigned long checksum){ seqCount = 0; strCount = 0; fprintf(fp,"static inline void trace_%s_%s(",facName,ev->name); - if(ev->type == 0) - fprintf(fp, "void"); - else + + args_empty = 1; + + /* Does it support per trace tracing ? */ + if(ev->per_trace) { + fprintf(fp, "struct ltt_trace_struct *dest_trace"); + args_empty = 0; + } + + /* Does it support per tracefile tracing ? */ + if(ev->per_tracefile) { + if(!args_empty) fprintf(fp, ", "); + fprintf(fp, "unsigned int tracefile_index"); + args_empty = 0; + } + + if(ev->type != 0) { for(pos1 = 0; pos1 < ev->type->fields.position; pos1++){ fld = (field *)ev->type->fields.array[pos1]; td = fld->type; + if(!args_empty) fprintf(fp, ", "); if(td->type == ARRAY ){ fprintf(fp,"%s * %s",getTypeStr(td), fld->name); + args_empty = 0; }else if(td->type == STRING){ fprintf(fp,"short int strlength_%d, %s * %s", ++strCount, getTypeStr(td), fld->name); - }else if(td->type == SEQUENCE){ + args_empty = 0; + }else if(td->type == SEQUENCE){ fprintf(fp,"%s seqlength_%d, %s * %s", uintOutputTypes[td->size], ++seqCount,getTypeStr(td), fld->name); - }else fprintf(fp,"%s %s",getTypeStr(td), fld->name); - if(pos1 != ev->type->fields.position - 1) fprintf(fp,", "); + args_empty = 0; + }else { + fprintf(fp,"%s %s",getTypeStr(td), fld->name); + args_empty = 0; + } } - fprintf(fp,")\n{\n"); - + } + if(args_empty) fprintf(fp, "void"); + fprintf(fp,")\n{\n"); //allocate buffer // MD no more need. fprintf(fp,"\tchar buff[buflength];\n"); @@ -540,16 +585,23 @@ void generateStructFunc(FILE * fp, char * facName, unsigned long checksum){ fprintf(fp, "\tif(ltt_nesting[smp_processor_id()] > 1) goto unlock;\n"); fprintf(fp, "\tspin_lock(<t_traces.locks[smp_processor_id()]);\n\n"); - fprintf(fp, + if(ev->per_tracefile) { + fprintf(fp, "\tindex = tracefile_index;\n"); + } else { + fprintf(fp, "\tindex = ltt_get_index_from_facility(ltt_facility_%s_%X,\n"\ "\t\t\t\tevent_%s);\n", facName, checksum, ev->name); + } fprintf(fp,"\n"); /* For each trace */ fprintf(fp, "\tlist_for_each_entry(trace, <t_traces.head, list) {\n"); fprintf(fp, "\t\tif(!trace->active) continue;\n\n"); + if(ev->per_trace) { + fprintf(fp, "\t\tif(dest_trace != trace) continue;\n\n"); + } //length of buffer : length of all structures // if(ev->type == 0) fprintf(fp, "0"); @@ -673,77 +725,10 @@ void generateStructFunc(FILE * fp, char * facName, unsigned long checksum){ fprintf(fp, "\n"); if(ev->type != 0) - fprintf(fp, "\t\tchar *ptr = (char*)buff + _offset + header_length;\n"); - - - //declare a char pointer if needed : starts at the end of the structs. - //if(structCount + hasStrSeq > 1) { - // fprintf(fp,"\t\tchar * ptr = (char*)buff + header_length"); - // for(pos1=0;pos1name, facName,pos1+1); - // } - // if(structCount + hasStrSeq > 1) fprintf(fp,";\n"); - //} - - // Declare an alias pointer of the struct type to the beginning - // of the reserved area, just after the event header. - if(ev->type != 0) { - unsigned align = max(alignment, td->alignment); - if(align > 1) { - fprintf(fp,"\t\tptr+=(%u - ((unsigned int)ptr&(%u-1)))&(%u-1);\n", - align, align, align); - } - - fprintf(fp, "\t\t__1 = (struct %s_%s_1 *)(ptr);\n", - ev->name, facName); - } - //allocate memory for new struct and initialize it - //if(whichTypeFirst == 1){ //struct first - //for(pos1=0;pos1name, facName,ev->name, facName); - //MD disabled else fprintf(fp, - // "\tstruct %s_%s_%d __%d;\n", - // ev->name, facName,pos1+1,pos1+1); - //} - //}else if(whichTypeFirst == 2){ - // for(pos1=0;pos1name, facName,pos1+1,pos1+1); - //} - fprintf(fp,"\n"); - - if(structCount) fprintf(fp,"\t\t//initialize structs\n"); - //flag = 0; - //structCount = 0; - if(ev->type != 0) - for(pos1 = 0; pos1 < ev->type->fields.position; pos1++){ - fld = (field *)ev->type->fields.array[pos1]; - td = fld->type; - if(td->type != ARRAY && td->type != SEQUENCE && td->type != STRING){ - //if(flag == 0){ - // flag = 1; - // structCount++; - // if(structCount > 1) fprintf(fp,"\n"); - //} - fprintf(fp, "\t\t__1->%s = %s;\n", fld->name, fld->name ); - - //if(structCount == 1 && whichTypeFirst == 1) - // fprintf(fp, "\t__1->%s = %s;\n",fld->name,fld->name ); - //else - // fprintf(fp, "\t__%d.%s = %s;\n",structCount ,fld->name,fld->name); - } - //else flag = 0; - } - if(structCount) fprintf(fp,"\n"); - //set ptr to the end of first struct if needed; - //if(structCount + hasStrSeq > 1){ - // fprintf(fp,"\n\t\t//set ptr to the end of the first struct\n"); - // fprintf(fp,"\t\tptr += sizeof(struct %s_%s_1);\n\n",ev->name, facName); - //} + fprintf(fp, "\t\tptr = (char*)buff + _offset + header_length;\n"); //copy struct, sequence and string to buffer + //FIXME : they always come before the structs. seqCount = 0; strCount = 0; flag = 0; @@ -816,6 +801,76 @@ void generateStructFunc(FILE * fp, char * facName, unsigned long checksum){ } if(structCount + seqCount > 1) fprintf(fp,"\n"); + + + + //declare a char pointer if needed : starts at the end of the structs. + //if(structCount + hasStrSeq > 1) { + // fprintf(fp,"\t\tchar * ptr = (char*)buff + header_length"); + // for(pos1=0;pos1name, facName,pos1+1); + // } + // if(structCount + hasStrSeq > 1) fprintf(fp,";\n"); + //} + + // Declare an alias pointer of the struct type to the beginning + // of the reserved area, just after the event header. + if(ev->type != 0) { + unsigned align = max(alignment, td->alignment); + if(align > 1) { + fprintf(fp,"\t\tptr+=(%u - ((unsigned int)ptr&(%u-1)))&(%u-1);\n", + align, align, align); + } + + fprintf(fp, "\t\t__1 = (struct %s_%s_1 *)(ptr);\n", + ev->name, facName); + } + //allocate memory for new struct and initialize it + //if(whichTypeFirst == 1){ //struct first + //for(pos1=0;pos1name, facName,ev->name, facName); + //MD disabled else fprintf(fp, + // "\tstruct %s_%s_%d __%d;\n", + // ev->name, facName,pos1+1,pos1+1); + //} + //}else if(whichTypeFirst == 2){ + // for(pos1=0;pos1name, facName,pos1+1,pos1+1); + //} + fprintf(fp,"\n"); + + if(structCount) fprintf(fp,"\t\t//initialize structs\n"); + //flag = 0; + //structCount = 0; + if(ev->type != 0) + for(pos1 = 0; pos1 < ev->type->fields.position; pos1++){ + fld = (field *)ev->type->fields.array[pos1]; + td = fld->type; + if(td->type != ARRAY && td->type != SEQUENCE && td->type != STRING){ + //if(flag == 0){ + // flag = 1; + // structCount++; + // if(structCount > 1) fprintf(fp,"\n"); + //} + fprintf(fp, "\t\t__1->%s = %s;\n", fld->name, fld->name ); + + //if(structCount == 1 && whichTypeFirst == 1) + // fprintf(fp, "\t__1->%s = %s;\n",fld->name,fld->name ); + //else + // fprintf(fp, "\t__%d.%s = %s;\n",structCount ,fld->name,fld->name); + } + //else flag = 0; + } + if(structCount) fprintf(fp,"\n"); + //set ptr to the end of first struct if needed; + //if(structCount + hasStrSeq > 1){ + // fprintf(fp,"\n\t\t//set ptr to the end of the first struct\n"); + // fprintf(fp,"\t\tptr += sizeof(struct %s_%s_1);\n\n",ev->name, facName); + //} + fprintf(fp,"\n"); fprintf(fp, "\t\t/* Commit the work */\n"); fprintf(fp, "\t\trelay_commit(channel->rchan->buf[smp_processor_id()],\n" diff --git a/genevent/parser.c b/genevent/parser.c index 7a8a6593..b4bd088b 100644 --- a/genevent/parser.c +++ b/genevent/parser.c @@ -223,6 +223,8 @@ void getEventAttributes(parse_file *in, event *ev) char car; ev->name = NULL; + ev->per_trace = 0; + ev->per_tracefile = 0; while(1) { token = getToken(in); @@ -237,7 +239,12 @@ void getEventAttributes(parse_file *in, event *ev) if(car == EOF) in->error(in,"name was expected"); else if(car == '\"') ev->name = allocAndCopy(getQuotedString(in)); else ev->name = allocAndCopy(getName(in)); + } else if(!strcmp("per_trace", token)) { + ev->per_trace = 1; + } else if(!strcmp("per_tracefile", token)) { + ev->per_tracefile = 1; } + } } diff --git a/genevent/parser.h b/genevent/parser.h index e75f2b5f..da5a303d 100644 --- a/genevent/parser.h +++ b/genevent/parser.h @@ -126,6 +126,8 @@ typedef struct _event { char *name; char *description; type_descriptor *type; + int per_trace; /* Is the event able to be logged to a specific trace ? */ + int per_tracefile; /* Must we log this event in a specific tracefile ? */ } event; typedef struct _facility {