[ltt-dev] Traces data alignment

Mathieu Desnoyers compudj at krystal.dyndns.org
Wed Mar 25 03:05:18 EDT 2009


* Jérôme Stadelmann (jerome.stadelmann at heig-vd.ch) wrote:
> On mardi 24 mars 2009 14:11:31 Mathieu Desnoyers wrote:
> > * Jérôme Stadelmann (jerome.stadelmann at heig-vd.ch) wrote:
> > > On vendredi 20 mars 2009 15:53:55 Mathieu Desnoyers wrote:
> > > > * Jérôme Stadelmann (jerome.stadelmann at heig-vd.ch) wrote:
> > > > > On jeudi 19 mars 2009 18:00:01 Mathieu Desnoyers wrote:
> > > > > > * Jérôme Stadelmann (jerome.stadelmann at heig-vd.ch) wrote:
> > > > > > > Hi everybody,
> > > > > > > 
> > > > > > > I'm working on a LTTng traces parser and I'm a little bit blocked on the alignment. Can someone please explain how and where it is coded ?
> > > > > > 
> > > > > > The lttv lib "ltttraceread" should do that for you.
> > > > >  
> > > > > > > What are the roles of the alignment defined in the traces header and the one defined in the metadata file in the core_marker_id ?
> > > > > > > 
> > > > > > 
> > > > > > They tell that a specific tracefile content is aligned or not, and if
> > > > > > the content of a given event is aligned or not. You should really have
> > > > > > at least a look at the ltt lib traceread reference implementation.
> > > > > 
> > > > > Thank you. This library helped me a lot. I see that there is an up to 2 byte alignment in the core marker id event definition. Is there the only special case ?
> > > > > I've searched the uses of the ltt_align function. Are there other functions to look for ?
> > > > > 
> > > > 
> > > > Looking at ltt_align use is a good starting point.
> > > > 
> > > > Can you point out to the specific package/version/file/line you refer to
> > > > for the core marker id "special case" you talk about here ?
> > > > 
> > > 
> > > I think I've understood now. The alignment in the metadata file is
> > > "hardcoded" as 2 byte because the id field is the biggest value and is
> > > coded as a 2 bytes value. Am I right ?
> > > 
> > 
> > Possibly. Again, can you point out which package/version/file/line you
> > refer to so I can be sure we are talking about the same piece of code ?
> > Telling which file and function, with a cut and paste of the context,
> > would be nice to have.
> > 
> 
> in tracefile.c :
> 
> static int ltt_process_metadata_tracefile(LttTracefile *tf)
> {
> 	.....
> 
>         case MARKER_ID_SET_MARKER_ID:
>           channel_name = pos = tf->event.data;
> 	  pos += strlen(channel_name) + 1;
> 	  marker_name = pos;
>           g_debug("Doing MARKER_ID_SET_MARKER_ID of marker %s.%s",
> 	    channel_name, marker_name);
>           pos += strlen(marker_name) + 1;
> 
>           pos += ltt_align((size_t)pos, sizeof(guint16), tf->alignment);
> 
>           id = ltt_get_uint16(LTT_GET_BO(tf), pos);
>           g_debug("In MARKER_ID_SET_MARKER_ID of marker %s.%s id %hu",
> 	  	channel_name, marker_name, id);
>           pos += sizeof(guint16);
>           int_size = *(guint8*)pos;
>           pos += sizeof(guint8);
>           long_size = *(guint8*)pos;
>           pos += sizeof(guint8);
>           pointer_size = *(guint8*)pos;
>           pos += sizeof(guint8);
>           size_t_size = *(guint8*)pos;
>           pos += sizeof(guint8);
>           alignment = *(guint8*)pos;
>           pos += sizeof(guint8);
> 
> 	.....
> }
> 
> As I said, you are using an "hardcoded" up to 2 bytes alignment because you already know in this case all the fields ?
> 

I use a 2 bytes alignment there because I know the next field is 2
bytes in size.

Alignment of the whole event payload is done by the
ltt_update_event_size() call in ltt_tracefile_read_update_event(). See
the following comment :

  /*
   * Let ltt_update_event_size update event->data according to the largest
   * alignment within the payload.
   * Get the data size and update the event fields with the current
   * information. */

There is a small trick here though : ltt_update_event_size() seems to
assume that the payload will always be aligned on 2-bytes boundaries (it
does not ltt_align at the beginning of the metadata parsing code). It's
OK because, when trace alignment is active, event headers are aligned on
their own size, and they are always multiples of 2 bytes.

It could be more solid if I added a ltt_align on 2-bytes at the
beginning of those though. That would not fail if the event header
becomes something else than a 2-bytes multiple.

Mathieu

> > Mathieu
> > 
> > > > Mathieu
> > > > 
> > > > > Jerome
> > > > >  
> > > > > > Mathieu
> > > > > > 
> > > > > > > Regards,
> > > > > > > Jerome
> > > > > > > 
> > > > > > > _______________________________________________
> > > > > > > ltt-dev mailing list
> > > > > > > ltt-dev at lists.casi.polymtl.ca
> > > > > > > http://lists.casi.polymtl.ca/cgi-bin/mailman/listinfo/ltt-dev
> > > > > > > 
> > > > > > 
> > > > > 
> > > > 
> > > 
> > 
> 

-- 
Mathieu Desnoyers
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68




More information about the lttng-dev mailing list