Messages in this thread | | | Date | Tue, 26 May 2009 22:15:15 -0400 (EDT) | From | Steven Rostedt <> | Subject | Re: [PATCH v2 1/2] tracing/events: make __string() more general |
| |
On Wed, 27 May 2009, Li Zefan wrote: > >> > >> With __string(..., src), we need to have a source string, but sometimes no > >> source string is available, and what we know is how big the string will be. > >> > >> Take block trace events for example, I want to convert an unsigned char array > >> into a string, after this patch, this can be done this way: > >> > >> TP_STRUCT_entry( > >> __string( cmd, rq->cmd_len * 3 ) > >> ) > >> > >> TP_fast_assign( > >> construct_str( cmd ) > > > > What does the construct_str do? > > > > Ah, it's pseudo code.. Should be construct_str(__entry->cmd, rq), > this helper function convert rq->cmd (unsigned char[]) to a string of > hex dump. > > No source string is available, so I'm not calling assign_str() in > TP_fast_assign.
OK, I think I have a better understanding of what you are doing.
But, I don't like changing the interface for string by adding that "strlen" to all users. I find that very ugly.
Could we instead perhaps add a __dynamic_array? That would take a length, and append itself to after the strings?
stage 1:
#define __dynamic_array(item, len) int __dyn_loc_##item;
stage 2:
#define __dynamic_array(item, len) int item;
stage 3:
#define __get_dynamic_array(item) \ ((void *)__entry + __entry->__str_loc_##field
stage 4:
#define __dynamic_array(item, len) \ __str_offsets.item = __str_size + \ offsetof(typeof(*entry), __str_data); \ __str_size += len;
And so on. You should be able to do something like this, and make it more generic.
-- Steve
| |