simple.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. """
  4. Simple built-in backend.
  5. """
  6. __author__ = "Lluís Vilanova <vilanova@ac.upc.edu>"
  7. __copyright__ = "Copyright 2012-2014, Lluís Vilanova <vilanova@ac.upc.edu>"
  8. __license__ = "GPL version 2 or (at your option) any later version"
  9. __maintainer__ = "Stefan Hajnoczi"
  10. __email__ = "stefanha@linux.vnet.ibm.com"
  11. from tracetool import out
  12. PUBLIC = True
  13. def is_string(arg):
  14. strtype = ('const char*', 'char*', 'const char *', 'char *')
  15. if arg.lstrip().startswith(strtype):
  16. return True
  17. else:
  18. return False
  19. def c(events):
  20. out('#include "trace.h"',
  21. '#include "trace/control.h"',
  22. '#include "trace/simple.h"',
  23. '',
  24. )
  25. for num, event in enumerate(events):
  26. out('void %(api)s(%(args)s)',
  27. '{',
  28. ' TraceBufferRecord rec;',
  29. api = event.api(),
  30. args = event.args,
  31. )
  32. sizes = []
  33. for type_, name in event.args:
  34. if is_string(type_):
  35. out(' size_t arg%(name)s_len = %(name)s ? MIN(strlen(%(name)s), MAX_TRACE_STRLEN) : 0;',
  36. name = name,
  37. )
  38. strsizeinfo = "4 + arg%s_len" % name
  39. sizes.append(strsizeinfo)
  40. else:
  41. sizes.append("8")
  42. sizestr = " + ".join(sizes)
  43. if len(event.args) == 0:
  44. sizestr = '0'
  45. out('',
  46. ' TraceEvent *eventp = trace_event_id(%(event_enum)s);',
  47. ' bool _state = trace_event_get_state_dynamic(eventp);',
  48. ' if (!_state) {',
  49. ' return;',
  50. ' }',
  51. '',
  52. ' if (trace_record_start(&rec, %(event_id)s, %(size_str)s)) {',
  53. ' return; /* Trace Buffer Full, Event Dropped ! */',
  54. ' }',
  55. event_enum = 'TRACE_' + event.name.upper(),
  56. event_id = num,
  57. size_str = sizestr,
  58. )
  59. if len(event.args) > 0:
  60. for type_, name in event.args:
  61. # string
  62. if is_string(type_):
  63. out(' trace_record_write_str(&rec, %(name)s, arg%(name)s_len);',
  64. name = name,
  65. )
  66. # pointer var (not string)
  67. elif type_.endswith('*'):
  68. out(' trace_record_write_u64(&rec, (uintptr_t)(uint64_t *)%(name)s);',
  69. name = name,
  70. )
  71. # primitive data type
  72. else:
  73. out(' trace_record_write_u64(&rec, (uint64_t)%(name)s);',
  74. name = name,
  75. )
  76. out(' trace_record_finish(&rec);',
  77. '}',
  78. '')
  79. def h(events):
  80. for event in events:
  81. out('void %(api)s(%(args)s);',
  82. api = event.api(),
  83. args = event.args,
  84. )