Guest User

Untitled

a guest
Oct 19th, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.62 KB | None | 0 0
  1. //code...
  2. any_type_t *retVal = function_that_runs_very_long_time(a, b, &&c, **d, &e, *f);
  3. //other code...
  4.  
  5. //code...
  6. any_type_t *retVal =
  7. TIMER(
  8. function_that_runs_very_long_time(a, b, &&c, **d, &e, *f),
  9. "TIMING FOR VALUE <%d, %d>", a, b
  10. );
  11. //other code...
  12.  
  13. #define TIMER(expr, fmt_msg, ...)
  14. ({
  15. struct timeval before, after;
  16. uint64_t time_span;
  17. int time_span_sec, time_span_usec;
  18. gettimeofday(&before, NULL);
  19. typeof(expr) _timer_expr__ = (expr); // <- static if?
  20. gettimeofday(&after, NULL);
  21. time_span = (after.tv_sec * 1000000 + after.tv_usec)
  22. - (before.tv_sec * 1000000 + before.tv_usec);
  23. time_span_sec = time_span / 1000000;
  24. time_span_usec = time_span % 1000000;
  25. TRACE(fmt_msg "n%s : %d.%d seconds",
  26. #expr, time_span_sec, time_span_usec, ...);
  27. _timer_expr__;
  28. })
  29.  
  30. #define __type_is_void(expr) __builtin_types_compatible_p(typeof(expr), void)
  31.  
  32. #define __DO(expr)
  33. ({ typeof(expr) __ret; __ret = (expr); __ret; })
  34.  
  35. #define __DO_VOID(expr)
  36. (void) (expr)
  37.  
  38. #define DO(expr)
  39. __builtin_choose_expr(__type_is_void(expr),
  40. __DO_VOID(expr),
  41. __DO(expr)) # won't work
  42.  
  43. test.c:28:9: error: variable or field β€˜__ret’ declared void
  44. test.c:28:9: error: void value not ignored as it ought to be
  45.  
  46. #define __expr_or_zero(expr) __builtin_choose_expr(__type_is_void(expr), 0, (expr))
  47.  
  48. #define DO(expr)
  49. __builtin_choose_expr(__type_is_void(expr),
  50. __DO_VOID(expr),
  51. __DO(__expr_or_zero(expr))) # works fine!
  52.  
  53. #define TIMER(is_void, expr, fmt_msg, ...)
  54. ({
  55. struct timeval before, after;
  56. uint64_t time_span;
  57. int time_span_sec, time_span_usec;
  58. gettimeofday(&before, NULL);
  59. if (is_void)
  60. (expr)
  61. else
  62. typeof(expr) _timer_expr__ = (expr); // <- static if?
  63. gettimeofday(&after, NULL);
  64. time_span = (after.tv_sec * 1000000 + after.tv_usec)
  65. - (before.tv_sec * 1000000 + before.tv_usec);
  66. time_span_sec = time_span / 1000000;
  67. time_span_usec = time_span % 1000000;
  68. TRACE(fmt_msg "n%s : %d.%d seconds",
  69. #expr, time_span_sec, time_span_usec, ...);
  70. if (!is_void)
  71. _timer_expr__;
  72. })
  73.  
  74. #include <stdio.h>
  75. #define __type_is_void(expr) _Generic((typeof(expr)*){0}, void*:1, default:0)
  76. #define __expr_or_zero(expr) _Generic((typeof(expr)*){0}, void*:0, default:(expr))
  77.  
  78. #define DO(expr)
  79. _Generic((typeof(expr)*){0},
  80. void*:__DO_VOID(expr),
  81. default:__DO(__expr_or_zero(expr)))
  82.  
  83. #define __DO(expr)
  84. ({ typeof(expr) __ret; puts("do nonvoid"); __ret = (expr); __ret; })
  85.  
  86. #define __DO_VOID(expr)
  87. (void)({ puts("do void"); (void)(expr); })
  88.  
  89. void foo(void) { }
  90. int bar(void) { return 1; }
  91.  
  92. int main(void)
  93. {
  94. DO(foo());
  95. DO(bar());
  96. return 0;
  97. }
Add Comment
Please, Sign In to add comment