|
21 | 21 | * babeltrace2 --plugin-path=. query -p "inputs=[trace.dat]" |
22 | 22 | * source.ftrace.tracedat babeltrace.trace-infos |
23 | 23 | * |
| 24 | + * Seek in trace: |
| 25 | + * babeltrace2 trace.dat --begin=<> --end=<> |
24 | 26 | */ |
25 | 27 |
|
26 | 28 | #define _GNU_SOURCE |
@@ -571,6 +573,10 @@ ftrace_in_message_iterator_initialize( |
571 | 573 | ftrace_in_iter->events_in_pkg = 0; |
572 | 574 | ftrace_in_iter->events_discarded = 0; |
573 | 575 |
|
| 576 | + /* the iterator supports seeking */ |
| 577 | + bt_self_message_iterator_configuration_set_can_seek_forward(configuration, |
| 578 | + BT_TRUE); |
| 579 | + |
574 | 580 | /* Set the message iterator's user data to our private data structure */ |
575 | 581 | bt_self_message_iterator_set_data(self_message_iterator, ftrace_in_iter); |
576 | 582 |
|
@@ -807,6 +813,91 @@ ftrace_in_message_iterator_next(bt_self_message_iterator *self_message_iterator, |
807 | 813 | return status; |
808 | 814 | } |
809 | 815 |
|
| 816 | +bt_message_iterator_class_seek_beginning_method_status |
| 817 | +ftrace_in_message_iterator_seek_beginning( |
| 818 | + bt_self_message_iterator *self_message_iterator) |
| 819 | +{ |
| 820 | + struct ftrace_in_message_iterator *ftrace_in_iter = |
| 821 | + bt_self_message_iterator_get_data(self_message_iterator); |
| 822 | + |
| 823 | + /* cleanup current state */ |
| 824 | + tracecmd_free_record(ftrace_in_iter->rec); |
| 825 | + BT_PACKET_PUT_REF_AND_RESET(ftrace_in_iter->packet); |
| 826 | + |
| 827 | + /* Set the message iterator's initial state */ |
| 828 | + ftrace_in_iter->rec = tracecmd_read_cpu_first( |
| 829 | + ftrace_in_iter->ftrace_in->tc_input, ftrace_in_iter->cpu_id); |
| 830 | + |
| 831 | + ftrace_in_iter->events_in_pkg = 0; |
| 832 | + ftrace_in_iter->events_discarded = 0; |
| 833 | + ftrace_in_iter->last_rec_ts = 0; |
| 834 | + ftrace_in_iter->state = FTRACE_IN_MESSAGE_ITERATOR_STATE_STREAM_BEGINNING; |
| 835 | + |
| 836 | + return BT_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHOD_STATUS_OK; |
| 837 | +} |
| 838 | + |
| 839 | +bt_message_iterator_class_can_seek_beginning_method_status |
| 840 | +ftrace_in_message_iterator_can_seek_beginning( |
| 841 | + bt_self_message_iterator *self_message_iterator, bt_bool *can_seek) |
| 842 | +{ |
| 843 | + *can_seek = BT_TRUE; |
| 844 | + return BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_BEGINNING_METHOD_STATUS_OK; |
| 845 | +} |
| 846 | + |
| 847 | +bt_message_iterator_class_seek_ns_from_origin_method_status |
| 848 | +ftrace_in_message_iterator_seek_ns_from_origin( |
| 849 | + bt_self_message_iterator *self_message_iterator, int64_t ns_from_origin) |
| 850 | +{ |
| 851 | + struct ftrace_in_message_iterator *ftrace_in_iter = |
| 852 | + bt_self_message_iterator_get_data(self_message_iterator); |
| 853 | + bt_logging_level log_level = ftrace_in_iter->ftrace_in->log_level; |
| 854 | + |
| 855 | + const bt_stream *stream = |
| 856 | + ftrace_in_iter->ftrace_in->streams[ftrace_in_iter->cpu_id]; |
| 857 | + const bt_bool supports_discarded_events = |
| 858 | + bt_stream_class_supports_discarded_events( |
| 859 | + bt_stream_borrow_class_const(stream)); |
| 860 | + |
| 861 | + /* the cast is safe, as we only allow positive seeking anyways */ |
| 862 | + const uint64_t ns_from_orig_pos = (uint64_t)ns_from_origin; |
| 863 | + if (ftrace_in_iter->last_rec_ts < ns_from_orig_pos) { |
| 864 | + while (ftrace_in_iter->rec && |
| 865 | + ftrace_in_iter->last_rec_ts < ns_from_orig_pos) { |
| 866 | + tracecmd_free_record(ftrace_in_iter->rec); |
| 867 | + |
| 868 | + ftrace_in_iter->rec = tracecmd_read_data( |
| 869 | + ftrace_in_iter->ftrace_in->tc_input, ftrace_in_iter->cpu_id); |
| 870 | + if (supports_discarded_events && ftrace_in_iter->rec) { |
| 871 | + ftrace_in_iter->events_discarded = |
| 872 | + ftrace_in_iter->rec->missed_events; |
| 873 | + } |
| 874 | + } |
| 875 | + } else { |
| 876 | + return BT_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_ERROR; |
| 877 | + } |
| 878 | + |
| 879 | + return BT_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_OK; |
| 880 | +} |
| 881 | + |
| 882 | +bt_message_iterator_class_can_seek_ns_from_origin_method_status |
| 883 | +ftrace_in_message_iterator_can_seek_ns_from_origin( |
| 884 | + bt_self_message_iterator *self_message_iterator, int64_t ns_from_origin, |
| 885 | + bt_bool *can_seek) |
| 886 | +{ |
| 887 | + struct ftrace_in_message_iterator *ftrace_in_iter = |
| 888 | + bt_self_message_iterator_get_data(self_message_iterator); |
| 889 | + /* we can only seek forward */ |
| 890 | + if (ns_from_origin < 0 || |
| 891 | + ftrace_in_iter->last_rec_ts > (uint64_t)ns_from_origin) { |
| 892 | + BT_FTRACE_LOG_DEBUG(ftrace_in_iter->ftrace_in->log_level, |
| 893 | + "cannot seek backwards"); |
| 894 | + *can_seek = BT_FALSE; |
| 895 | + } else { |
| 896 | + *can_seek = BT_TRUE; |
| 897 | + } |
| 898 | + return BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_OK; |
| 899 | +} |
| 900 | + |
810 | 901 | bt_component_class_get_supported_mip_versions_method_status |
811 | 902 | ftrace_get_supported_mip_versions( |
812 | 903 | bt_self_component_class_source *const self_component_class, |
|
0 commit comments