| 
									
										
										
										
											2012-04-03 20:48:01 +02:00
										 |  |  | #!/usr/bin/env python | 
					
						
							|  |  |  | # -*- coding: utf-8 -*- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | Simple built-in backend. | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | __author__     = "Lluís Vilanova <vilanova@ac.upc.edu>" | 
					
						
							|  |  |  | __copyright__  = "Copyright 2012, Lluís Vilanova <vilanova@ac.upc.edu>" | 
					
						
							|  |  |  | __license__    = "GPL version 2 or (at your option) any later version" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | __maintainer__ = "Stefan Hajnoczi" | 
					
						
							|  |  |  | __email__      = "stefanha@linux.vnet.ibm.com" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from tracetool import out | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-18 15:15:59 +05:30
										 |  |  | def is_string(arg): | 
					
						
							|  |  |  |     strtype = ('const char*', 'char*', 'const char *', 'char *') | 
					
						
							|  |  |  |     if arg.lstrip().startswith(strtype): | 
					
						
							|  |  |  |         return True | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         return False | 
					
						
							| 
									
										
										
										
											2012-04-03 20:48:01 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | def c(events): | 
					
						
							|  |  |  |     out('#include "trace.h"', | 
					
						
							| 
									
										
										
										
											2012-07-18 15:15:59 +05:30
										 |  |  |         '#include "trace/simple.h"', | 
					
						
							| 
									
										
										
										
											2012-04-03 20:48:01 +02:00
										 |  |  |         '', | 
					
						
							|  |  |  |         'TraceEvent trace_list[] = {') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for e in events: | 
					
						
							|  |  |  |         out('{.tp_name = "%(name)s", .state=0},', | 
					
						
							|  |  |  |             name = e.name, | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-18 15:15:59 +05:30
										 |  |  |     out('};', | 
					
						
							|  |  |  |         '') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for num, event in enumerate(events): | 
					
						
							|  |  |  |         out('void trace_%(name)s(%(args)s)', | 
					
						
							|  |  |  |             '{', | 
					
						
							|  |  |  |             '    TraceBufferRecord rec;', | 
					
						
							|  |  |  |             name = event.name, | 
					
						
							|  |  |  |             args = event.args, | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         sizes = [] | 
					
						
							|  |  |  |         for type_, name in event.args: | 
					
						
							|  |  |  |             if is_string(type_): | 
					
						
							|  |  |  |                 out('    size_t arg%(name)s_len = %(name)s ? MIN(strlen(%(name)s), MAX_TRACE_STRLEN) : 0;', | 
					
						
							|  |  |  |                     name = name, | 
					
						
							|  |  |  |                    ) | 
					
						
							|  |  |  |                 strsizeinfo = "4 + arg%s_len" % name | 
					
						
							|  |  |  |                 sizes.append(strsizeinfo) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 sizes.append("8") | 
					
						
							|  |  |  |         sizestr = " + ".join(sizes) | 
					
						
							|  |  |  |         if len(event.args) == 0: | 
					
						
							|  |  |  |             sizestr = '0' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         out('', | 
					
						
							|  |  |  |             '    if (!trace_list[%(event_id)s].state) {', | 
					
						
							|  |  |  |             '        return;', | 
					
						
							|  |  |  |             '    }', | 
					
						
							|  |  |  |             '', | 
					
						
							|  |  |  |             '    if (trace_record_start(&rec, %(event_id)s, %(size_str)s)) {', | 
					
						
							|  |  |  |             '        return; /* Trace Buffer Full, Event Dropped ! */', | 
					
						
							|  |  |  |             '    }', | 
					
						
							|  |  |  |             event_id = num, | 
					
						
							|  |  |  |             size_str = sizestr, | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if len(event.args) > 0: | 
					
						
							|  |  |  |             for type_, name in event.args: | 
					
						
							|  |  |  |                 # string | 
					
						
							|  |  |  |                 if is_string(type_): | 
					
						
							|  |  |  |                     out('    trace_record_write_str(&rec, %(name)s, arg%(name)s_len);', | 
					
						
							|  |  |  |                         name = name, | 
					
						
							|  |  |  |                        ) | 
					
						
							|  |  |  |                 # pointer var (not string) | 
					
						
							|  |  |  |                 elif type_.endswith('*'): | 
					
						
							| 
									
										
										
										
											2012-08-13 21:50:56 +02:00
										 |  |  |                     out('    trace_record_write_u64(&rec, (uintptr_t)(uint64_t *)%(name)s);', | 
					
						
							| 
									
										
										
										
											2012-07-18 15:15:59 +05:30
										 |  |  |                         name = name, | 
					
						
							|  |  |  |                        ) | 
					
						
							|  |  |  |                 # primitive data type | 
					
						
							|  |  |  |                 else: | 
					
						
							|  |  |  |                     out('    trace_record_write_u64(&rec, (uint64_t)%(name)s);', | 
					
						
							|  |  |  |                        name = name, | 
					
						
							|  |  |  |                        ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         out('    trace_record_finish(&rec);', | 
					
						
							|  |  |  |             '}', | 
					
						
							|  |  |  |             '') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-03 20:48:01 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | def h(events): | 
					
						
							|  |  |  |     out('#include "trace/simple.h"', | 
					
						
							|  |  |  |         '') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-18 15:15:59 +05:30
										 |  |  |     for event in events: | 
					
						
							|  |  |  |         out('void trace_%(name)s(%(args)s);', | 
					
						
							|  |  |  |             name = event.name, | 
					
						
							|  |  |  |             args = event.args, | 
					
						
							| 
									
										
										
										
											2012-04-03 20:48:01 +02:00
										 |  |  |             ) | 
					
						
							| 
									
										
										
										
											2012-07-18 15:15:59 +05:30
										 |  |  |     out('') | 
					
						
							| 
									
										
										
										
											2012-04-03 20:48:01 +02:00
										 |  |  |     out('#define NR_TRACE_EVENTS %d' % len(events)) | 
					
						
							|  |  |  |     out('extern TraceEvent trace_list[NR_TRACE_EVENTS];') |