evsel-roundtrip-name.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #include "evlist.h"
  2. #include "evsel.h"
  3. #include "parse-events.h"
  4. #include "tests.h"
  5. static int perf_evsel__roundtrip_cache_name_test(void)
  6. {
  7. char name[128];
  8. int type, op, err = 0, ret = 0, i, idx;
  9. struct perf_evsel *evsel;
  10. struct perf_evlist *evlist = perf_evlist__new(NULL, NULL);
  11. if (evlist == NULL)
  12. return -ENOMEM;
  13. for (type = 0; type < PERF_COUNT_HW_CACHE_MAX; type++) {
  14. for (op = 0; op < PERF_COUNT_HW_CACHE_OP_MAX; op++) {
  15. /* skip invalid cache type */
  16. if (!perf_evsel__is_cache_op_valid(type, op))
  17. continue;
  18. for (i = 0; i < PERF_COUNT_HW_CACHE_RESULT_MAX; i++) {
  19. __perf_evsel__hw_cache_type_op_res_name(type, op, i,
  20. name, sizeof(name));
  21. err = parse_events(evlist, name, 0);
  22. if (err)
  23. ret = err;
  24. }
  25. }
  26. }
  27. idx = 0;
  28. evsel = perf_evlist__first(evlist);
  29. for (type = 0; type < PERF_COUNT_HW_CACHE_MAX; type++) {
  30. for (op = 0; op < PERF_COUNT_HW_CACHE_OP_MAX; op++) {
  31. /* skip invalid cache type */
  32. if (!perf_evsel__is_cache_op_valid(type, op))
  33. continue;
  34. for (i = 0; i < PERF_COUNT_HW_CACHE_RESULT_MAX; i++) {
  35. __perf_evsel__hw_cache_type_op_res_name(type, op, i,
  36. name, sizeof(name));
  37. if (evsel->idx != idx)
  38. continue;
  39. ++idx;
  40. if (strcmp(perf_evsel__name(evsel), name)) {
  41. pr_debug("%s != %s\n", perf_evsel__name(evsel), name);
  42. ret = -1;
  43. }
  44. evsel = perf_evsel__next(evsel);
  45. }
  46. }
  47. }
  48. perf_evlist__delete(evlist);
  49. return ret;
  50. }
  51. static int __perf_evsel__name_array_test(const char *names[], int nr_names)
  52. {
  53. int i, err;
  54. struct perf_evsel *evsel;
  55. struct perf_evlist *evlist = perf_evlist__new(NULL, NULL);
  56. if (evlist == NULL)
  57. return -ENOMEM;
  58. for (i = 0; i < nr_names; ++i) {
  59. err = parse_events(evlist, names[i], 0);
  60. if (err) {
  61. pr_debug("failed to parse event '%s', err %d\n",
  62. names[i], err);
  63. goto out_delete_evlist;
  64. }
  65. }
  66. err = 0;
  67. list_for_each_entry(evsel, &evlist->entries, node) {
  68. if (strcmp(perf_evsel__name(evsel), names[evsel->idx])) {
  69. --err;
  70. pr_debug("%s != %s\n", perf_evsel__name(evsel), names[evsel->idx]);
  71. }
  72. }
  73. out_delete_evlist:
  74. perf_evlist__delete(evlist);
  75. return err;
  76. }
  77. #define perf_evsel__name_array_test(names) \
  78. __perf_evsel__name_array_test(names, ARRAY_SIZE(names))
  79. int test__perf_evsel__roundtrip_name_test(void)
  80. {
  81. int err = 0, ret = 0;
  82. err = perf_evsel__name_array_test(perf_evsel__hw_names);
  83. if (err)
  84. ret = err;
  85. err = perf_evsel__name_array_test(perf_evsel__sw_names);
  86. if (err)
  87. ret = err;
  88. err = perf_evsel__roundtrip_cache_name_test();
  89. if (err)
  90. ret = err;
  91. return ret;
  92. }