Advertisement
Guest User

Untitled

a guest
Oct 14th, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.45 KB | None | 0 0
  1. void PerfSampleWrap::signal_handler(int sig_num, siginfo_t *sig_info, void *context)
  2. {
  3. perf_event_mmap_page *mmap_buffer = (perf_event_mmap_page *) data->buffers[index];
  4. while (__mmap_get_remain_size(mmap_buffer) > 0)
  5. {
  6. uint64_t remain = __mmap_get_remain_size(mmap_buffer);
  7. if (remain < sizeof(perf_event_header))
  8. {
  9. __mmap_move_index(mmap_buffer, remain);
  10. break;
  11. }
  12. PerfMySample *sample = (PerfMySample *) __mmap_get_index(mmap_buffer);
  13. if (sample->header.type == PERF_RECORD_SAMPLE)
  14. {
  15. __config.handler->callback(index, sample, context);
  16. }
  17. else
  18. {
  19. if (sample->header.size == 0)
  20. {
  21. __mmap_move_index(mmap_buffer, remain);
  22. break;
  23. }
  24. }
  25. __mmap_move_index(mmap_buffer, sample->header.size);
  26. }
  27.  
  28. }
  29.  
  30. void PerfSampleWrap::__mmap_move_index(perf_event_mmap_page *buffer, size_t n)
  31. {
  32. assert(n <= __mmap_get_remain_size(buffer));
  33. buffer->data_tail += n;
  34. }
  35.  
  36. void *PerfSampleWrap::__mmap_get_index(perf_event_mmap_page *buffer)
  37. {
  38. char *data = (char *) buffer + PAGE_SIZE;
  39. uint64_t tail = buffer->data_tail & (PAGE_SIZE * RING_BUFFER_PAGES - 1);
  40. return data + tail;
  41. }
  42.  
  43. uint64_t PerfSampleWrap::__mmap_get_remain_size(perf_event_mmap_page *buffer)
  44. {
  45. uint64_t data_head = buffer->data_head;
  46. __sync_synchronize();
  47. return data_head - buffer->data_tail;
  48. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement