From 43c59509042845f8d42c3e99ec74d45fa2dc0908 Mon Sep 17 00:00:00 2001 From: Philippe Proulx Date: Sat, 21 Sep 2019 12:02:25 -0400 Subject: [PATCH] Document libbabeltrace2's C API This patch adds initial documentation for the Babeltrace 2 library's C API using Doxygen. The Doxygen project is located in `doc/api/libbabeltrace2`, as we can eventually add `doc/api/libbabeltrace2-ctf-writer`. To be able to use Doxygen's member grouping [1], I had to join some header files (`const` and non `const` headers, for example), because otherwise I could not get some functions in separate files to be in the same member group in the order I want. In the end, the library user includes ``, so how we organize the headers exactly is not so crucial. [1]: http://www.doxygen.nl/manual/grouping.html#memgroup Signed-off-by: Philippe Proulx Change-Id: I6d1dc2e7c5ee63fcd4220d0fd9f0931d361d2f31 Reviewed-on: https://review.lttng.org/c/babeltrace/+/2807 Tested-by: jenkins --- .gitignore | 1 - configure.ac | 5 +- doc/api/.gitignore | 1 - doc/api/Doxyfile.in | 239 - doc/api/DoxygenLayout.xml | 194 - doc/api/Makefile.am | 18 +- doc/api/README.adoc | 351 -- doc/api/dox/examples-ctfir.dox | 139 - doc/api/dox/examples.dox | 7 - doc/api/dox/group-api-ref.dox | 30 - doc/api/dox/group-ctf-ir.dox | 21 - doc/api/dox/includes-build.dox | 74 - doc/api/dox/main-page.dox | 136 - doc/api/dox/quick-start.dox | 6 - doc/api/images/babeltrace-cli.png | Bin 34774 -> 0 bytes doc/api/images/ctf-stream-packet.png | Bin 21843 -> 0 bytes doc/api/images/ctf-trace.png | Bin 16038 -> 0 bytes doc/api/images/ref-count-api-returns.png | Bin 9263 -> 0 bytes doc/api/images/ref-count-callback.png | Bin 16398 -> 0 bytes doc/api/images/ref-count-user-calls.png | Bin 9768 -> 0 bytes doc/api/libbabeltrace2/.gitignore | 3 + doc/api/libbabeltrace2/Doxyfile.in | 776 +++ doc/api/libbabeltrace2/DoxygenLayout.xml | 46 + doc/api/libbabeltrace2/Makefile.am | 19 + doc/api/libbabeltrace2/README.adoc | 386 ++ doc/api/libbabeltrace2/dox/api-fund.dox | 569 ++ doc/api/libbabeltrace2/dox/examples.dox | 233 + doc/api/libbabeltrace2/dox/group-trace-ir.dox | 108 + doc/api/libbabeltrace2/dox/guides.dox | 211 + doc/api/libbabeltrace2/dox/main-page.dox | 124 + doc/api/libbabeltrace2/examples/distill.c | 284 + doc/api/libbabeltrace2/examples/dust | 5 + doc/api/libbabeltrace2/examples/dust.c | 436 ++ doc/api/libbabeltrace2/examples/epitome.c | 196 + .../libbabeltrace2/examples/vestige-plugin.c | 45 + .../images/all-field-classes.png | Bin 0 -> 49187 bytes doc/api/libbabeltrace2/images/all-fields.png | Bin 0 -> 48842 bytes .../images/basic-convert-graph.png | Bin 0 -> 26459 bytes .../images/clock-terminology.png | Bin 0 -> 22008 bytes doc/api/libbabeltrace2/images/clocks.png | Bin 0 -> 23381 bytes .../libbabeltrace2/images/complex-graph.png | Bin 0 -> 14255 bytes .../libbabeltrace2/images/component-zoom.png | Bin 0 -> 9207 bytes doc/api/libbabeltrace2/images/component.png | Bin 0 -> 10844 bytes doc/api/libbabeltrace2/images/darray-link.png | Bin 0 -> 26549 bytes .../images/error-reporting-step-5.png | Bin 0 -> 14117 bytes .../images/error-reporting-step-6.png | Bin 0 -> 16801 bytes .../images/error-reporting-step-7.png | Bin 0 -> 18867 bytes .../images/error-reporting-steps-1234.png | Bin 0 -> 13408 bytes .../images/error-reporting-steps-89.png | Bin 0 -> 24022 bytes .../libbabeltrace2/images/error-reporting.png | Bin 0 -> 87984 bytes doc/api/libbabeltrace2/images/fc-array.png | Bin 0 -> 8285 bytes doc/api/libbabeltrace2/images/fc-ba.png | Bin 0 -> 1784 bytes doc/api/libbabeltrace2/images/fc-bool.png | Bin 0 -> 1733 bytes doc/api/libbabeltrace2/images/fc-enum.png | Bin 0 -> 9292 bytes doc/api/libbabeltrace2/images/fc-int.png | Bin 0 -> 4515 bytes doc/api/libbabeltrace2/images/fc-opt.png | Bin 0 -> 12642 bytes doc/api/libbabeltrace2/images/fc-real.png | Bin 0 -> 4638 bytes doc/api/libbabeltrace2/images/fc-string.png | Bin 0 -> 1696 bytes doc/api/libbabeltrace2/images/fc-struct.png | Bin 0 -> 1773 bytes doc/api/libbabeltrace2/images/fc-to-field.png | Bin 0 -> 58514 bytes doc/api/libbabeltrace2/images/fc-var.png | Bin 0 -> 10678 bytes .../images/field-class-zoom.png | Bin 0 -> 2165 bytes .../libbabeltrace2/images/graph-lifetime.png | Bin 0 -> 22938 bytes doc/api/libbabeltrace2/images/linking.png | Bin 0 -> 11577 bytes .../libbabeltrace2/images/msg-iter-cls.png | Bin 0 -> 3813 bytes .../images/msg-iter-complex.png | Bin 0 -> 41207 bytes doc/api/libbabeltrace2/images/msg-iter.png | Bin 0 -> 18606 bytes doc/api/libbabeltrace2/images/opt-link.png | Bin 0 -> 15219 bytes .../images/plugin-comp-cls-full.png | Bin 0 -> 38037 bytes doc/api/libbabeltrace2/images/plugin.png | Bin 0 -> 17936 bytes .../images/trace-structure-msg-seq.png | Bin 0 -> 17122 bytes .../libbabeltrace2/images/trace-structure.png | Bin 0 -> 28357 bytes doc/api/libbabeltrace2/images/var-link.png | Bin 0 -> 20946 bytes doc/api/libbabeltrace2/style.css | 79 + include/Makefile.am | 79 +- include/babeltrace2/babeltrace.h | 126 +- include/babeltrace2/current-thread.h | 102 - include/babeltrace2/error-cause-const.h | 117 - include/babeltrace2/error-const.h | 53 - include/babeltrace2/error-reporting.h | 1471 ++++++ .../babeltrace2/graph/component-class-const.h | 101 - .../babeltrace2/graph/component-class-dev.h | 2225 ++++++++ .../graph/component-class-filter-const.h | 67 - .../graph/component-class-filter.h | 121 - .../graph/component-class-sink-const.h | 67 - .../babeltrace2/graph/component-class-sink.h | 142 - .../graph/component-class-source-const.h | 67 - .../graph/component-class-source.h | 110 - include/babeltrace2/graph/component-class.h | 896 +++- include/babeltrace2/graph/component-const.h | 103 - .../graph/component-descriptor-set-const.h | 59 - .../graph/component-descriptor-set.h | 251 +- .../graph/component-filter-const.h | 94 - .../babeltrace2/graph/component-sink-const.h | 83 - .../graph/component-source-const.h | 83 - include/babeltrace2/graph/component.h | 1280 +++++ include/babeltrace2/graph/connection-const.h | 63 - include/babeltrace2/graph/connection.h | 210 + include/babeltrace2/graph/graph-const.h | 57 - include/babeltrace2/graph/graph.h | 1964 ++++++- include/babeltrace2/graph/interrupter-const.h | 59 - include/babeltrace2/graph/interrupter.h | 246 + include/babeltrace2/graph/message-const.h | 79 - .../graph/message-discarded-events-const.h | 58 - .../graph/message-discarded-events.h | 57 - .../graph/message-discarded-packets-const.h | 58 - .../graph/message-discarded-packets.h | 57 - .../babeltrace2/graph/message-event-const.h | 50 - include/babeltrace2/graph/message-event.h | 69 - .../graph/message-iterator-class.h | 1231 ++++- include/babeltrace2/graph/message-iterator.h | 876 +++- ...essage-message-iterator-inactivity-const.h | 44 - .../message-message-iterator-inactivity.h | 47 - .../graph/message-packet-beginning-const.h | 51 - .../graph/message-packet-beginning.h | 55 - .../graph/message-packet-end-const.h | 51 - .../babeltrace2/graph/message-packet-end.h | 55 - .../graph/message-stream-beginning-const.h | 52 - .../graph/message-stream-beginning.h | 52 - .../babeltrace2/graph/message-stream-const.h | 43 - .../graph/message-stream-end-const.h | 52 - .../babeltrace2/graph/message-stream-end.h | 52 - include/babeltrace2/graph/message.h | 3223 ++++++++++++ include/babeltrace2/graph/mip.h | 56 - include/babeltrace2/graph/port-const.h | 88 - include/babeltrace2/graph/port-input-const.h | 65 - include/babeltrace2/graph/port-output-const.h | 65 - include/babeltrace2/graph/port.h | 673 +++ .../graph/private-query-executor.h | 61 + .../babeltrace2/graph/query-executor-const.h | 63 - include/babeltrace2/graph/query-executor.h | 524 +- .../graph/self-component-class-filter.h | 57 - .../graph/self-component-class-sink.h | 56 - .../graph/self-component-class-source.h | 57 - .../babeltrace2/graph/self-component-class.h | 224 + .../babeltrace2/graph/self-component-filter.h | 90 - .../graph/self-component-port-input.h | 55 - .../graph/self-component-port-output.h | 55 - .../babeltrace2/graph/self-component-port.h | 229 +- .../babeltrace2/graph/self-component-sink.h | 76 - .../babeltrace2/graph/self-component-source.h | 74 - include/babeltrace2/graph/self-component.h | 835 ++- .../babeltrace2/graph/self-message-iterator.h | 202 +- include/babeltrace2/integer-range-set-const.h | 133 - include/babeltrace2/integer-range-set.h | 744 ++- include/babeltrace2/logging.h | 224 +- include/babeltrace2/plugin/plugin-const.h | 164 - include/babeltrace2/plugin/plugin-dev.h | 3457 ++++++++---- include/babeltrace2/plugin/plugin-loading.h | 1432 +++++ include/babeltrace2/plugin/plugin-set-const.h | 65 - include/babeltrace2/property.h | 43 - .../babeltrace2/trace-ir/clock-class-const.h | 93 - include/babeltrace2/trace-ir/clock-class.h | 939 +++- .../trace-ir/clock-snapshot-const.h | 58 - include/babeltrace2/trace-ir/clock-snapshot.h | 228 + .../babeltrace2/trace-ir/event-class-const.h | 103 - include/babeltrace2/trace-ir/event-class.h | 987 +++- include/babeltrace2/trace-ir/event-const.h | 58 - include/babeltrace2/trace-ir/event.h | 335 +- .../babeltrace2/trace-ir/field-class-const.h | 313 -- include/babeltrace2/trace-ir/field-class.h | 4636 ++++++++++++++++- include/babeltrace2/trace-ir/field-const.h | 118 - .../babeltrace2/trace-ir/field-path-const.h | 87 - include/babeltrace2/trace-ir/field-path.h | 471 ++ include/babeltrace2/trace-ir/field.h | 1447 ++++- include/babeltrace2/trace-ir/packet-const.h | 67 - include/babeltrace2/trace-ir/packet.h | 293 ++ .../babeltrace2/trace-ir/stream-class-const.h | 121 - include/babeltrace2/trace-ir/stream-class.h | 1767 ++++++- include/babeltrace2/trace-ir/stream-const.h | 72 - include/babeltrace2/trace-ir/stream.h | 611 ++- .../babeltrace2/trace-ir/trace-class-const.h | 98 - include/babeltrace2/trace-ir/trace-class.h | 627 ++- include/babeltrace2/trace-ir/trace-const.h | 107 - include/babeltrace2/trace-ir/trace.h | 915 +++- include/babeltrace2/types.h | 141 +- include/babeltrace2/util.h | 100 +- include/babeltrace2/value-const.h | 214 - include/babeltrace2/value.h | 2405 ++++++++- include/babeltrace2/version.h | 68 + src/bindings/python/bt2/bt2/native_bt.i | 4 +- .../python/bt2/bt2/native_bt_clock_class.i | 1 - .../python/bt2/bt2/native_bt_clock_snapshot.i | 2 +- .../python/bt2/bt2/native_bt_component.i | 8 +- .../bt2/bt2/native_bt_component_class.i | 12 +- .../python/bt2/bt2/native_bt_connection.i | 2 +- src/bindings/python/bt2/bt2/native_bt_error.i | 4 +- src/bindings/python/bt2/bt2/native_bt_event.i | 1 - .../python/bt2/bt2/native_bt_event_class.i | 1 - src/bindings/python/bt2/bt2/native_bt_field.i | 1 - .../python/bt2/bt2/native_bt_field_class.i | 5 +- .../python/bt2/bt2/native_bt_field_path.i | 2 +- src/bindings/python/bt2/bt2/native_bt_graph.i | 1 - .../bt2/bt2/native_bt_integer_range_set.i | 1 - .../python/bt2/bt2/native_bt_interrupter.i | 1 - .../python/bt2/bt2/native_bt_message.i | 19 +- src/bindings/python/bt2/bt2/native_bt_mip.i | 3 +- .../python/bt2/bt2/native_bt_packet.i | 1 - .../python/bt2/bt2/native_bt_plugin.i | 3 +- src/bindings/python/bt2/bt2/native_bt_port.i | 6 +- .../python/bt2/bt2/native_bt_query_exec.i | 1 - .../python/bt2/bt2/native_bt_stream.i | 1 - .../python/bt2/bt2/native_bt_stream_class.i | 1 - src/bindings/python/bt2/bt2/native_bt_trace.i | 1 - .../python/bt2/bt2/native_bt_trace_class.i | 1 - src/bindings/python/bt2/bt2/native_bt_value.i | 1 - src/cli/babeltrace2-cfg-cli-args.h | 2 +- src/lib/graph/component-class-sink-simple.c | 4 +- src/lib/graph/component-class-sink-simple.h | 2 +- src/lib/graph/component-class.c | 7 - src/lib/graph/component-class.h | 5 +- src/lib/graph/component-descriptor-set.c | 1 - src/lib/graph/component-filter.c | 4 +- src/lib/graph/component-filter.h | 2 +- src/lib/graph/component-sink.c | 4 +- src/lib/graph/component-sink.h | 2 +- src/lib/graph/component-source.c | 4 +- src/lib/graph/component.c | 7 +- src/lib/graph/component.h | 2 +- src/lib/graph/connection.c | 2 +- src/lib/graph/connection.h | 2 +- src/lib/graph/graph.c | 7 +- src/lib/graph/graph.h | 2 +- src/lib/graph/iterator.c | 31 +- src/lib/graph/message/discarded-items.c | 4 - src/lib/graph/message/discarded-items.h | 2 +- src/lib/graph/message/event.c | 3 +- src/lib/graph/message/iterator.h | 4 +- .../message/message-iterator-inactivity.c | 3 +- .../message/message-iterator-inactivity.h | 2 +- src/lib/graph/message/message.c | 3 +- src/lib/graph/message/message.h | 2 +- src/lib/graph/message/packet.c | 5 +- src/lib/graph/message/stream.c | 7 +- src/lib/graph/message/stream.h | 2 +- src/lib/graph/mip.c | 2 +- src/lib/graph/port.c | 6 +- src/lib/graph/port.h | 2 +- src/lib/graph/query-executor.c | 3 +- src/lib/plugin/plugin-so.c | 3 - src/lib/plugin/plugin.c | 6 +- src/lib/plugin/plugin.h | 2 +- src/lib/trace-ir/attributes.c | 2 +- src/lib/trace-ir/clock-class.c | 1 - src/lib/trace-ir/clock-snapshot.c | 2 +- src/lib/trace-ir/event-class.c | 1 - src/lib/trace-ir/event.c | 3 +- src/lib/trace-ir/field-class.c | 2 - src/lib/trace-ir/field-path.c | 2 +- src/lib/trace-ir/field-path.h | 2 +- src/lib/trace-ir/field.c | 1 - src/lib/trace-ir/packet.c | 1 - src/lib/trace-ir/packet.h | 2 +- src/lib/trace-ir/resolve-field-path.c | 2 +- src/lib/trace-ir/resolve-field-path.h | 4 +- src/lib/trace-ir/stream-class.c | 2 +- src/lib/trace-ir/stream.c | 1 - src/lib/trace-ir/trace-class.c | 2 - src/lib/trace-ir/trace.c | 2 - .../lttng-utils/debug-info/trace-ir-mapping.c | 2 - .../python-plugin-provider.c | 4 +- 261 files changed, 40308 insertions(+), 8661 deletions(-) delete mode 100644 doc/api/.gitignore delete mode 100644 doc/api/Doxyfile.in delete mode 100644 doc/api/DoxygenLayout.xml delete mode 100644 doc/api/README.adoc delete mode 100644 doc/api/dox/examples-ctfir.dox delete mode 100644 doc/api/dox/examples.dox delete mode 100644 doc/api/dox/group-api-ref.dox delete mode 100644 doc/api/dox/group-ctf-ir.dox delete mode 100644 doc/api/dox/includes-build.dox delete mode 100644 doc/api/dox/main-page.dox delete mode 100644 doc/api/dox/quick-start.dox delete mode 100644 doc/api/images/babeltrace-cli.png delete mode 100644 doc/api/images/ctf-stream-packet.png delete mode 100644 doc/api/images/ctf-trace.png delete mode 100644 doc/api/images/ref-count-api-returns.png delete mode 100644 doc/api/images/ref-count-callback.png delete mode 100644 doc/api/images/ref-count-user-calls.png create mode 100644 doc/api/libbabeltrace2/.gitignore create mode 100644 doc/api/libbabeltrace2/Doxyfile.in create mode 100644 doc/api/libbabeltrace2/DoxygenLayout.xml create mode 100644 doc/api/libbabeltrace2/Makefile.am create mode 100644 doc/api/libbabeltrace2/README.adoc create mode 100644 doc/api/libbabeltrace2/dox/api-fund.dox create mode 100644 doc/api/libbabeltrace2/dox/examples.dox create mode 100644 doc/api/libbabeltrace2/dox/group-trace-ir.dox create mode 100644 doc/api/libbabeltrace2/dox/guides.dox create mode 100644 doc/api/libbabeltrace2/dox/main-page.dox create mode 100644 doc/api/libbabeltrace2/examples/distill.c create mode 100644 doc/api/libbabeltrace2/examples/dust create mode 100644 doc/api/libbabeltrace2/examples/dust.c create mode 100644 doc/api/libbabeltrace2/examples/epitome.c create mode 100644 doc/api/libbabeltrace2/examples/vestige-plugin.c create mode 100644 doc/api/libbabeltrace2/images/all-field-classes.png create mode 100644 doc/api/libbabeltrace2/images/all-fields.png create mode 100644 doc/api/libbabeltrace2/images/basic-convert-graph.png create mode 100644 doc/api/libbabeltrace2/images/clock-terminology.png create mode 100644 doc/api/libbabeltrace2/images/clocks.png create mode 100644 doc/api/libbabeltrace2/images/complex-graph.png create mode 100644 doc/api/libbabeltrace2/images/component-zoom.png create mode 100644 doc/api/libbabeltrace2/images/component.png create mode 100644 doc/api/libbabeltrace2/images/darray-link.png create mode 100644 doc/api/libbabeltrace2/images/error-reporting-step-5.png create mode 100644 doc/api/libbabeltrace2/images/error-reporting-step-6.png create mode 100644 doc/api/libbabeltrace2/images/error-reporting-step-7.png create mode 100644 doc/api/libbabeltrace2/images/error-reporting-steps-1234.png create mode 100644 doc/api/libbabeltrace2/images/error-reporting-steps-89.png create mode 100644 doc/api/libbabeltrace2/images/error-reporting.png create mode 100644 doc/api/libbabeltrace2/images/fc-array.png create mode 100644 doc/api/libbabeltrace2/images/fc-ba.png create mode 100644 doc/api/libbabeltrace2/images/fc-bool.png create mode 100644 doc/api/libbabeltrace2/images/fc-enum.png create mode 100644 doc/api/libbabeltrace2/images/fc-int.png create mode 100644 doc/api/libbabeltrace2/images/fc-opt.png create mode 100644 doc/api/libbabeltrace2/images/fc-real.png create mode 100644 doc/api/libbabeltrace2/images/fc-string.png create mode 100644 doc/api/libbabeltrace2/images/fc-struct.png create mode 100644 doc/api/libbabeltrace2/images/fc-to-field.png create mode 100644 doc/api/libbabeltrace2/images/fc-var.png create mode 100644 doc/api/libbabeltrace2/images/field-class-zoom.png create mode 100644 doc/api/libbabeltrace2/images/graph-lifetime.png create mode 100644 doc/api/libbabeltrace2/images/linking.png create mode 100644 doc/api/libbabeltrace2/images/msg-iter-cls.png create mode 100644 doc/api/libbabeltrace2/images/msg-iter-complex.png create mode 100644 doc/api/libbabeltrace2/images/msg-iter.png create mode 100644 doc/api/libbabeltrace2/images/opt-link.png create mode 100644 doc/api/libbabeltrace2/images/plugin-comp-cls-full.png create mode 100644 doc/api/libbabeltrace2/images/plugin.png create mode 100644 doc/api/libbabeltrace2/images/trace-structure-msg-seq.png create mode 100644 doc/api/libbabeltrace2/images/trace-structure.png create mode 100644 doc/api/libbabeltrace2/images/var-link.png create mode 100644 doc/api/libbabeltrace2/style.css delete mode 100644 include/babeltrace2/current-thread.h delete mode 100644 include/babeltrace2/error-cause-const.h delete mode 100644 include/babeltrace2/error-const.h create mode 100644 include/babeltrace2/error-reporting.h delete mode 100644 include/babeltrace2/graph/component-class-const.h create mode 100644 include/babeltrace2/graph/component-class-dev.h delete mode 100644 include/babeltrace2/graph/component-class-filter-const.h delete mode 100644 include/babeltrace2/graph/component-class-filter.h delete mode 100644 include/babeltrace2/graph/component-class-sink-const.h delete mode 100644 include/babeltrace2/graph/component-class-sink.h delete mode 100644 include/babeltrace2/graph/component-class-source-const.h delete mode 100644 include/babeltrace2/graph/component-class-source.h delete mode 100644 include/babeltrace2/graph/component-const.h delete mode 100644 include/babeltrace2/graph/component-descriptor-set-const.h delete mode 100644 include/babeltrace2/graph/component-filter-const.h delete mode 100644 include/babeltrace2/graph/component-sink-const.h delete mode 100644 include/babeltrace2/graph/component-source-const.h create mode 100644 include/babeltrace2/graph/component.h delete mode 100644 include/babeltrace2/graph/connection-const.h create mode 100644 include/babeltrace2/graph/connection.h delete mode 100644 include/babeltrace2/graph/graph-const.h delete mode 100644 include/babeltrace2/graph/interrupter-const.h delete mode 100644 include/babeltrace2/graph/message-const.h delete mode 100644 include/babeltrace2/graph/message-discarded-events-const.h delete mode 100644 include/babeltrace2/graph/message-discarded-events.h delete mode 100644 include/babeltrace2/graph/message-discarded-packets-const.h delete mode 100644 include/babeltrace2/graph/message-discarded-packets.h delete mode 100644 include/babeltrace2/graph/message-event-const.h delete mode 100644 include/babeltrace2/graph/message-event.h delete mode 100644 include/babeltrace2/graph/message-message-iterator-inactivity-const.h delete mode 100644 include/babeltrace2/graph/message-message-iterator-inactivity.h delete mode 100644 include/babeltrace2/graph/message-packet-beginning-const.h delete mode 100644 include/babeltrace2/graph/message-packet-beginning.h delete mode 100644 include/babeltrace2/graph/message-packet-end-const.h delete mode 100644 include/babeltrace2/graph/message-packet-end.h delete mode 100644 include/babeltrace2/graph/message-stream-beginning-const.h delete mode 100644 include/babeltrace2/graph/message-stream-beginning.h delete mode 100644 include/babeltrace2/graph/message-stream-const.h delete mode 100644 include/babeltrace2/graph/message-stream-end-const.h delete mode 100644 include/babeltrace2/graph/message-stream-end.h create mode 100644 include/babeltrace2/graph/message.h delete mode 100644 include/babeltrace2/graph/mip.h delete mode 100644 include/babeltrace2/graph/port-const.h delete mode 100644 include/babeltrace2/graph/port-input-const.h delete mode 100644 include/babeltrace2/graph/port-output-const.h create mode 100644 include/babeltrace2/graph/port.h delete mode 100644 include/babeltrace2/graph/query-executor-const.h delete mode 100644 include/babeltrace2/graph/self-component-class-filter.h delete mode 100644 include/babeltrace2/graph/self-component-class-sink.h delete mode 100644 include/babeltrace2/graph/self-component-class-source.h delete mode 100644 include/babeltrace2/graph/self-component-filter.h delete mode 100644 include/babeltrace2/graph/self-component-port-input.h delete mode 100644 include/babeltrace2/graph/self-component-port-output.h delete mode 100644 include/babeltrace2/graph/self-component-sink.h delete mode 100644 include/babeltrace2/graph/self-component-source.h delete mode 100644 include/babeltrace2/integer-range-set-const.h delete mode 100644 include/babeltrace2/plugin/plugin-const.h create mode 100644 include/babeltrace2/plugin/plugin-loading.h delete mode 100644 include/babeltrace2/plugin/plugin-set-const.h delete mode 100644 include/babeltrace2/property.h delete mode 100644 include/babeltrace2/trace-ir/clock-class-const.h delete mode 100644 include/babeltrace2/trace-ir/clock-snapshot-const.h create mode 100644 include/babeltrace2/trace-ir/clock-snapshot.h delete mode 100644 include/babeltrace2/trace-ir/event-class-const.h delete mode 100644 include/babeltrace2/trace-ir/event-const.h delete mode 100644 include/babeltrace2/trace-ir/field-class-const.h delete mode 100644 include/babeltrace2/trace-ir/field-const.h delete mode 100644 include/babeltrace2/trace-ir/field-path-const.h create mode 100644 include/babeltrace2/trace-ir/field-path.h delete mode 100644 include/babeltrace2/trace-ir/packet-const.h delete mode 100644 include/babeltrace2/trace-ir/stream-class-const.h delete mode 100644 include/babeltrace2/trace-ir/stream-const.h delete mode 100644 include/babeltrace2/trace-ir/trace-class-const.h delete mode 100644 include/babeltrace2/trace-ir/trace-const.h delete mode 100644 include/babeltrace2/value-const.h diff --git a/.gitignore b/.gitignore index f6ae6ec3..16baf519 100644 --- a/.gitignore +++ b/.gitignore @@ -61,7 +61,6 @@ __pycache__ /src/babeltrace2-ctf-writer.pc TAGS cscope* -doc/api/Doxyfile *.gcno *.gcda *.gcov diff --git a/configure.ac b/configure.ac index 7cbe3ba7..6bbedb03 100644 --- a/configure.ac +++ b/configure.ac @@ -563,7 +563,7 @@ AS_IF([test "x$enable_api_doc" = "xyes"], DX_XML_FEATURE(OFF) DX_PDF_FEATURE(OFF) DX_PS_FEATURE(OFF) - DX_INIT_DOXYGEN([Babeltrace], [$(srcdir)/Doxyfile], [output]) + DX_INIT_DOXYGEN([Babeltrace 2], [$(builddir)/Doxyfile], [output]) AS_IF([test -z "$DX_DOXYGEN"], [AC_MSG_ERROR([You need doxygen to enable the API documentation])] ) @@ -724,8 +724,9 @@ program_transform_name="s&babeltrace2\.bin&babeltrace2&;$program_transform_name" AC_SUBST(program_transform_name) AC_CONFIG_FILES([ - doc/api/Doxyfile doc/api/Makefile + doc/api/libbabeltrace2/Doxyfile + doc/api/libbabeltrace2/Makefile doc/bindings/Makefile doc/bindings/python/Makefile doc/contributing-images/Makefile diff --git a/doc/api/.gitignore b/doc/api/.gitignore deleted file mode 100644 index 6caf68af..00000000 --- a/doc/api/.gitignore +++ /dev/null @@ -1 +0,0 @@ -output \ No newline at end of file diff --git a/doc/api/Doxyfile.in b/doc/api/Doxyfile.in deleted file mode 100644 index 376888ce..00000000 --- a/doc/api/Doxyfile.in +++ /dev/null @@ -1,239 +0,0 @@ -DOXYFILE_ENCODING = UTF-8 -PROJECT_NAME = "Babeltrace C API" -PROJECT_NUMBER = @PACKAGE_VERSION@ -PROJECT_BRIEF = "Trace converter with plugin support" -CREATE_SUBDIRS = NO -ALLOW_UNICODE_NAMES = NO -OUTPUT_LANGUAGE = English -BRIEF_MEMBER_DESC = YES -REPEAT_BRIEF = YES -ALWAYS_DETAILED_SEC = NO -INLINE_INHERITED_MEMB = NO -FULL_PATH_NAMES = YES -STRIP_FROM_PATH = "@top_srcdir@/include" -STRIP_FROM_INC_PATH = -SHORT_NAMES = NO -JAVADOC_AUTOBRIEF = NO -QT_AUTOBRIEF = NO -MULTILINE_CPP_IS_BRIEF = YES -INHERIT_DOCS = YES -SEPARATE_MEMBER_PAGES = NO -TAB_SIZE = 4 -ALIASES = -ALIASES += btversion="@PACKAGE_VERSION@" -ALIASES += postsuccessrefcountretinc="@post On success, the reference count of the returned object is incremented." -ALIASES += postsuccessrefcountret1="@post On success, the reference count of the returned object is 1." -ALIASES += postsuccessrefcountinc{1}="@post On success, the reference count of \p \1 is incremented." -ALIASES += postrefcountsame{1}="@post The reference count of \p \1 is not modified." -ALIASES += postsuccessfrozen{1}="@post On success, \p \1 is frozen." -ALIASES += prenotnull{1}="@pre \p \1 is not \c NULL." -ALIASES += prehot{1}="@pre \p \1 is not frozen." -ALIASES += preisintft{1}="@pre \p \1 is a \link ctfirintfieldtype CTF IR integer field type\endlink." -ALIASES += preisfloatft{1}="@pre \p \1 is a \link ctfirfloatfieldtype CTF IR floating point number field type\endlink." -ALIASES += preisenumft{1}="@pre \p \1 is a \link ctfirenumfieldtype CTF IR enumeration field type\endlink." -ALIASES += preisstringft{1}="@pre \p \1 is a \link ctfirstringfieldtype CTF IR string field type\endlink." -ALIASES += preisstructft{1}="@pre \p \1 is a \link ctfirstructfieldtype CTF IR structure field type\endlink." -ALIASES += preisarrayft{1}="@pre \p \1 is a \link ctfirarrayfieldtype CTF IR array field type\endlink." -ALIASES += preisseqft{1}="@pre \p \1 is a \link ctfirseqfieldtype CTF IR sequence field type\endlink." -ALIASES += preisvarft{1}="@pre \p \1 is a \link ctfirvarfieldtype CTF IR variant field type\endlink." -ALIASES += preisintfield{1}="@pre \p \1 is a \link ctfirintfield CTF IR integer field\endlink." -ALIASES += preisfloatfield{1}="@pre \p \1 is a \link ctfirfloatfield CTF IR floating point number field\endlink." -ALIASES += preisenumfield{1}="@pre \p \1 is a \link ctfirenumfield CTF IR enumeration field\endlink." -ALIASES += preisstringfield{1}="@pre \p \1 is a \link ctfirstringfield CTF IR string field\endlink." -ALIASES += preisstructfield{1}="@pre \p \1 is a \link ctfirstructfield CTF IR structure field\endlink." -ALIASES += preisarrayfield{1}="@pre \p \1 is a \link ctfirarrayfield CTF IR array field\endlink." -ALIASES += preisseqfield{1}="@pre \p \1 is a \link ctfirseqfield CTF IR sequence field\endlink." -ALIASES += preisvarfield{1}="@pre \p \1 is a \link ctfirvarfield CTF IR variant field\endlink." -ALIASES += ft="\link ctfirfieldtypes CTF IR field type\endlink" -ALIASES += fts="\link ctfirfieldtypes CTF IR field types\endlink" -ALIASES += intft="\link ctfirintfieldtype CTF IR integer field type\endlink" -ALIASES += floatft="\link ctfirfloatfieldtype CTF IR floating point number field type\endlink" -ALIASES += enumft="\link ctfirenumfieldtype CTF IR enumeration field type\endlink" -ALIASES += enumftiter="\link ctfirenumftmappingiter CTF IR enumeration field type mapping iterator\endlink" -ALIASES += stringft="\link ctfirstringfieldtype CTF IR string field type\endlink" -ALIASES += structft="\link ctfirstructfieldtype CTF IR structure field type\endlink" -ALIASES += arrayft="\link ctfirarrayfieldtype CTF IR array field type\endlink" -ALIASES += seqft="\link ctfirseqfieldtype CTF IR sequence field type\endlink" -ALIASES += varft="\link ctfirvarfieldtype CTF IR variant field type\endlink" -ALIASES += intfts="\link ctfirintfieldtype CTF IR integer field types\endlink" -ALIASES += floatfts="\link ctfirfloatfieldtype CTF IR floating point number field types\endlink" -ALIASES += enumfts="\link ctfirenumfieldtype CTF IR enumeration field types\endlink" -ALIASES += stringfts="\link ctfirstringfieldtype CTF IR string field types\endlink" -ALIASES += structfts="\link ctfirstructfieldtype CTF IR structure field types\endlink" -ALIASES += arrayfts="\link ctfirarrayfieldtype CTF IR array field types\endlink" -ALIASES += seqfts="\link ctfirseqfieldtype CTF IR sequence field types\endlink" -ALIASES += varfts="\link ctfirvarfieldtype CTF IR variant field types\endlink" -ALIASES += field="\link ctfirfields CTF IR field\endlink" -ALIASES += fields="\link ctfirfields CTF IR fields\endlink" -ALIASES += intfield="\link ctfirintfield CTF IR integer field\endlink" -ALIASES += floatfield="\link ctfirfloatfield CTF IR floating point number field\endlink" -ALIASES += enumfield="\link ctfirenumfield CTF IR enumeration field\endlink" -ALIASES += stringfield="\link ctfirstringfield CTF IR string field\endlink" -ALIASES += structfield="\link ctfirstructfield CTF IR structure field\endlink" -ALIASES += arrayfield="\link ctfirarrayfield CTF IR array field\endlink" -ALIASES += seqfield="\link ctfirseqfield CTF IR sequence field\endlink" -ALIASES += varfield="\link ctfirvarfield CTF IR variant field\endlink" -ALIASES += intfields="\link ctfirintfield CTF IR integer fields\endlink" -ALIASES += floatfields="\link ctfirfloatfield CTF IR floating point number fields\endlink" -ALIASES += enumfields="\link ctfirenumfield CTF IR enumeration fields\endlink" -ALIASES += stringfields="\link ctfirstringfield CTF IR string fields\endlink" -ALIASES += structfields="\link ctfirstructfield CTF IR structure fields\endlink" -ALIASES += arrayfields="\link ctfirarrayfield CTF IR array fields\endlink" -ALIASES += seqfields="\link ctfirseqfield CTF IR sequence fields\endlink" -ALIASES += varfields="\link ctfirvarfield CTF IR variant fields\endlink" -ALIASES += imgpacketstructure="@image html ctf-stream-packet.png \"Structure of a CTF packet.\"" -ALIASES += imgtracestructure="@image html ctf-trace.png \"Structure of a CTF trace.\"" -ALIASES += noteexamplesassert="@note In the following examples, we use \c assert() to validate the results of the called functions." -OPTIMIZE_OUTPUT_FOR_C = YES -MARKDOWN_SUPPORT = YES -TOC_INCLUDE_HEADINGS = 0 -AUTOLINK_SUPPORT = YES -SUBGROUPING = YES -INLINE_GROUPED_CLASSES = NO -INLINE_SIMPLE_STRUCTS = NO -TYPEDEF_HIDES_STRUCT = NO -LOOKUP_CACHE_SIZE = 0 - -EXTRACT_ALL = NO -EXTRACT_PRIVATE = NO -EXTRACT_PACKAGE = NO -EXTRACT_STATIC = YES -EXTRACT_LOCAL_CLASSES = YES -EXTRACT_LOCAL_METHODS = NO -EXTRACT_ANON_NSPACES = NO -HIDE_UNDOC_MEMBERS = YES -HIDE_UNDOC_CLASSES = YES -HIDE_FRIEND_COMPOUNDS = NO -HIDE_IN_BODY_DOCS = YES -INTERNAL_DOCS = NO -CASE_SENSE_NAMES = NO -HIDE_SCOPE_NAMES = NO -HIDE_COMPOUND_REFERENCE= NO -SHOW_INCLUDE_FILES = NO -SHOW_GROUPED_MEMB_INC = NO -FORCE_LOCAL_INCLUDES = NO -INLINE_INFO = YES -SORT_MEMBER_DOCS = NO -SORT_BRIEF_DOCS = NO -SORT_MEMBERS_CTORS_1ST = NO -SORT_GROUP_NAMES = NO -SORT_BY_SCOPE_NAME = NO -STRICT_PROTO_MATCHING = NO -GENERATE_TODOLIST = YES -GENERATE_TESTLIST = YES -GENERATE_BUGLIST = YES -GENERATE_DEPRECATEDLIST= YES -ENABLED_SECTIONS = -MAX_INITIALIZER_LINES = 30 -SHOW_USED_FILES = YES -SHOW_FILES = YES -SHOW_NAMESPACES = NO -FILE_VERSION_FILTER = -LAYOUT_FILE = "@srcdir@/DoxygenLayout.xml" -CITE_BIB_FILES = - -QUIET = NO -WARNINGS = YES -WARN_IF_UNDOCUMENTED = YES -WARN_IF_DOC_ERROR = YES -WARN_NO_PARAMDOC = YES -WARN_AS_ERROR = NO -WARN_FORMAT = "$file:$line: $text" -WARN_LOGFILE = - -INPUT = "@top_srcdir@/include/babeltrace2/ctf-ir" \ - "@top_srcdir@/include/babeltrace2/component" \ - "@top_srcdir@/include/babeltrace2/plugin" \ - "@top_srcdir@/include/babeltrace2/ref.h" \ - "@top_srcdir@/include/babeltrace2/values.h" \ - "@top_srcdir@/include/babeltrace2/logging.h" \ - "@top_srcdir@/include/babeltrace2/types.h" \ - "@srcdir@/dox/main-page.dox" \ - "@srcdir@/dox/includes-build.dox" \ - "@srcdir@/dox/write-plugin.dox" \ - "@srcdir@/dox/use-ctf-writer.dox" \ - "@srcdir@/dox/examples.dox" \ - "@srcdir@/dox/examples-ctfir.dox" \ - "@srcdir@/dox/group-api-ref.dox" \ - "@srcdir@/dox/group-ctf-ir.dox" -INPUT_ENCODING = UTF-8 -FILE_PATTERNS = *.h \ - *.hh \ - *.hpp \ - *.dox -RECURSIVE = NO -EXCLUDE = -EXCLUDE_SYMLINKS = NO -EXCLUDE_PATTERNS = -EXCLUDE_SYMBOLS = -EXAMPLE_PATH = -EXAMPLE_PATTERNS = * -EXAMPLE_RECURSIVE = NO -IMAGE_PATH = "@srcdir@/images" -INPUT_FILTER = -FILTER_PATTERNS = -FILTER_SOURCE_FILES = NO -FILTER_SOURCE_PATTERNS = -USE_MDFILE_AS_MAINPAGE = - -SOURCE_BROWSER = NO -INLINE_SOURCES = NO -STRIP_CODE_COMMENTS = YES -REFERENCED_BY_RELATION = NO -REFERENCES_RELATION = NO -REFERENCES_LINK_SOURCE = YES -SOURCE_TOOLTIPS = YES -USE_HTAGS = NO -VERBATIM_HEADERS = YES - -ALPHABETICAL_INDEX = YES -COLS_IN_ALPHA_INDEX = 5 -IGNORE_PREFIX = - -OUTPUT_DIRECTORY = output - -GENERATE_HTML = YES -HTML_FILE_EXTENSION = .html -HTML_HEADER = -HTML_FOOTER = -HTML_STYLESHEET = -HTML_EXTRA_STYLESHEET = -HTML_EXTRA_FILES = -HTML_COLORSTYLE_HUE = 220 -HTML_COLORSTYLE_SAT = 100 -HTML_COLORSTYLE_GAMMA = 80 -HTML_TIMESTAMP = YES -HTML_DYNAMIC_SECTIONS = YES -HTML_INDEX_NUM_ENTRIES = 100 - -GENERATE_DOCSET = NO -GENERATE_HTMLHELP = NO -GENERATE_CHI = NO -GENERATE_QHP = NO -GENERATE_ECLIPSEHELP = NO - -DISABLE_INDEX = NO -GENERATE_TREEVIEW = YES -ENUM_VALUES_PER_LINE = 4 -TREEVIEW_WIDTH = 250 -EXT_LINKS_IN_WINDOW = NO -FORMULA_FONTSIZE = 10 -FORMULA_TRANSPARENT = YES -USE_MATHJAX = NO -MATHJAX_FORMAT = HTML-CSS -MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest -MATHJAX_EXTENSIONS = -MATHJAX_CODEFILE = -SEARCHENGINE = YES -SERVER_BASED_SEARCH = NO -EXTERNAL_SEARCH = NO -SEARCHENGINE_URL = -SEARCHDATA_FILE = searchdata.xml -EXTERNAL_SEARCH_ID = -EXTRA_SEARCH_MAPPINGS = - -GENERATE_LATEX = NO -GENERATE_RTF = NO -GENERATE_MAN = NO -GENERATE_XML = NO -GENERATE_PERLMOD = NO diff --git a/doc/api/DoxygenLayout.xml b/doc/api/DoxygenLayout.xml deleted file mode 100644 index 0881dc84..00000000 --- a/doc/api/DoxygenLayout.xml +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc/api/Makefile.am b/doc/api/Makefile.am index c84bb770..18aeeba3 100644 --- a/doc/api/Makefile.am +++ b/doc/api/Makefile.am @@ -1,17 +1 @@ -API_DOC_INSTALL_DIR = "$(DESTDIR)$(docdir)/api" - -all-local: doxygen-doc - -install-data-local: doxygen-doc - $(mkdir_p) "$(API_DOC_INSTALL_DIR)" - cp -rv output/html "$(API_DOC_INSTALL_DIR)" - -@DX_RULES@ - -MOSTLYCLEANFILES = $(DX_CLEANFILES) -EXTRA_DIST = Doxyfile.in \ - README.adoc \ - dox/group-api-ref.dox \ - dox/group-ctf-ir.dox \ - dox/main-page.dox \ - dox/quick-start.dox +SUBDIRS = libbabeltrace2 diff --git a/doc/api/README.adoc b/doc/api/README.adoc deleted file mode 100644 index 3e6ce69f..00000000 --- a/doc/api/README.adoc +++ /dev/null @@ -1,351 +0,0 @@ -= Babeltrace C API documentation guidelines - -Please follow those guidelines when you add to or modify the existing -documentation of the Babeltrace C API. - - -== Syntax - -Syntax example to document a function (tabs are converted to spaces -in this example, but you really _must_ use tabs to indent): - ----- -/** -@brief Sets the name of the CTF IR stream class \p stream_class - to \p name. - -\p name must be unique amongst the names of all the stream classes -of the trace class to which you eventually add \p stream_class. - -@remarks -This is where you would put some remarks. Lorem ipsum dolor sit amet, -consectetur adipiscing elit. Vestibulum sagittis tristique velit vitae -tincidunt. - -@warning -Use a warning command if this message is really important. - -@param[in] stream_class Stream class of which to set the name. -@param[in] name Name of the stream class (copied on success). If - the description is too long, continue on the - next line like this. -@returns 0 on success, or a negative value on error. - -@prenotnull{stream_class} -@prenotnull{name} -@prehot{stream_class} -@pre Some custom precondition. -@postrefcountsame{stream_class} -@post Some custom postcondition. - -@sa btstream_class_get_name(): Returns the name of a given stream class. -*/ ----- - -**Rules**: - -* Try to stay behind the 72th column mark if possible, and behind the - 80th column otherwise. - -* Start the block with - https://www.stack.nl/\~dimitri/doxygen/manual/commands.html#cmdbrief[`@brief`] - followed by a tab followed by the brief description. If the brief - description needs more than one line, start the following lines with a - tab character. -+ -Try to always refer to all the function or macro parameters in the brief -description. The sentence _must_ begin with a verb, third-person -singular. The brief description _must_ contain a single sentence -which ends with a period. -+ -Follow the brief description by zero or more paragraphs giving more -details about the object you are documenting. -+ -You can also use the -https://www.stack.nl/\~dimitri/doxygen/manual/commands.html#cmdremark[`@remarks`] -and -https://www.stack.nl/\~dimitri/doxygen/manual/commands.html#cmdwarning[`@warning`] -commands as needed to add special paragraphs. - -* When you refer to parameters, use the - https://www.stack.nl/\~dimitri/doxygen/manual/commands.html#cmdp[`\p`] - command: -+ --- ----- -@brief Transfers the ownership of a Babeltrace object from variable - \p _var_src to variable \p _var_dst. ----- --- - -* When you refer to any keyword or definition, use the - https://www.stack.nl/\~dimitri/doxygen/manual/commands.html#cmdc[`\c`] - command if it's a single word, otherwise surround the words with - `` and ``: -+ --- ----- -@returns Event class on success, or \c NULL on error. ----- --- - -* Add a new line before the parameter descriptions. - -* The syntax for a parameter line is one of: -+ --- ----- -@param[in] in_param Input parameter description. -@param[out] out_param Output parameter description. -@param[in,out] inout_param Input/output parameter description. ----- --- -+ -That is: -+ --- -. https://www.stack.nl/\~dimitri/doxygen/manual/commands.html#cmdparam[`@param`] -. `[in]` (input parameter), `[out]` (output parameter), or `[in,out]` - (input/output parameter). -+ -Output and input/output parameters are -always pointers where, for a parameter named `param`, a result is -stored _into_ `*param`. - -. A space. -. The name of the parameter. -. At least one tab. -. The description which ends with a period. --- -+ -Make sure all the beginnings of the parameter descriptions and of the -return value description are vertically aligned by using as many tabs as -required. -+ -If more than one line is needed, align the beginning of the second line -with the beginning of the first one (see the return value description in -the example above). - -* The syntax for the return value line is: -+ --- -. https://www.stack.nl/\~dimitri/doxygen/manual/commands.html#cmdreturns[`@returns`] - (_not_ `@return`). -. At least one tab. -. The description which ends with a period. --- -+ -The return value description often takes the form: -+ --- ----- -X on success, or Y on error. ----- --- - -* When needed, add an empty line after the return value line and add - preconditions and postconditions with the - https://www.stack.nl/\~dimitri/doxygen/manual/commands.html#cmdpre[`@pre`] - and - https://www.stack.nl/\~dimitri/doxygen/manual/commands.html#cmdpost[`@post`] - commands on the following lines. -+ -Preconditions are a very clear way to indicate what the documented -function or macro expects from the user in relation to its parameters. -+ -Postconditions are a very clear way to indicate what the user should -expect from the documented function or macro once it returns. -+ -Use complete sentences, starting with a capital letter and ending with -a period, when writing conditions. Use the present tense. If there's a -conditional part, put it in bold at the beginning of the sentence. -+ -If the condition is too long for a single line, continue on the -following line, after a tab. -+ -Examples: -+ --- ----- -@pre The size of \p array_obj is equal to the size of \p map_obj. -@post On success, the reference count of \p array_obj - is incremented. -@post The reference count of \p map_obj is not modified. ----- --- -+ -IMPORTANT: You should use aliases when possible to avoid duplication. -See the list of available aliases in the `Doxyfile.in` file. - -* When relevant, add a new line after the return value line (or after - the precondition or postcondition lines, if any) and add - as many _see also_ links as needed on the following lines. -+ -The syntax of those lines is: -+ --- -. https://www.stack.nl/\~dimitri/doxygen/manual/commands.html#cmdsa[`@sa`] -. A single space. -. The name of the function, macro, variable, group, file, or page name - to see also. -. `:` (colon). -. A single space. -. The capitalized brief description which ends with a period. The - sentence _must_ begin with a verb, third-person singular. --- -+ -This is a way for you to inform the reader about other existing, related -functions, macros, or any other documentation. Keep in mind that the -reader does not always know where to look for things. -+ -If the description is too long for a single line, continue on the -following line, after a tab: -+ --- ----- -@sa some_function() Lorem ipsum dolor sit amet, consectetur adipiscing - cras iaculis lectus quis dolor congue tempor. ----- --- - -* Always prefer the `@` commands to the `\` commands when you use them - outside of the text itself. - - -== Style - -The ultimate goal of the Babeltrace C API documentation is to make the -layman write code using this API as fast as possible without having to -ask for help. For this purpose, the documentation should always be as -clear as possible, just like the function and type names try to be. - -Do not hesitate to repeat technical terms, even in the same sentence, if -needed. For example, if you document a _value object_, then always use -the term _value object_ in the documentation, not _value_, nor _object_, -since they are ambiguous. - -You can use light emphasis to show the importance of a part of the text -with the -https://www.stack.nl/\~dimitri/doxygen/manual/commands.html#cmdem[`\em`] -command (one word) or by surrounding the text to emphasize with `` -and ``. Likewise, you can use strong emphasis when needed with the -https://www.stack.nl/\~dimitri/doxygen/manual/commands.html#cmdb[`\b`] -command (one word) or with ``/``. In general, prefer -light emphasis to strong emphasis. - -Links to other parts of the documentation are very important. Consider -that the reader never knows that other functions exist other than the -current one. Use as many internal links as possible. Use the following -forms of links: - -* `func()`: automatic link to the function (or macro) `func()`. -* `file.h`: automatic link to the file named `file.h`. -* https://www.stack.nl/\~dimitri/doxygen/manual/commands.html#cmdref[`\ref - group`]: link to the - https://www.stack.nl/\~dimitri/doxygen/manual/grouping.html[group] - named `group` (prefer this over a link to a file). -* https://www.stack.nl/\~dimitri/doxygen/manual/commands.html#cmdref[`\ref - variable`]: link to the variable `variable`. -* https://www.stack.nl/\~dimitri/doxygen/manual/commands.html#cmdlink[`\link - reference some text\endlink`]: link to `reference` (file name, group - name, function or macro name, etc.) using the text `some text`. -+ -Example: -+ --- ----- -You can create a \link events CTF IR event\endlink using [...] -By calling \link func() said function\endlink, [...] ----- --- -+ --- -[NOTE] -.Doxygen limitation. -==== -Do not put a space between the end of the text and the `\endlink` -command, because this space becomes part of the hyperlink's text. - -Do _not_ do: - ----- -You can create a \link events CTF IR event \endlink using [...] -By calling \link func() said function \endlink, [...] ----- -==== --- - -See Doxygen's -https://www.stack.nl/\~dimitri/doxygen/manual/autolink.html[Automatic -link generation] for other ways to create automatic links. - -Try to follow as much as possible the -https://en.wikipedia.org/wiki/Microsoft_Manual_of_Style[Microsoft Manual of Style] -(4th edition) when you document the API. This includes: - -* Use an active voice. -* Use a gender-neutral language. -* Use the present tense (you should never need the future tense). -* Address your reader directly (use _you_). -* Avoid anthropomorphism. -* Ensure parallelism in lists, procedures, and sentences. -* Terminate list items with a period. -* Do not use Latin abbreviations. -* Use _and_ or _or_ instead of a slash. -* Avoid using negatives. -* Avoid using _should_: most of the time, you mean _must_. - - -== Babeltrace terminology - -Here are the official names of the Babeltrace objects that you must use -as is in the API documentation: - -* Value objects: -** The null value object (_the_, not _a_, since it's a singleton - variable) -** Boolean value object -** Integer value object -** Floating point number value object -** String value object -** Array value object -** Map value object -* CTF IR field path object -* CTF IR field types -** CTF IR integer field type -** CTF IR floating point number field type -** CTF IR enumeration field type -** CTF IR string field type -** CTF IR array field type -** CTF IR sequence field type -** CTF IR structure field type -** CTF IR variant field type -* CTF IR fields: -** CTF IR integer field -** CTF IR floating point number field -** CTF IR enumeration field -** CTF IR string field -** CTF IR array field -** CTF IR sequence field -** CTF IR structure field -** CTF IR variant field -* CTF IR clock class -* CTF IR event class -* CTF IR stream class -* CTF IR trace class -* CTF IR event -* CTF IR packet -* CTF IR stream -* CTF IR writer -* Component -* Source component -* Sink component -* Component class -* Source component class -* Sink component class -* Plugin -* Notification -* Iterator - -Note that once you mention _CTF IR_ in an object name, you can omit -it in the few following paragraphs. diff --git a/doc/api/dox/examples-ctfir.dox b/doc/api/dox/examples-ctfir.dox deleted file mode 100644 index 3c1850d3..00000000 --- a/doc/api/dox/examples-ctfir.dox +++ /dev/null @@ -1,139 +0,0 @@ -/** -@page ctfirexamples CTF IR examples - -List of CTF IR examples: - -- @subpage ctfirfieldtypesexamples CTF IR field types examples - -@sa ctfir (API reference) - - -@page ctfirfieldtypesexamples CTF IR field types examples - -This page contains usage examples of the \ref ctfirfieldtypes API. - -@noteexamplesassert - - -@section ctfirfieldtypesexamples_intfieldtype Integer field type - -@sa ctfirintfieldtype - -@subsection ctfirfieldtypesexamples_intfieldtype0 Create a default, 16-bit integer field type - -@code{.c} -#include -#include - -struct bt_field_type *create_int_field_type(void) -{ - struct bt_field_type *field_type; - - field_type = bt_field_type_integer_create(16); - assert(field_type); - - return field_type; -} -@endcode - -@subsection ctfirfieldtypesexamples_intfieldtype1 Create a 23-bit, signed, big-endian integer field type - -@code{.c} -#include -#include - -struct bt_field_type *create_int_field_type(void) -{ - int ret; - struct bt_field_type *field_type; - - field_type = bt_field_type_integer_create(23); - assert(field_type); - - ret = bt_field_type_set_byte_order(field_type, - BT_BYTE_ORDER_BIG_ENDIAN); - assert(ret == 0); - - ret = bt_field_type_integer_set_signed(field_type, 1); - assert(ret == 0); - - return field_type; -} -@endcode - -@subsection ctfirfieldtypesexamples_intfieldtype2 Create an 8-bit integer field type, displayed in hexadecimal, mapped to a CTF IR clock class - -@code{.c} -#include -#include - -struct bt_field_type *create_int_field_type( - struct bt_clock_class *clock_class) -{ - int ret; - struct bt_field_type *field_type; - - field_type = bt_field_type_integer_create(8); - assert(field_type); - - ret = bt_field_type_integer_set_base(field_type, - BT_INTEGER_BASE_HEXADECIMAL); - assert(ret == 0); - - ret = bt_field_type_integer_set_mapped_clock(field_type, clock_class); - assert(ret == 0); - - return field_type; -} -@endcode - - -@section ctfirfieldtypesexamples_floatfieldtype Floating point number field type - -@sa ctfirfloatfieldtype - -@subsection ctfirfieldtypesexamples_floatfieldtype0 Create a default floating point number field type - -@code{.c} -#include -#include - -struct bt_field_type *create_float_field_type(void) -{ - struct bt_field_type *field_type; - - field_type = bt_field_type_floating_point_create(); - assert(field_type); - - return field_type; -} -@endcode - -@subsection ctfirfieldtypesexamples_floatfieldtype1 Create a "double", little-endian floating point number field type - -@code{.c} -#include -#include - -struct bt_field_type *create_float_field_type(void) -{ - int ret; - struct bt_field_type *field_type; - - field_type = bt_field_type_floating_point_create(); - assert(field_type); - - ret = bt_field_type_set_byte_order(field_type, - BT_BYTE_ORDER_LITTLE_ENDIAN); - assert(ret == 0); - - ret = bt_field_type_floating_point_set_exponent_digits(field_type, 11); - assert(ret == 0); - - ret = bt_field_type_floating_point_set_mantissa_digits(field_type, 53); - assert(ret == 0); - - return field_type; -} -@endcode -*/ diff --git a/doc/api/dox/examples.dox b/doc/api/dox/examples.dox deleted file mode 100644 index 34691ad4..00000000 --- a/doc/api/dox/examples.dox +++ /dev/null @@ -1,7 +0,0 @@ -/** -@page examples Examples - -List of examples: - -- @subpage ctfirexamples CTF IR examples -*/ diff --git a/doc/api/dox/group-api-ref.dox b/doc/api/dox/group-api-ref.dox deleted file mode 100644 index 23a838cb..00000000 --- a/doc/api/dox/group-api-ref.dox +++ /dev/null @@ -1,30 +0,0 @@ -/** -@defgroup apiref API reference -@brief Babeltrace C API reference. - -This module and its submodules accurately document the C API of the -Babeltrace library (v\btversion). See the \ref writeplugin and -\ref usectfwriter pages for official, procedural user guides to help -you get started with this API. See \ref examples for informal examples. - -The API is divided into the following modules: - -- \ref refs contains the macros and functions that you can use - to manage the reference count of Babeltrace objects. -- \ref values is a set of generic value objects which are used at - various locations of the API. -- \ref ctfir is an internal representation of the - CTF model which Babeltrace - uses as a common foundation between trace formats. -- \ref btcomponents is the Babeltrace component API. A component is an - instance of a specific component class within a trace conversion - graph of connected iterators. -- \ref ctfwriter is an API to write concrete CTF traces to the - file system. - -All the functions and macros documented here indicate their -\em preconditions and \em postconditions. Unless there is an -unexpected error (out of memory, resource not available, bug, etc.), -if you honor the preconditions when you call a function, you are -guaranteed that this function in turn honors the postconditions. -*/ diff --git a/doc/api/dox/group-ctf-ir.dox b/doc/api/dox/group-ctf-ir.dox deleted file mode 100644 index f7878da1..00000000 --- a/doc/api/dox/group-ctf-ir.dox +++ /dev/null @@ -1,21 +0,0 @@ -/** -@defgroup ctfir CTF IR -@ingroup apiref -@brief Common Trace Format Intermediate Representation. - -The Common Trace Format Intermediate Representation, -or CTF IR, is the representation of the -CTF model within Babeltrace. - -As with any Babeltrace object, all the CTF IR objects have -reference -counts. See \ref refs to learn more about the reference counting -management of Babeltrace objects. - -When the documentation says that a given -\link ctfirfieldtypes CTF IR field type\endlink must be -equivalent to another one, it means that -bt_field_type_compare() \em must return 0. - -@sa \ref ctfirexamples "Examples" -*/ diff --git a/doc/api/dox/includes-build.dox b/doc/api/dox/includes-build.dox deleted file mode 100644 index f7b42c1a..00000000 --- a/doc/api/dox/includes-build.dox +++ /dev/null @@ -1,74 +0,0 @@ -/** -@page includesbuild Include files and how to build - -@section includefiles Include files - -You can find all the Babeltrace library include files (C headers) in the -\c babeltrace2 directory under the include files directory chosen when -installing Babeltrace. By default, this is /usr/include. -If you build Babeltrace from source without specifying an installation -prefix, this is /usr/local/include. - -The documentation modules in \ref apiref always show which header file -to include to use the documented functions and types. - -You can also use the "master" include file which provides everything, -but which necessarily makes the compilation slower: - -@code -#include -@endcode - -@section howtobuild How to build - -Multiple types of applications can use the Babeltrace library: - -- A user plugin (shared object) to be loaded by the \c babeltrace2 - converter program or by another application. -- A user application or library which loads plugins to manually connect - existing components in a specific way. -- A user application or library which creates its own component classes - and manually connects them. - -In any way, the only library to link to is `libbabeltrace2`. - -@subsection howtobuildplugin Build a plugin - -To build a user plugin: - -
    -
  1. Compile the source files which form your plugin: - -@verbatim -cc -c -fpic my-plugin.c -@endverbatim -
  2. - -
  3. Create the plugin shared object: - -@verbatim -cc -shared my-plugin.o -lbabeltrace2 -o my-plugin.so -@endverbatim -
  4. -
- -@subsection howtobuildapp Build an application - -To build an application which uses the Babeltrace library: - -
    -
  1. Compile the source files which form your application: - -@verbatim -cc -c my-app.c -@endverbatim -
  2. - -
  3. Create the executable application: - -@verbatim -cc my-app.o -lbabeltrace2 -o my-app -@endverbatim -
  4. -
-*/ diff --git a/doc/api/dox/main-page.dox b/doc/api/dox/main-page.dox deleted file mode 100644 index edc79d48..00000000 --- a/doc/api/dox/main-page.dox +++ /dev/null @@ -1,136 +0,0 @@ -/** -@mainpage Welcome! - -Welcome to the -Babeltrace \btversion C API documentation! - -Babeltrace is an open -source converter of -trace -formats. You can use its C API to -write custom source, sink, and filter -\link btcomponents component classes\endlink which you can package as user -\link btplugins plugins\endlink. - - -@section intro What's this API for? - -The goal of using this API is to create user -\link btplugins plugins\endlink. - -A Babeltrace plugin contains one or more -\link btcomponents component classes\endlink. - -A component class is either: - -- A \b source component class: creates producers of trace - events. -- A \b sink component class: creates consumers of trace events. -- A \b filter component class: creates components which are both a - producers and consumers of trace events. - -A program or library can instantiate as many concrete \em components as -needed from a single component class. At component instantiation time, -the component class's registered user initialization function is called -with custom user parameters. - -Plugins, as of Babeltrace \btversion, are built as dynamic libraries -(.so or .dll files) and loaded by the \c -babeltrace converter program. You can also get plugin objects from a -shared object file or from a directory containing shared object files -thanks to the C API. The converter program is responsible for passing -notifications and events from source components to filter components, if -any, and from filter components to sink components. - -@image html babeltrace-cli.png - -@section mainpagectfir CTF IR - -The internal representations of a trace, a stream, and an event follow -the Common Trace Format model. -Within the Babeltrace C API, this representation is called the -Common Trace Format Intermediate Representation, or -\link ctfir CTF IR\endlink. CTF IR is flexible enough to represent -almost any trace or logging format. - -The CTF IR model contains the following objects, amongst others: - -- A \link ctfirfieldtypes field type\endlink is the type of concrete - \link ctfirfields fields\endlink. - - For example, an integer field type contains the size (in bits) of the - integer fields it creates, as well as their byte order, whether or not - they are signed, and so on. An integer field that you create out of an - integer field type, however, only contains a raw integral value. You - can create many fields from a single field type. - -- An \link ctfireventclass event class\endlink is the type of - a concrete \link ctfirevent event\endlink. - - An event class contains the field types of its various scopes, while - an event contains the actual fields holding their values. - -- A \link ctfirstreamclass stream class\endlink is the type of - a concrete \link ctfirstream stream\endlink. - - A stream class contains the field types of its various scopes, while - \link ctfirpacket packets\endlink attached to a - \link ctfirstream stream\endlink instantiated from a - stream class contains the actual - fields holding their values.

A stream class is the parent of one or - more event classes. - - -- A \link ctfirtraceclass trace class\endlink describes traces. - - A trace class is the parent of one or more stream classes. - -- A \link ctfirclockclass clock class\endlink holds the common - properties of clock values that are instantiated in \link ctfirevent - events\endlink. - -@section mainpagevalues Value objects - -Some parts of the Babeltrace API require typical, generic scalar values -(boolean, integer, floating point number, string) organized in compound -objects (array, map). This is similar to the model that -JSON offers. - -For example, the environment of a -\link ctfirtraceclass CTF IR trace class\endlink maps strings to strings -or to integers, and the parameters passed to component instances take -the form of a map. - -For this purpose, the API uses -\link values value objects\endlink. - -@section mainpageref Reference counting - -All the Babeltrace objects have a -reference count -to make them shareable. -When you use a Babeltrace object creation function (for example, -bt_value_bool_create()), you get a new reference to the created -object. When you add this object to another one, the latter takes its -own reference using bt_get(), incrementing the shared object's reference -count. When you are done with an object, you must call bt_put() to drop -your reference, decrementing its reference count. When an object's -reference count reaches 0, the object is considered \em destroyed and -cannot be used anymore. - -See \ref refs for more details. - -The postconditions of the functions and macros documented here indicate -what you can expect from the reference counts of the Babeltrace objects -passed as parameters to and returned from API functions. - -@section mainpagefreeze Frozen objects - -The Babeltrace library can \em freeze almost all of the Babeltrace -objects. A frozen object is considered \em immutable, although you can -still get and put references to this object. - -The preconditions of the functions and macros documented here indicate -when they expect unfrozen objects. The postconditions indicate when -the functions and macros freeze an object. -*/ diff --git a/doc/api/dox/quick-start.dox b/doc/api/dox/quick-start.dox deleted file mode 100644 index 662bbc58..00000000 --- a/doc/api/dox/quick-start.dox +++ /dev/null @@ -1,6 +0,0 @@ -/** -@page quickstart Quick start -@tableofcontents - -lol lol -*/ diff --git a/doc/api/images/babeltrace-cli.png b/doc/api/images/babeltrace-cli.png deleted file mode 100644 index e21dc538cd0f3756bc54a28d4ef84c8607ce074c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34774 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 X@bbnoPCuK4IpcxaV1V<1_Q}$oVXv+K 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 diff --git a/doc/api/images/ctf-stream-packet.png b/doc/api/images/ctf-stream-packet.png deleted file mode 100644 index 0c41fcfb015d5f7ad2afef0fcc09d07ea4a9b155..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21843 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 Mx@&+e(|8#AKeclho&W#< diff --git a/doc/api/images/ctf-trace.png b/doc/api/images/ctf-trace.png deleted file mode 100644 index 64a389c21b9bfc3ef57de7d8699b019ebfc7dfa2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16038 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 diff --git a/doc/api/images/ref-count-callback.png b/doc/api/images/ref-count-callback.png deleted file mode 100644 index 4e758627cce6620e1d6700821b219da91aa47a16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16398 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\1" +ALIASES += bt_dt_opt="Optional:" +ALIASES += bt_man{2}="\1(\2)" +ALIASES += bt_cli="babeltrace2" +ALIASES += bt_voidp="void *" + +# Aliases: preconditions: general +ALIASES += bt_pre_not_null{1}="@pre \bt_p{\1} is \em not \c NULL." +ALIASES += bt_pre_hot{1}="@pre \bt_p{\1} is \em not \link api-fund-freezing frozen\endlink." +ALIASES += bt_pre_assign_expr{1}="@pre \bt_p{\1} is an assignable expression." +ALIASES += bt_pre_valid_fmt{1}="@pre \bt_p{\1} is a valid printf()-like format string." +ALIASES += bt_pre_fc_not_in_tc{1}="@pre \bt_p{\1} is not already part of another field class, an \bt_ev_cls, or a \bt_stream_cls." + +# Aliases: postconditions +ALIASES += bt_post_success_frozen{1}="@post On success, \bt_p{\1} is \link api-fund-freezing frozen\endlink." +ALIASES += bt_post_no_error="@post The current thread has no \link api-error error\endlink." + +# Aliases: preconditions: graph +ALIASES += bt_pre_graph_not_configured{1}="@pre \bt_p{\1} is \em not completely \link api-graph-lc configured\endlink yet (you didn't call bt_graph_run() or bt_graph_run_once() with it)." +ALIASES += bt_pre_graph_not_faulty{1}="@pre \bt_p{\1} is \em not faulty: no previous \link api-graph-lc-add component adding\endlink or component \link api-graph-lc-connect port connecting\endlink functions failed with it." +ALIASES += bt_pre_hot{1}="@pre \bt_p{\1} is \em not \link api-fund-freezing frozen\endlink." +ALIASES += bt_pre_assign_expr{1}="@pre \bt_p{\1} is an assignable expression." +ALIASES += bt_pre_valid_fmt{1}="@pre \bt_p{\1} is a valid printf()-like format string." +ALIASES += bt_pre_fc_not_in_tc{1}="@pre \bt_p{\1} is not already part of another field class, an \bt_ev_cls, or a \bt_stream_cls." + +# Aliases: preconditions: field class object type +ALIASES += bt_pre_is_ba_fc{1}="@pre \bt_p{\1} is a \link api-tir-fc-ba bit array field class\endlink." +ALIASES += bt_pre_is_bool_fc{1}="@pre \bt_p{\1} is a \link api-tir-fc-bool boolean field class\endlink." +ALIASES += bt_pre_is_int_fc{1}="@pre \bt_p{\1} is an \link api-tir-fc-int integer field class\endlink." +ALIASES += bt_pre_is_real_fc{1}="@pre \bt_p{\1} is a \link api-tir-fc-real real field class\endlink." +ALIASES += bt_pre_is_enum_fc{1}="@pre \bt_p{\1} is an \link api-tir-fc-enum enumeration field class\endlink." +ALIASES += bt_pre_is_uenum_fc{1}="@pre \bt_p{\1} is an unsigned \link api-tir-fc-enum enumeration field class\endlink." +ALIASES += bt_pre_is_senum_fc{1}="@pre \bt_p{\1} is a signed \link api-tir-fc-enum enumeration field class\endlink." +ALIASES += bt_pre_is_string_fc{1}="@pre \bt_p{\1} is a \link api-tir-fc-string string field class\endlink." +ALIASES += bt_pre_is_struct_fc{1}="@pre \bt_p{\1} is a \link api-tir-fc-struct structure field class\endlink." +ALIASES += bt_pre_is_array_fc{1}="@pre \bt_p{\1} is an array \link api-tir-fc-array field class\endlink." +ALIASES += bt_pre_is_sarray_fc{1}="@pre \bt_p{\1} is a static \link api-tir-fc-array array field class\endlink." +ALIASES += bt_pre_is_darray_fc{1}="@pre \bt_p{\1} is a dynamic \link api-tir-fc-array array field class\endlink." +ALIASES += bt_pre_is_darray_wl_fc{1}="@pre \bt_p{\1} is a dynamic \link api-tir-fc-array array field class\endlink (with a length field)." +ALIASES += bt_pre_is_opt_fc{1}="@pre \bt_p{\1} is an \link api-tir-fc-opt option field class\endlink." +ALIASES += bt_pre_is_opt_ws_fc{1}="@pre \bt_p{\1} is an \link api-tir-fc-opt option field class\endlink (with a selector field)." +ALIASES += bt_pre_is_opt_wbs_fc{1}="@pre \bt_p{\1} is an \link api-tir-fc-opt option field class\endlink (with a boolean selector field)." +ALIASES += bt_pre_is_opt_wsis_fc{1}="@pre \bt_p{\1} is an \link api-tir-fc-opt option field class\endlink (with a signed integer selector field)." +ALIASES += bt_pre_is_opt_wuis_fc{1}="@pre \bt_p{\1} is an \link api-tir-fc-opt option field class\endlink (with an unsigned integer selector field)." +ALIASES += bt_pre_is_var_fc{1}="@pre \bt_p{\1} is a \link api-tir-fc-var variant field class\endlink." +ALIASES += bt_pre_is_var_wos_fc{1}="@pre \bt_p{\1} is a \link api-tir-fc-var variant field class\endlink (without a selector field)." +ALIASES += bt_pre_is_var_ws_fc{1}="@pre \bt_p{\1} is a \link api-tir-fc-var variant field class\endlink (with a selector field)." +ALIASES += bt_pre_is_var_wuis_fc{1}="@pre \bt_p{\1} is a \link api-tir-fc-var variant field class\endlink (with an unsigned integer selector field)." +ALIASES += bt_pre_is_var_wsis_fc{1}="@pre \bt_p{\1} is a \link api-tir-fc-var variant field class\endlink (with a signed integer selector field)." + +# Aliases: preconditions: field object type +ALIASES += bt_pre_is_ba_field{1}="@pre \bt_p{\1} is a \link api-tir-field-ba bit array field\endlink." +ALIASES += bt_pre_is_bool_field{1}="@pre \bt_p{\1} is a \link api-tir-field-bool boolean field\endlink." +ALIASES += bt_pre_is_sint_field{1}="@pre \bt_p{\1} is a signed \link api-tir-field-int integer field\endlink." +ALIASES += bt_pre_is_uint_field{1}="@pre \bt_p{\1} is an unsigned \link api-tir-field-int integer field\endlink." +ALIASES += bt_pre_is_sreal_field{1}="@pre \bt_p{\1} is a single-precision \link api-tir-field-real real field\endlink." +ALIASES += bt_pre_is_dreal_field{1}="@pre \bt_p{\1} is a double-precision \link api-tir-field-real real field\endlink." +ALIASES += bt_pre_is_enum_field{1}="@pre \bt_p{\1} is an \link api-tir-field-enum enumeration field\endlink." +ALIASES += bt_pre_is_uenum_field{1}="@pre \bt_p{\1} is an unsigned \link api-tir-field-enum enumeration field\endlink." +ALIASES += bt_pre_is_senum_field{1}="@pre \bt_p{\1} is a signed \link api-tir-field-enum enumeration field\endlink." +ALIASES += bt_pre_is_string_field{1}="@pre \bt_p{\1} is a \link api-tir-field-string string field\endlink." +ALIASES += bt_pre_is_struct_field{1}="@pre \bt_p{\1} is a \link api-tir-field-struct structure field\endlink." +ALIASES += bt_pre_is_array_field{1}="@pre \bt_p{\1} is an \link api-tir-field-array array field\endlink." +ALIASES += bt_pre_is_sarray_field{1}="@pre \bt_p{\1} is a static \link api-tir-field-array array field\endlink." +ALIASES += bt_pre_is_darray_field{1}="@pre \bt_p{\1} is a dynamic \link api-tir-field-array array field\endlink." +ALIASES += bt_pre_is_opt_field{1}="@pre \bt_p{\1} is an \link api-tir-field-opt option field\endlink." +ALIASES += bt_pre_is_var_field{1}="@pre \bt_p{\1} is a \link api-tir-field-var variant field\endlink." +ALIASES += bt_pre_is_var_wuis_field{1}="@pre \bt_p{\1} is a \link api-tir-field-var variant field\endlink (with an unsigned integer selector field)." +ALIASES += bt_pre_is_var_wsis_field{1}="@pre \bt_p{\1} is a \link api-tir-field-var variant field\endlink (with a signed integer selector field)." + +# Aliases: preconditions: value object type +ALIASES += bt_pre_is_null_val{1}="@pre \bt_p{\1} is a null \link api-val value\endlink (\bt_p{\1} is equal to #bt_value_null)." +ALIASES += bt_pre_is_bool_val{1}="@pre \bt_p{\1} is a boolean \link api-val value\endlink (bt_value_is_bool() returns #BT_TRUE)." +ALIASES += bt_pre_is_sint_val{1}="@pre \bt_p{\1} is a signed integer \link api-val value\endlink (bt_value_is_signed_integer() returns #BT_TRUE)." +ALIASES += bt_pre_is_uint_val{1}="@pre \bt_p{\1} is an unsigned integer \link api-val value\endlink (bt_value_is_unsigned_integer() returns #BT_TRUE)." +ALIASES += bt_pre_is_real_val{1}="@pre \bt_p{\1} is a real \link api-val value\endlink (bt_value_is_real() returns #BT_TRUE)." +ALIASES += bt_pre_is_string_val{1}="@pre \bt_p{\1} is a string \link api-val value\endlink (bt_value_is_string() returns #BT_TRUE)." +ALIASES += bt_pre_is_array_val{1}="@pre \bt_p{\1} is an array \link api-val value\endlink (bt_value_is_array() returns #BT_TRUE)." +ALIASES += bt_pre_is_map_val{1}="@pre \bt_p{\1} is a map \link api-val value\endlink (bt_value_is_map() returns #BT_TRUE)." + +# Aliases: preconditions: message object type +ALIASES += bt_pre_is_disc_ev_msg{1}="@pre \bt_p{\1} is a \link api-msg-disc-ev discarded events message\endlink." +ALIASES += bt_pre_is_disc_pkt_msg{1}="@pre \bt_p{\1} is a \link api-msg-disc-pkt discarded packets message\endlink." +ALIASES += bt_pre_is_ev_msg{1}="@pre \bt_p{\1} is an \link api-msg-ev event message\endlink." +ALIASES += bt_pre_is_inac_msg{1}="@pre \bt_p{\1} is a \link api-msg-inac message iterator inactivity message\endlink." +ALIASES += bt_pre_is_pb_msg{1}="@pre \bt_p{\1} is a \link api-msg-pb packet beginning message\endlink." +ALIASES += bt_pre_is_pe_msg{1}="@pre \bt_p{\1} is a \link api-msg-pe packet end message\endlink." +ALIASES += bt_pre_is_sb_msg{1}="@pre \bt_p{\1} is a \link api-msg-sb stream beginning message\endlink." +ALIASES += bt_pre_is_se_msg{1}="@pre \bt_p{\1} is a \link api-msg-se stream end message\endlink." + +# Aliases: field class object types: singular +ALIASES += bt_fc="\link api-tir-fc field class\endlink" +ALIASES += bt_ba_fc="\link api-tir-fc-ba bit array field class\endlink" +ALIASES += bt_bool_fc="\link api-tir-fc-bool boolean field class\endlink" +ALIASES += bt_int_fc="\link api-tir-fc-int integer field class\endlink" +ALIASES += bt_sint_fc="signed \link api-tir-fc-int integer field class\endlink" +ALIASES += bt_uint_fc="unsigned \link api-tir-fc-int integer field class\endlink" +ALIASES += bt_real_fc="\link api-tir-fc-real real field class\endlink" +ALIASES += bt_enum_fc="\link api-tir-fc-enum enumeration field class\endlink" +ALIASES += bt_senum_fc="signed \link api-tir-fc-enum enumeration field class\endlink" +ALIASES += bt_uenum_fc="unsigned \link api-tir-fc-enum enumeration field class\endlink" +ALIASES += bt_string_fc="\link api-tir-fc-string string field class\endlink" +ALIASES += bt_struct_fc="\link api-tir-fc-struct structure field class\endlink" +ALIASES += bt_array_fc="\link api-tir-fc-array array field class\endlink" +ALIASES += bt_sarray_fc="static \link api-tir-fc-array array field class\endlink" +ALIASES += bt_darray_fc="dynamic \link api-tir-fc-array array field class\endlink" +ALIASES += bt_opt_fc="\link api-tir-fc-opt option field class\endlink" +ALIASES += bt_var_fc="\link api-tir-fc-var variant field class\endlink" + +# Aliases: field class object types: singular, capitalized +ALIASES += bt_c_fc="\link api-tir-fc Field class\endlink" +ALIASES += bt_c_ba_fc="\link api-tir-fc-ba Bit array field class\endlink" +ALIASES += bt_c_bool_fc="\link api-tir-fc-bool Boolean field class\endlink" +ALIASES += bt_c_int_fc="\link api-tir-fc-int Integer field class\endlink" +ALIASES += bt_c_sint_fc="Signed \link api-tir-fc-int integer field class\endlink" +ALIASES += bt_c_uint_fc="Unsigned \link api-tir-fc-int integer field class\endlink" +ALIASES += bt_c_real_fc="\link api-tir-fc-real Real field class\endlink" +ALIASES += bt_c_enum_fc="\link api-tir-fc-enum Enumeration field class\endlink" +ALIASES += bt_c_senum_fc="Signed \link api-tir-fc-enum enumeration field class\endlink" +ALIASES += bt_c_uenum_fc="Unsigned \link api-tir-fc-enum enumeration field class\endlink" +ALIASES += bt_c_string_fc="\link api-tir-fc-string String field class\endlink" +ALIASES += bt_c_struct_fc="\link api-tir-fc-struct Structure field class\endlink" +ALIASES += bt_c_array_fc="\link api-tir-fc-array Array field class\endlink" +ALIASES += bt_c_sarray_fc="Static \link api-tir-fc-array array field class\endlink" +ALIASES += bt_c_darray_fc="Dynamic \link api-tir-fc-array array field class\endlink" +ALIASES += bt_c_opt_fc="\link api-tir-fc-opt Option field class\endlink" +ALIASES += bt_c_var_fc="\link api-tir-fc-var Variant field class\endlink" + +# Aliases: field class object types: plural +ALIASES += bt_p_fc="\link api-tir-fc field classes\endlink" +ALIASES += bt_p_ba_fc="\link api-tir-fc-ba bit array field classes\endlink" +ALIASES += bt_p_bool_fc="\link api-tir-fc-bool boolean field classes\endlink" +ALIASES += bt_p_int_fc="\link api-tir-fc-int integer field classes\endlink" +ALIASES += bt_p_sint_fc="signed \link api-tir-fc-int integer field classes\endlink" +ALIASES += bt_p_uint_fc="unsigned \link api-tir-fc-int integer field classes\endlink" +ALIASES += bt_p_real_fc="\link api-tir-fc-real real field classes\endlink" +ALIASES += bt_p_enum_fc="\link api-tir-fc-enum enumeration field classes\endlink" +ALIASES += bt_p_senum_fc="signed \link api-tir-fc-enum enumeration field classes\endlink" +ALIASES += bt_p_uenum_fc="unsigned \link api-tir-fc-enum enumeration field classes\endlink" +ALIASES += bt_p_string_fc="\link api-tir-fc-string string field classes\endlink" +ALIASES += bt_p_struct_fc="\link api-tir-fc-struct structure field classes\endlink" +ALIASES += bt_p_array_fc="\link api-tir-fc-array array field classes\endlink" +ALIASES += bt_p_sarray_fc="static \link api-tir-fc-array array field classes\endlink" +ALIASES += bt_p_darray_fc="dynamic \link api-tir-fc-array array field classes\endlink" +ALIASES += bt_p_opt_fc="\link api-tir-fc-opt option field classes\endlink" +ALIASES += bt_p_var_fc="\link api-tir-fc-var variant field classes\endlink" + +# Aliases: field class object types: plural, capitalized +ALIASES += bt_cp_fc="\link api-tir-fc Field classes\endlink" +ALIASES += bt_cp_ba_fc="\link api-tir-fc-ba Bit array field classes\endlink" +ALIASES += bt_cp_bool_fc="\link api-tir-fc-bool Boolean field classes\endlink" +ALIASES += bt_cp_int_fc="\link api-tir-fc-int Integer field classes\endlink" +ALIASES += bt_cp_sint_fc="Signed \link api-tir-fc-int integer field classes\endlink" +ALIASES += bt_cp_uint_fc="Unsigned \link api-tir-fc-int integer field classes\endlink" +ALIASES += bt_cp_real_fc="\link api-tir-fc-real Real field classes\endlink" +ALIASES += bt_cp_enum_fc="\link api-tir-fc-enum Enumeration field classes\endlink" +ALIASES += bt_cp_senum_fc="Signed \link api-tir-fc-enum enumeration field classes\endlink" +ALIASES += bt_cp_uenum_fc="Unsigned \link api-tir-fc-enum enumeration field classes\endlink" +ALIASES += bt_cp_string_fc="\link api-tir-fc-string String field classes\endlink" +ALIASES += bt_cp_struct_fc="\link api-tir-fc-struct Structure field classes\endlink" +ALIASES += bt_cp_array_fc="\link api-tir-fc-array Array field classes\endlink" +ALIASES += bt_cp_sarray_fc="Static \link api-tir-fc-array array field classes\endlink" +ALIASES += bt_cp_darray_fc="Dynamic \link api-tir-fc-array array field classes\endlink" +ALIASES += bt_cp_opt_fc="\link api-tir-fc-opt Option field classes\endlink" +ALIASES += bt_cp_var_fc="\link api-tir-fc-var Variant field classes\endlink" + +# Aliases: field object types: singular +ALIASES += bt_field="\link api-tir-field field\endlink" +ALIASES += bt_ba_field="\link api-tir-field-ba bit array field\endlink" +ALIASES += bt_bool_field="\link api-tir-field-bool boolean field\endlink" +ALIASES += bt_int_field="\link api-tir-field-int integer field\endlink" +ALIASES += bt_sint_field="signed \link api-tir-field-int integer field\endlink" +ALIASES += bt_uint_field="unsigned \link api-tir-field-int integer field\endlink" +ALIASES += bt_real_field="\link api-tir-field-real real field\endlink" +ALIASES += bt_sreal_field="single-precision \link api-tir-field-real real field\endlink" +ALIASES += bt_dreal_field="double-precision \link api-tir-field-real real field\endlink" +ALIASES += bt_enum_field="\link api-tir-field-enum enumeration field\endlink" +ALIASES += bt_senum_field="signed \link api-tir-field-enum enumeration field\endlink" +ALIASES += bt_uenum_field="unsigned \link api-tir-field-enum enumeration field\endlink" +ALIASES += bt_string_field="\link api-tir-field-string string field\endlink" +ALIASES += bt_struct_field="\link api-tir-field-struct structure field\endlink" +ALIASES += bt_array_field="\link api-tir-field-array array field\endlink" +ALIASES += bt_sarray_field="static \link api-tir-field-array array field\endlink" +ALIASES += bt_darray_field="dynamic \link api-tir-field-array array field\endlink" +ALIASES += bt_opt_field="\link api-tir-field-opt option field\endlink" +ALIASES += bt_var_field="\link api-tir-field-var variant field\endlink" + +# Aliases: field object types: singular, capitalized +ALIASES += bt_c_field="\link api-tir-field Field\endlink" +ALIASES += bt_c_ba_field="\link api-tir-field-ba Bit array field\endlink" +ALIASES += bt_c_bool_field="\link api-tir-field-bool Boolean field\endlink" +ALIASES += bt_c_int_field="\link api-tir-field-int Integer field\endlink" +ALIASES += bt_c_sint_field="Signed \link api-tir-field-int integer field\endlink" +ALIASES += bt_c_uint_field="Unsigned \link api-tir-field-int integer field\endlink" +ALIASES += bt_c_real_field="\link api-tir-field-real Real field\endlink" +ALIASES += bt_c_sreal_field="Single-precision \link api-tir-field-real real field\endlink" +ALIASES += bt_c_dreal_field="Double-precision \link api-tir-field-real real field\endlink" +ALIASES += bt_c_enum_field="\link api-tir-field-enum Enumeration field\endlink" +ALIASES += bt_c_senum_field="Signed \link api-tir-field-enum enumeration field\endlink" +ALIASES += bt_c_uenum_field="Unsigned \link api-tir-field-enum enumeration field\endlink" +ALIASES += bt_c_string_field="\link api-tir-field-string String field\endlink" +ALIASES += bt_c_struct_field="\link api-tir-field-struct Structure field\endlink" +ALIASES += bt_c_array_field="\link api-tir-field-array Array field\endlink" +ALIASES += bt_c_sarray_field="Static \link api-tir-field-array array field\endlink" +ALIASES += bt_c_darray_field="Dynamic \link api-tir-field-array array field\endlink" +ALIASES += bt_c_opt_field="\link api-tir-field-opt Option field\endlink" +ALIASES += bt_c_var_field="\link api-tir-field-var Variant field\endlink" + +# Aliases: field object types: plural +ALIASES += bt_p_field="\link api-tir-field fields\endlink" +ALIASES += bt_p_ba_field="\link api-tir-field-ba bit array fields\endlink" +ALIASES += bt_p_bool_field="\link api-tir-field-bool boolean fields\endlink" +ALIASES += bt_p_int_field="\link api-tir-field-int integer fields\endlink" +ALIASES += bt_p_sint_field="signed \link api-tir-field-int integer fields\endlink" +ALIASES += bt_p_uint_field="unsigned \link api-tir-field-int integer fields\endlink" +ALIASES += bt_p_real_field="\link api-tir-field-real real fields\endlink" +ALIASES += bt_p_sreal_field="single-precision \link api-tir-field-real real fields\endlink" +ALIASES += bt_p_dreal_field="double-precision \link api-tir-field-real real fields\endlink" +ALIASES += bt_p_enum_field="\link api-tir-field-enum enumeration fields\endlink" +ALIASES += bt_p_senum_field="signed \link api-tir-field-enum enumeration fields\endlink" +ALIASES += bt_p_uenum_field="unsigned \link api-tir-field-enum enumeration fields\endlink" +ALIASES += bt_p_string_field="\link api-tir-field-string string fields\endlink" +ALIASES += bt_p_struct_field="\link api-tir-field-struct structure fields\endlink" +ALIASES += bt_p_array_field="\link api-tir-field-array array fields\endlink" +ALIASES += bt_p_sarray_field="static \link api-tir-field-array array fields\endlink" +ALIASES += bt_p_darray_field="dynamic \link api-tir-field-array array fields\endlink" +ALIASES += bt_p_opt_field="\link api-tir-field-opt option fields\endlink" +ALIASES += bt_p_var_field="\link api-tir-field-var variant fields\endlink" + +# Aliases: field object types: plural, capitalized +ALIASES += bt_cp_field="\link api-tir-field Fields\endlink" +ALIASES += bt_cp_ba_field="\link api-tir-field-ba Bit array fields\endlink" +ALIASES += bt_cp_bool_field="\link api-tir-field-bool Boolean fields\endlink" +ALIASES += bt_cp_int_field="\link api-tir-field-int Integer fields\endlink" +ALIASES += bt_cp_sint_field="Signed \link api-tir-field-int integer fields\endlink" +ALIASES += bt_cp_uint_field="Unsigned \link api-tir-field-int integer fields\endlink" +ALIASES += bt_cp_real_field="\link api-tir-field-real Real fields\endlink" +ALIASES += bt_cp_sreal_field="Single-precision \link api-tir-field-real real fields\endlink" +ALIASES += bt_cp_dreal_field="Double-precision \link api-tir-field-real real fields\endlink" +ALIASES += bt_cp_enum_field="\link api-tir-field-enum Enumeration fields\endlink" +ALIASES += bt_cp_senum_field="Signed \link api-tir-field-enum enumeration fields\endlink" +ALIASES += bt_cp_uenum_field="Unsigned \link api-tir-field-enum enumeration fields\endlink" +ALIASES += bt_cp_string_field="\link api-tir-field-string String fields\endlink" +ALIASES += bt_cp_struct_field="\link api-tir-field-struct Structure fields\endlink" +ALIASES += bt_cp_array_field="\link api-tir-field-array Array fields\endlink" +ALIASES += bt_cp_sarray_field="Static \link api-tir-field-array array fields\endlink" +ALIASES += bt_cp_darray_field="Dynamic \link api-tir-field-array array fields\endlink" +ALIASES += bt_cp_opt_field="\link api-tir-field-opt Option fields\endlink" +ALIASES += bt_cp_var_field="\link api-tir-field-var Variant fields\endlink" + +# Aliases: trace IR objects: singular +ALIASES += bt_clock_cls="\link api-tir-clock-cls clock class\endlink" +ALIASES += bt_cs="\link api-tir-cs clock snapshot\endlink" +ALIASES += bt_ev_cls="\link api-tir-ev-cls event class\endlink" +ALIASES += bt_ev="\link api-tir-ev event\endlink" +ALIASES += bt_field_path="\link api-tir-field-path field path\endlink" +ALIASES += bt_pkt="\link api-tir-pkt packet\endlink" +ALIASES += bt_stream_cls="\link api-tir-stream-cls stream class\endlink" +ALIASES += bt_stream="\link api-tir-stream stream\endlink" +ALIASES += bt_trace="\link api-tir-trace trace\endlink" +ALIASES += bt_trace_cls="\link api-tir-trace-cls trace class\endlink" + +# Aliases: trace IR objects: singular, capitalized +ALIASES += bt_c_clock_cls="\link api-tir-clock-cls Clock class\endlink" +ALIASES += bt_c_cs="\link api-tir-cs Clock snapshot\endlink" +ALIASES += bt_c_ev_cls="\link api-tir-ev-cls Event class\endlink" +ALIASES += bt_c_ev="\link api-tir-ev Event\endlink" +ALIASES += bt_c_field_path="\link api-tir-field-path Field path\endlink" +ALIASES += bt_c_pkt="\link api-tir-pkt Packet\endlink" +ALIASES += bt_c_stream_cls="\link api-tir-stream-cls Stream class\endlink" +ALIASES += bt_c_stream="\link api-tir-stream Stream\endlink" +ALIASES += bt_c_trace="\link api-tir-trace Trace\endlink" +ALIASES += bt_c_trace_cls="\link api-tir-trace-cls Trace class\endlink" + +# Aliases: trace IR objects: plural +ALIASES += bt_p_clock_cls="\link api-tir-clock-cls clock classes\endlink" +ALIASES += bt_p_cs="\link api-tir-cs clock snapshots\endlink" +ALIASES += bt_p_ev_cls="\link api-tir-ev-cls event classes\endlink" +ALIASES += bt_p_ev="\link api-tir-ev events\endlink" +ALIASES += bt_p_field_path="\link api-tir-field-path field paths\endlink" +ALIASES += bt_p_pkt="\link api-tir-pkt packets\endlink" +ALIASES += bt_p_stream_cls="\link api-tir-stream-cls stream classes\endlink" +ALIASES += bt_p_stream="\link api-tir-stream streams\endlink" +ALIASES += bt_p_trace="\link api-tir-trace traces\endlink" +ALIASES += bt_p_trace_cls="\link api-tir-trace-cls trace classes\endlink" + +# Aliases: trace IR objects: plural, capitalized +ALIASES += bt_cp_clock_cls="\link api-tir-clock-cls Clock classes\endlink" +ALIASES += bt_cp_cs="\link api-tir-cs Clock snapshots\endlink" +ALIASES += bt_cp_ev_cls="\link api-tir-ev-cls event classes\endlink" +ALIASES += bt_cp_ev="\link api-tir-ev Events\endlink" +ALIASES += bt_cp_field_path="\link api-tir-field-path Field paths\endlink" +ALIASES += bt_cp_pkt="\link api-tir-pkt Packets\endlink" +ALIASES += bt_cp_stream_cls="\link api-tir-stream-cls Stream classes\endlink" +ALIASES += bt_cp_stream="\link api-tir-stream Streams\endlink" +ALIASES += bt_cp_trace="\link api-tir-trace Traces\endlink" +ALIASES += bt_cp_trace_cls="\link api-tir-trace-cls Trace classes\endlink" + +# Aliases: graph objects: singular +ALIASES += bt_comp="\link api-comp component\endlink" +ALIASES += bt_comp_cls="\link api-comp-cls component class\endlink" +ALIASES += bt_comp_descr_set="\link api-comp-descr-set component descriptor set\endlink" +ALIASES += bt_conn="\link api-conn connection\endlink" +ALIASES += bt_flt_comp="\link api-comp-flt filter component\endlink" +ALIASES += bt_flt_comp_cls="\link api-comp-cls-flt filter component class\endlink" +ALIASES += bt_graph="\link api-graph graph\endlink" +ALIASES += bt_intr="\link api-intr interrupter\endlink" +ALIASES += bt_ip_msg_iter="\link api-ip-msg-iter self component input port message iterator\endlink" +ALIASES += bt_iport="\link api-port-in input port\endlink" +ALIASES += bt_mip="\link api-msg-mip Message Interchange Protocol\endlink" +ALIASES += bt_msg_iter="\link api-msg-iter message iterator\endlink" +ALIASES += bt_msg_iter_cls="\link api-msg-iter-cls message iterator class\endlink" +ALIASES += bt_oport="\link api-port-out output port\endlink" +ALIASES += bt_port="\link api-port port\endlink" +ALIASES += bt_priv_qexec="\link api-priv-qexec private query executor\endlink" +ALIASES += bt_qexec="\link api-qexec query executor\endlink" +ALIASES += bt_self_comp="\link api-self-comp self component\endlink" +ALIASES += bt_self_comp_port="\link api-self-comp-port self component port\endlink" +ALIASES += bt_self_comp_iport="\link api-self-comp-port self component input port\endlink" +ALIASES += bt_self_comp_oport="\link api-self-comp-port self component output port\endlink" +ALIASES += bt_self_comp_cls="\link api-self-comp-cls self component class\endlink" +ALIASES += bt_self_flt_comp="\link api-self-comp self filter component\endlink" +ALIASES += bt_self_flt_comp_cls="\link api-self-comp-cls self filter component class\endlink" +ALIASES += bt_self_msg_iter="\link api-self-msg-iter self message iterator\endlink" +ALIASES += bt_self_sink_comp="\link api-self-comp self sink component\endlink" +ALIASES += bt_self_sink_comp_cls="\link api-self-comp-cls self sink component class\endlink" +ALIASES += bt_self_src_comp="\link api-self-comp self source component\endlink" +ALIASES += bt_self_src_comp_cls="\link api-self-comp-cls self source component class\endlink" +ALIASES += bt_sink_comp="\link api-comp-sink sink component\endlink" +ALIASES += bt_sink_comp_cls="\link api-comp-cls-sink sink component class\endlink" +ALIASES += bt_src_comp="\link api-comp-src source component\endlink" +ALIASES += bt_src_comp_cls="\link api-comp-cls-src source component class\endlink" + +# Aliases: graph objects: singular, capitalized +ALIASES += bt_c_comp="\link api-comp Component\endlink" +ALIASES += bt_c_comp_cls="\link api-comp-cls Component class\endlink" +ALIASES += bt_c_comp_descr="\link api-comp-descr-set Component descriptor set\endlink" +ALIASES += bt_c_conn="\link api-conn Connection\endlink" +ALIASES += bt_c_flt_comp="\link api-comp-flt Filter component\endlink" +ALIASES += bt_c_flt_comp_cls="\link api-comp-cls-flt Filter component class\endlink" +ALIASES += bt_c_graph="\link api-graph Graph\endlink" +ALIASES += bt_c_intr="\link api-intr Interrupter\endlink" +ALIASES += bt_c_ip_msg_iter="\link api-ip-msg-iter Self component input port message iterator\endlink" +ALIASES += bt_c_iport="\link api-port-in Input port\endlink" +ALIASES += bt_c_msg_iter="\link api-msg-iter Message iterator\endlink" +ALIASES += bt_c_msg_iter_cls="\link api-msg-iter-cls Message iterator class\endlink" +ALIASES += bt_c_oport="\link api-port-out Output port\endlink" +ALIASES += bt_c_port="\link api-port Port\endlink" +ALIASES += bt_c_priv_qexec="\link api-priv-qexec Private query executor\endlink" +ALIASES += bt_c_qexec="\link api-qexec Query executor\endlink" +ALIASES += bt_c_self_comp="\link api-self-comp Self component\endlink" +ALIASES += bt_c_self_comp_port="\link api-self-comp-port Self component port\endlink" +ALIASES += bt_c_self_comp_iport="\link api-self-comp-port Self component input port\endlink" +ALIASES += bt_c_self_comp_oport="\link api-self-comp-port Self component output port\endlink" +ALIASES += bt_c_self_comp_cls="\link api-self-comp-cls Self component class\endlink" +ALIASES += bt_c_self_flt_comp="\link api-self-comp Self filter component\endlink" +ALIASES += bt_c_self_flt_comp_cls="\link api-self-comp-cls Self filter component class\endlink" +ALIASES += bt_c_self_msg_iter="\link api-self-msg-iter Self message iterator\endlink" +ALIASES += bt_c_self_sink_comp="\link api-self-comp Self sink component\endlink" +ALIASES += bt_c_self_sink_comp_cls="\link api-self-comp-cls Self sink component class\endlink" +ALIASES += bt_c_self_src_comp="\link api-self-comp Self source component\endlink" +ALIASES += bt_c_self_src_comp_cls="\link api-self-comp-cls Self source component class\endlink" +ALIASES += bt_c_sink_comp="\link api-comp-sink Sink component\endlink" +ALIASES += bt_c_sink_comp_cls="\link api-comp-cls-sink Sink component class\endlink" +ALIASES += bt_c_src_comp="\link api-comp-src Source component\endlink" +ALIASES += bt_c_src_comp_cls="\link api-comp-cls-src Source component class\endlink" + +# Aliases: graph objects: plural +ALIASES += bt_p_comp="\link api-comp components\endlink" +ALIASES += bt_p_comp_cls="\link api-comp-cls component classes\endlink" +ALIASES += bt_p_comp_descr="\link api-comp-descr-set component descriptor sets\endlink" +ALIASES += bt_p_conn="\link api-conn connections\endlink" +ALIASES += bt_p_flt_comp="\link api-comp-flt filter components\endlink" +ALIASES += bt_p_flt_comp_cls="\link api-comp-cls-flt filter component classes\endlink" +ALIASES += bt_p_graph="\link api-graph graphs\endlink" +ALIASES += bt_p_intr="\link api-intr interrupters\endlink" +ALIASES += bt_p_ip_msg_iter="\link api-ip-msg-iter self component input port message iterators\endlink" +ALIASES += bt_p_iport="\link api-port-in input ports\endlink" +ALIASES += bt_p_msg_iter="\link api-msg-iter message iterators\endlink" +ALIASES += bt_p_msg_iter_cls="\link api-msg-iter-cls message iterator classes\endlink" +ALIASES += bt_p_oport="\link api-port-out output ports\endlink" +ALIASES += bt_p_port="\link api-port ports\endlink" +ALIASES += bt_p_priv_qexec="\link api-priv-qexec private query executors\endlink" +ALIASES += bt_p_qexec="\link api-qexec query executors\endlink" +ALIASES += bt_p_self_comp="\link api-self-comp self components\endlink" +ALIASES += bt_p_self_comp_port="\link api-self-comp-port self component ports\endlink" +ALIASES += bt_p_self_comp_iport="\link api-self-comp-port self component input ports\endlink" +ALIASES += bt_p_self_comp_oport="\link api-self-comp-port self component output ports\endlink" +ALIASES += bt_p_self_comp_cls="\link api-self-comp-cls self component classes\endlink" +ALIASES += bt_p_self_flt_comp="\link api-self-comp self filter components\endlink" +ALIASES += bt_p_self_flt_comp_cls="\link api-self-comp-cls self filter component classes\endlink" +ALIASES += bt_p_self_msg_iter="\link api-self-msg-iter self message iterators\endlink" +ALIASES += bt_p_self_sink_comp="\link api-self-comp self sink components\endlink" +ALIASES += bt_p_self_sink_comp_cls="\link api-self-comp-cls self sink component classes\endlink" +ALIASES += bt_p_self_src_comp="\link api-self-comp self source components\endlink" +ALIASES += bt_p_self_src_comp_cls="\link api-self-comp-cls self source component classes\endlink" +ALIASES += bt_p_sink_comp="\link api-comp-sink sink components\endlink" +ALIASES += bt_p_sink_comp_cls="\link api-comp-cls-sink sink component classes\endlink" +ALIASES += bt_p_src_comp="\link api-comp-src source components\endlink" +ALIASES += bt_p_src_comp_cls="\link api-comp-cls-src source component classes\endlink" + +# Aliases: graph objects: plural, capitalized +ALIASES += bt_cp_comp="\link api-comp Components\endlink" +ALIASES += bt_cp_comp_cls="\link api-comp-cls Component classes\endlink" +ALIASES += bt_cp_comp_descr="\link api-comp-descr-set Component descriptor sets\endlink" +ALIASES += bt_cp_conn="\link api-conn Connections\endlink" +ALIASES += bt_cp_flt_comp="\link api-comp-flt Filter components\endlink" +ALIASES += bt_cp_flt_comp_cls="\link api-comp-cls-flt Filter component classes\endlink" +ALIASES += bt_cp_graph="\link api-graph Graphs\endlink" +ALIASES += bt_cp_intr="\link api-intr Interrupters\endlink" +ALIASES += bt_cp_ip_msg_iter="\link api-ip-msg-iter Self component input port message iterators\endlink" +ALIASES += bt_cp_iport="\link api-port-in Input ports\endlink" +ALIASES += bt_cp_msg_iter="\link api-msg-iter Message iterators\endlink" +ALIASES += bt_cp_msg_iter_cls="\link api-msg-iter-cls Message iterator classes\endlink" +ALIASES += bt_cp_oport="\link api-port-out Output ports\endlink" +ALIASES += bt_cp_port="\link api-port Ports\endlink" +ALIASES += bt_cp_priv_qexec="\link api-priv-qexec Private query executors\endlink" +ALIASES += bt_cp_qexec="\link api-qexec Query executors\endlink" +ALIASES += bt_cp_self_comp="\link api-self-comp Self components\endlink" +ALIASES += bt_cp_self_comp_port="\link api-self-comp-port Self component ports\endlink" +ALIASES += bt_cp_self_comp_iport="\link api-self-comp-port Self component input ports\endlink" +ALIASES += bt_cp_self_comp_oport="\link api-self-comp-port Self component output ports\endlink" +ALIASES += bt_cp_self_comp_cls="\link api-self-comp-cls Self component classes\endlink" +ALIASES += bt_cp_self_flt_comp="\link api-self-comp Self filter components\endlink" +ALIASES += bt_cp_self_flt_comp_cls="\link api-self-comp-cls Self filter component classes\endlink" +ALIASES += bt_cp_self_msg_iter="\link api-self-msg-iter Self message iterators\endlink" +ALIASES += bt_cp_self_sink_comp="\link api-self-comp Self sink components\endlink" +ALIASES += bt_cp_self_sink_comp_cls="\link api-self-comp-cls Self sink component classes\endlink" +ALIASES += bt_cp_self_src_comp="\link api-self-comp Self source components\endlink" +ALIASES += bt_cp_self_src_comp_cls="\link api-self-comp-cls Self source component classes\endlink" +ALIASES += bt_cp_sink_comp="\link api-comp-sink Sink components\endlink" +ALIASES += bt_cp_sink_comp_cls="\link api-comp-cls-sink Sink component classes\endlink" +ALIASES += bt_cp_src_comp="\link api-comp-src Source components\endlink" +ALIASES += bt_cp_src_comp_cls="\link api-comp-cls-src Source component classes\endlink" + +# Aliases: message objects: singular +ALIASES += bt_disc_ev_msg="\link api-msg-disc-ev discarded events message\endlink" +ALIASES += bt_disc_pkt_msg="\link api-msg-disc-pkt discarded packets message\endlink" +ALIASES += bt_ev_msg="\link api-msg-ev event message\endlink" +ALIASES += bt_inac_msg="\link api-msg-inac message iterator inactivity message\endlink" +ALIASES += bt_msg="\link api-msg message\endlink" +ALIASES += bt_pb_msg="\link api-msg-pb packet beginning message\endlink" +ALIASES += bt_pe_msg="\link api-msg-pe packet end message\endlink" +ALIASES += bt_sb_msg="\link api-msg-sb stream beginning message\endlink" +ALIASES += bt_se_msg="\link api-msg-se stream end message\endlink" + +# Aliases: message objects: singular, capitalized +ALIASES += bt_c_disc_ev_msg="\link api-msg-disc-ev Discarded events message\endlink" +ALIASES += bt_c_disc_pkt_msg="\link api-msg-disc-pkt Discarded packets message\endlink" +ALIASES += bt_c_ev_msg="\link api-msg-ev Event message\endlink" +ALIASES += bt_c_inac_msg="\link api-msg-inac Message iterator inactivity message\endlink" +ALIASES += bt_c_msg="\link api-msg Message\endlink" +ALIASES += bt_c_pb_msg="\link api-msg-pb Packet beginning message\endlink" +ALIASES += bt_c_pe_msg="\link api-msg-pe Packet end message\endlink" +ALIASES += bt_c_sb_msg="\link api-msg-sb Stream beginning message\endlink" +ALIASES += bt_c_se_msg="\link api-msg-se Stream end message\endlink" + +# Aliases: message objects: plural +ALIASES += bt_p_disc_ev_msg="\link api-msg-disc-ev discarded events messages\endlink" +ALIASES += bt_p_disc_pkt_msg="\link api-msg-disc-pkt discarded packets messages\endlink" +ALIASES += bt_p_ev_msg="\link api-msg-ev event messages\endlink" +ALIASES += bt_p_inac_msg="\link api-msg-inac message iterator inactivity messages\endlink" +ALIASES += bt_p_msg="\link api-msg messages\endlink" +ALIASES += bt_p_pb_msg="\link api-msg-pb packet beginning messages\endlink" +ALIASES += bt_p_pe_msg="\link api-msg-pe packet end messages\endlink" +ALIASES += bt_p_sb_msg="\link api-msg-sb stream beginning messages\endlink" +ALIASES += bt_p_se_msg="\link api-msg-se stream end messages\endlink" + +# Aliases: message objects: plural, capitalized +ALIASES += bt_cp_disc_ev_msg="\link api-msg-disc-ev Discarded events messages\endlink" +ALIASES += bt_cp_disc_pkt_msg="\link api-msg-disc-pkt Discarded packets messages\endlink" +ALIASES += bt_cp_ev_msg="\link api-msg-ev Event messages\endlink" +ALIASES += bt_cp_inac_msg="\link api-msg-inac Message iterator inactivity messages\endlink" +ALIASES += bt_cp_msg="\link api-msg Messages\endlink" +ALIASES += bt_cp_pb_msg="\link api-msg-pb Packet beginning messages\endlink" +ALIASES += bt_cp_pe_msg="\link api-msg-pe Packet end messages\endlink" +ALIASES += bt_cp_sb_msg="\link api-msg-sb Stream beginning messages\endlink" +ALIASES += bt_cp_se_msg="\link api-msg-se Stream end messages\endlink" + +# Aliases: plugin objects: singular +ALIASES += bt_plugin="\link api-plugin plugin\endlink" +ALIASES += bt_plugin_set="\link api-plugin plugin set\endlink" + +# Aliases: plugin objects: singular, capitalized +ALIASES += bt_c_plugin="\link api-plugin Plugin\endlink" +ALIASES += bt_c_plugin_set="\link api-plugin Plugin set\endlink" + +# Aliases: plugin objects: plural +ALIASES += bt_p_plugin="\link api-plugin plugins\endlink" +ALIASES += bt_p_plugin_set="\link api-plugin plugin sets\endlink" + +# Aliases: plugin objects: plural, capitalized +ALIASES += bt_cp_plugin="\link api-plugin Plugins\endlink" +ALIASES += bt_cp_plugin_set="\link api-plugin Plugin sets\endlink" + +# Aliases: value objects: singular +ALIASES += bt_val="\link api-val value\endlink" +ALIASES += bt_null_val="null \link api-val value\endlink" +ALIASES += bt_bool_val="boolean \link api-val value\endlink" +ALIASES += bt_sint_val="signed integer \link api-val value\endlink" +ALIASES += bt_uint_val="unsigned integer \link api-val value\endlink" +ALIASES += bt_real_val="real \link api-val value\endlink" +ALIASES += bt_string_val="string \link api-val value\endlink" +ALIASES += bt_map_val="map \link api-val value\endlink" +ALIASES += bt_array_val="array \link api-val value\endlink" + +# Aliases: value objects: singular, capitalized +ALIASES += bt_c_val="\link api-val Value\endlink" +ALIASES += bt_c_null_val="Null \link api-val value\endlink" +ALIASES += bt_c_bool_val="Boolean \link api-val value\endlink" +ALIASES += bt_c_sint_val="Signed integer \link api-val value\endlink" +ALIASES += bt_c_uint_val="Unsigned integer \link api-val value\endlink" +ALIASES += bt_c_real_val="Real \link api-val value\endlink" +ALIASES += bt_c_string_val="String \link api-val value\endlink" +ALIASES += bt_c_map_val="Map \link api-val value\endlink" +ALIASES += bt_c_array_val="Array \link api-val value\endlink" + +# Aliases: value objects: plural +ALIASES += bt_p_val="\link api-val values\endlink" +ALIASES += bt_p_null_val="null \link api-val values\endlink" +ALIASES += bt_p_bool_val="boolean \link api-val values\endlink" +ALIASES += bt_p_sint_val="signed integer \link api-val values\endlink" +ALIASES += bt_p_uint_val="unsigned integer \link api-val values\endlink" +ALIASES += bt_p_real_val="real \link api-val values\endlink" +ALIASES += bt_p_string_val="string \link api-val values\endlink" +ALIASES += bt_p_map_val="map \link api-val values\endlink" +ALIASES += bt_p_array_val="array \link api-val values\endlink" + +# Aliases: value objects: plural, capitalized +ALIASES += bt_cp_val="\link api-val Values\endlink" +ALIASES += bt_cp_null_val="Null \link api-val values\endlink" +ALIASES += bt_cp_bool_val="Boolean \link api-val values\endlink" +ALIASES += bt_cp_sint_val="Signed integer \link api-val values\endlink" +ALIASES += bt_cp_uint_val="Unsigned integer \link api-val values\endlink" +ALIASES += bt_cp_real_val="Real \link api-val values\endlink" +ALIASES += bt_cp_string_val="String \link api-val values\endlink" +ALIASES += bt_cp_map_val="Map \link api-val values\endlink" +ALIASES += bt_cp_array_val="Array \link api-val values\endlink" + +# Aliases: integer range set objects: singular +ALIASES += bt_sint_rg="\link api-int-rs signed integer range\endlink" +ALIASES += bt_uint_rg="\link api-int-rs unsigned integer range\endlink" +ALIASES += bt_int_rs="\link api-int-rs integer range set\endlink" +ALIASES += bt_sint_rs="\link api-int-rs signed integer range set\endlink" +ALIASES += bt_uint_rs="\link api-int-rs unsigned integer range set\endlink" + +# Aliases: integer range set objects: singular, capitalized +ALIASES += bt_c_sint_rg="\link api-int-rs Signed integer range\endlink" +ALIASES += bt_c_uint_rg="\link api-int-rs Unsigned integer range\endlink" +ALIASES += bt_c_int_rs="\link api-int-rs Integer range set\endlink" +ALIASES += bt_c_sint_rs="\link api-int-rs Signed integer range set\endlink" +ALIASES += bt_c_uint_rs="\link api-int-rs Unsigned integer range set\endlink" + +# Aliases: integer range set objects: plural +ALIASES += bt_p_sint_rg="\link api-int-rs signed integer ranges\endlink" +ALIASES += bt_p_uint_rg="\link api-int-rs unsigned integer ranges\endlink" +ALIASES += bt_p_int_rs="\link api-int-rs integer range sets\endlink" +ALIASES += bt_p_sint_rs="\link api-int-rs signed integer range sets\endlink" +ALIASES += bt_p_uint_rs="\link api-int-rs unsigned integer range sets\endlink" + +# Aliases: integer range set objects: plural, capitalized +ALIASES += bt_cp_sint_rg="\link api-int-rs Signed integer ranges\endlink" +ALIASES += bt_cp_uint_rg="\link api-int-rs Unsigned integer ranges\endlink" +ALIASES += bt_cp_int_rs="\link api-int-rs Integer range sets\endlink" +ALIASES += bt_cp_sint_rs="\link api-int-rs Signed integer range sets\endlink" +ALIASES += bt_cp_uint_rs="\link api-int-rs Unsigned integer range sets\endlink" + +OPTIMIZE_OUTPUT_FOR_C = YES +MARKDOWN_SUPPORT = NO +TOC_INCLUDE_HEADINGS = 0 +AUTOLINK_SUPPORT = YES +SUBGROUPING = YES +INLINE_GROUPED_CLASSES = NO +INLINE_SIMPLE_STRUCTS = NO +TYPEDEF_HIDES_STRUCT = NO +LOOKUP_CACHE_SIZE = 0 + +EXTRACT_ALL = NO +EXTRACT_PRIVATE = NO +EXTRACT_PACKAGE = NO +EXTRACT_STATIC = YES +EXTRACT_LOCAL_CLASSES = YES +EXTRACT_LOCAL_METHODS = NO +EXTRACT_ANON_NSPACES = NO +HIDE_UNDOC_MEMBERS = YES +HIDE_UNDOC_CLASSES = YES +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = YES +INTERNAL_DOCS = NO +CASE_SENSE_NAMES = NO +HIDE_SCOPE_NAMES = NO +HIDE_COMPOUND_REFERENCE = NO +SHOW_INCLUDE_FILES = NO +SHOW_GROUPED_MEMB_INC = NO +FORCE_LOCAL_INCLUDES = NO +INLINE_INFO = YES +SORT_MEMBER_DOCS = NO +SORT_BRIEF_DOCS = NO +SORT_MEMBERS_CTORS_1ST = NO +SORT_GROUP_NAMES = NO +SORT_BY_SCOPE_NAME = NO +STRICT_PROTO_MATCHING = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST = YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 0 +SHOW_USED_FILES = NO +SHOW_FILES = NO +SHOW_NAMESPACES = NO +FILE_VERSION_FILTER = +LAYOUT_FILE = "@srcdir@/DoxygenLayout.xml" +CITE_BIB_FILES = + +QUIET = NO +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_NO_PARAMDOC = YES +WARN_AS_ERROR = NO +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = + +INPUT = "@srcdir@/dox/main-page.dox" \ + "@srcdir@/dox/api-fund.dox" \ + "@srcdir@/dox/guides.dox" \ + "@srcdir@/dox/examples.dox" \ + "@top_srcdir@/include/babeltrace2/types.h" \ + "@top_srcdir@/include/babeltrace2/error-reporting.h" \ + "@top_srcdir@/include/babeltrace2/util.h" \ + "@top_srcdir@/include/babeltrace2/graph/graph.h" \ + "@top_srcdir@/include/babeltrace2/graph/component-class-dev.h" \ + "@top_srcdir@/include/babeltrace2/graph/message.h" \ + "@srcdir@/dox/group-trace-ir.dox" \ + "@top_srcdir@/include/babeltrace2/trace-ir/clock-class.h" \ + "@top_srcdir@/include/babeltrace2/trace-ir/clock-snapshot.h" \ + "@top_srcdir@/include/babeltrace2/trace-ir/event.h" \ + "@top_srcdir@/include/babeltrace2/trace-ir/event-class.h" \ + "@top_srcdir@/include/babeltrace2/trace-ir/field.h" \ + "@top_srcdir@/include/babeltrace2/trace-ir/field-class.h" \ + "@top_srcdir@/include/babeltrace2/trace-ir/field-path.h" \ + "@top_srcdir@/include/babeltrace2/trace-ir/packet.h" \ + "@top_srcdir@/include/babeltrace2/trace-ir/stream.h" \ + "@top_srcdir@/include/babeltrace2/trace-ir/stream-class.h" \ + "@top_srcdir@/include/babeltrace2/trace-ir/trace.h" \ + "@top_srcdir@/include/babeltrace2/trace-ir/trace-class.h" \ + "@top_srcdir@/include/babeltrace2/graph/message-iterator.h" \ + "@top_srcdir@/include/babeltrace2/graph/message-iterator-class.h" \ + "@top_srcdir@/include/babeltrace2/graph/self-message-iterator.h" \ + "@top_srcdir@/include/babeltrace2/graph/private-query-executor.h" \ + "@top_srcdir@/include/babeltrace2/graph/self-component.h" \ + "@top_srcdir@/include/babeltrace2/graph/self-component-port.h" \ + "@top_srcdir@/include/babeltrace2/graph/self-component-class.h" \ + "@top_srcdir@/include/babeltrace2/graph/component.h" \ + "@top_srcdir@/include/babeltrace2/graph/component-class.h" \ + "@top_srcdir@/include/babeltrace2/graph/component-descriptor-set.h" \ + "@top_srcdir@/include/babeltrace2/graph/connection.h" \ + "@top_srcdir@/include/babeltrace2/graph/port.h" \ + "@top_srcdir@/include/babeltrace2/graph/interrupter.h" \ + "@top_srcdir@/include/babeltrace2/graph/query-executor.h" \ + "@top_srcdir@/include/babeltrace2/integer-range-set.h" \ + "@top_srcdir@/include/babeltrace2/version.h" \ + "@top_srcdir@/include/babeltrace2/logging.h" \ + "@top_srcdir@/include/babeltrace2/plugin/plugin-dev.h" \ + "@top_srcdir@/include/babeltrace2/plugin/plugin-loading.h" \ + "@top_srcdir@/include/babeltrace2/value.h" +INPUT_ENCODING = UTF-8 +FILE_PATTERNS = *.h *.hh *.hpp *.dox +RECURSIVE = NO +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = +EXCLUDE_SYMBOLS = +EXAMPLE_PATH = "@srcdir@/examples" +EXAMPLE_PATTERNS = * +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = "@srcdir@/images" +INPUT_FILTER = +FILTER_PATTERNS = +FILTER_SOURCE_FILES = NO +FILTER_SOURCE_PATTERNS = +USE_MDFILE_AS_MAINPAGE = + +SOURCE_BROWSER = NO +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = NO +REFERENCES_RELATION = NO +REFERENCES_LINK_SOURCE = YES +SOURCE_TOOLTIPS = YES +USE_HTAGS = NO +VERBATIM_HEADERS = YES + +ALPHABETICAL_INDEX = YES +COLS_IN_ALPHA_INDEX = 5 +IGNORE_PREFIX = + +OUTPUT_DIRECTORY = @builddir@/output + +GENERATE_HTML = YES +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_EXTRA_STYLESHEET = @srcdir@/style.css +HTML_EXTRA_FILES = +HTML_COLORSTYLE_HUE = 220 +HTML_COLORSTYLE_SAT = 100 +HTML_COLORSTYLE_GAMMA = 120 +HTML_TIMESTAMP = NO +HTML_DYNAMIC_SECTIONS = NO +HTML_DYNAMIC_MENUS = NO +HTML_INDEX_NUM_ENTRIES = 100 + +GENERATE_DOCSET = NO +GENERATE_HTMLHELP = NO +GENERATE_CHI = NO +GENERATE_QHP = NO +GENERATE_ECLIPSEHELP = NO + +DISABLE_INDEX = NO +GENERATE_TREEVIEW = NO +ENUM_VALUES_PER_LINE = 1 +TREEVIEW_WIDTH = 250 +EXT_LINKS_IN_WINDOW = NO +FORMULA_FONTSIZE = 10 +FORMULA_TRANSPARENT = YES +USE_MATHJAX = NO +MATHJAX_FORMAT = HTML-CSS +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest +MATHJAX_EXTENSIONS = +MATHJAX_CODEFILE = +SEARCHENGINE = YES +SERVER_BASED_SEARCH = NO +EXTERNAL_SEARCH = NO +SEARCHENGINE_URL = +SEARCHDATA_FILE = searchdata.xml +EXTERNAL_SEARCH_ID = +EXTRA_SEARCH_MAPPINGS = + +GENERATE_LATEX = NO +GENERATE_RTF = NO +GENERATE_MAN = NO +GENERATE_XML = NO +GENERATE_PERLMOD = NO diff --git a/doc/api/libbabeltrace2/DoxygenLayout.xml b/doc/api/libbabeltrace2/DoxygenLayout.xml new file mode 100644 index 00000000..7e40db87 --- /dev/null +++ b/doc/api/libbabeltrace2/DoxygenLayout.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/api/libbabeltrace2/Makefile.am b/doc/api/libbabeltrace2/Makefile.am new file mode 100644 index 00000000..87b565d5 --- /dev/null +++ b/doc/api/libbabeltrace2/Makefile.am @@ -0,0 +1,19 @@ +API_DOC_INSTALL_DIR = "$(DESTDIR)$(docdir)/api" + +all-local: doxygen-doc + +install-data-local: doxygen-doc + $(mkdir_p) "$(API_DOC_INSTALL_DIR)" + cp -rv output/html "$(API_DOC_INSTALL_DIR)" + +@DX_RULES@ + +MOSTLYCLEANFILES = $(DX_CLEANFILES) +EXTRA_DIST = \ + Doxyfile.in \ + DoxygenLayout.xml \ + README.adoc \ + style.css \ + dox \ + examples \ + images diff --git a/doc/api/libbabeltrace2/README.adoc b/doc/api/libbabeltrace2/README.adoc new file mode 100644 index 00000000..71675a63 --- /dev/null +++ b/doc/api/libbabeltrace2/README.adoc @@ -0,0 +1,386 @@ +// Render with Asciidoctor + += Babeltrace{nbsp}2 C API documentation guidelines +Philippe Proulx +6 October 2019 + +This document explains how to write documentation for the +Babeltrace{nbsp}2 C API. + + +== General rules + +* Use four spaces to indent. + +* Try to stay behind the 72^th^ column mark if possible. + +* Use `+ +` wherever needed. + +* Refer to a function using the `func()` form and to an enumerator or + type using the `#name` syntax. + +* When you refer to any keyword or definition, use the `\c` command if + it's a single word, otherwise surround the words with `` and + ``: ++ +-- +---- +@returns + Event class on success, or \c NULL on error. +---- +-- + +* Use the `\command` style in text and the `@command` style for other + locations (for example, `@brief`, `@param`, `@sa`, `@file`). + +* Use a `@code{.unparsed}` block for a plain text block (shell input, + for example): ++ +---- +@code{.unparsed} +$ BABELTRACE_DEV_MODE=1 BABELTRACE_MINIMAL_LOG_LEVEL=TRACE ./configure +@endcode +---- + +* In the text, use `\bt_p{__param__}` to refer to the parameter named + `__param__`. + + +== Function documentation + +Full example: + +---- +/*! +@brief + Does something (third person singular, simple present) with some + parameter \bt_p{param} unless some other parameter + \bt_p{other_param} is some value. + +Full documentation goes here and adds any relevant information that's +not in the brief description. + +@code +/* If needed, put any C code in a code block. */ +@endcode + +Crucifix scenester vegan organic neutra palo santo glossier occupy +truffaut. Meh fixie taiyaki single-origin coffee wayfarers. Thundercats +farm-to-table shoreditch vinyl. + +@remarks + This is where you would put some remarks. Occupy flexitarian neutra, + edison bulb bespoke sriracha post-ironic. Mlkshk plaid pop-up + polaroid chillwave, ennui neutra. + +See this image: + +@image html mein-illustration.png "In elit et." + +@note + @parblock + This is a multiparagraph note. + + Tote bag sartorial distillery, try-hard succulents wayfarers DIY + YOLO four loko jianbing farm-to-table unicorn vice. + + Mumblecore semiotics raw denim palo santo chartreuse helvetica + shabby chic, distillery pabst poke swag copper mug blue bottle. + @endpar + +@attention + Use an attention command if this message is really important. + +@attention + @parblock + An attention block with more than one paragraph: + + @code + some_code(23) + @endcode + + Elit dolore pariatur ex anim officia cupidatat adipisicing mollit + incididunt irure anim nostrud. + @endparblock + +@param[in] param + Description of this parameter. +@param[in] other_param + @parblock + Description of this other parameter. Nulla consequat tempus libero, + sed finibus velit. + + Offal actually vinyl taiyaki kickstarter etsy. + @endparblock +@param[out] out_param + On success, \bt_p{*out_param} contains to something + useful. + +@retval #SOME_STATUS_OK + Success. +@retval #SOME_STATUS_MEMORY_ERROR + Out of memory. +@retval #SOME_STATUS_ERROR + @parblock + Longer description for this specific status. + + Organic locavore sartorial 3 wolf moon brooklyn, VHS pug distillery + schlitz tofu banjo chambray you probably haven't heard of them hot + chicken copper mug. + + Neutra kale chips kombucha, salvia green juice live-edge swag + biodiesel scenester austin yuccie dreamcatcher cronut small batch. + @endparblock + +@bt_pre_not_null{param} +@bt_pre_not_null{other_param} +@bt_pre_hot{param} +@pre + \bt_p{param} is like this or like that. + +@bt_post_ref_cnt_same{other_param} +@post + \bt_p{other_param} is still in some state, and woke jean waistcoat. + +@sa bt_some_other_function() — + Does something else with a parameter. +@sa bt_another_function() — + Cardigan celiac palo santo, tacos chicharrones pitchfork chambray + photo booth subway tile 90's street. +*/ +---- + +Parts: + +. **Opening Doxygen comment**. ++ +Use `/*!`. + +. **Brief description**. ++ +Use third person singular in the simple present tense: you are +documenting what the function does. Assume that the sentence implicitly +starts with "`This function`". ++ +Try to mention, briefly, all the parameters (with `\bt_p`) and what the +function returns. ++ +End the sentence with a period. + + +. **Detailed description**. ++ +Write complete sentences. ++ +Refer to parameters (with `\bt_p`) as much as possible. ++ +In general, keep paragraphs short: often, a single sentence is enough. ++ +Write notes (`@note` command), remarks (`@remark` command), or +attentions (`@attention` command) when appropriate. Most notes and +remarks, however, can be simple paragraphs. Use `@parblock` end +`@endparblock` to have more than one note/remark/warning paragraph. + +. **Parameter descriptions** (if any). ++ +Use the `@param[in]`, `@param[out]`, and `@param[in,out]` commands +depending on the parameter direction. ++ +Document parameters in the declaration order. ++ +Refer to other parameters (with `\bt_p`) when useful for the reader. ++ +End each description with a period. ++ +Use `@parblock` end `@endparblock` to have more than one paragraph for a +given parameter description. ++ +Make sure there's no blank line, except within a `@parblock` block, +within the parameter description block so that Doxygen puts all the +descriptions in the same section. For example, **do not** write this: ++ +---- +@param[in] hexagon + Ugh literally +1 aesthetic, fashion axe try-hard mixtape pork belly + four loko. + +@param[in] selfies + Brooklyn ethical migas, viral edison bulb meggings butcher + flexitarian letterpress humblebrag kombucha pour-over etsy sriracha + blog. +---- + + +. **Return value** (if any). ++ +-- +* If the function returns a status code, use the `@retval` command + multiple times to document each status: ++ +---- +@retval #BT_VALUE_COPY_STATUS_OK + Success. +@retval #BT_VALUE_COPY_STATUS_MEMORY_ERROR + Out of memory. +---- ++ +End each description with a period. ++ +Use `@parblock` end `@endparblock` to have more than one paragraph +for a given return value description. ++ +Make sure there's no blank line, except within a `@parblock` block, +within the return value description block so that Doxygen puts all the +descriptions in the same section. For example, **do not** write this: ++ +---- +@retval #BT_VALUE_COPY_STATUS_OK + Success. + +@retval #BT_VALUE_COPY_STATUS_MEMORY_ERROR + Out of memory. +---- + +* If the function returns a simple value, use the `@returns` command + to document it. ++ +Refer to parameters (with `\bt_p`) when useful for the reader. ++ +End the description with a period. +-- + +. **Preconditions** (if any). ++ +List all the function's preconditions with the `@pre` command or any +alias which starts with `@bt_pre`. ++ +Use the simple present tense. ++ +Do not write the word "`must`" as a precondition is already a +requirement. ++ +End the description with a period. ++ +Make sure there's no blank line within the precondition description +block so that Doxygen puts all the descriptions in the same section. For +example, **do not** write this: ++ +---- +@bt_pre_hot{param} + +@pre + \bt_p{param} is like this or like that. +---- + +. **Postconditions** (if any). ++ +List all the function's _relevant_ postconditions with the `@post` +command or any alias which starts with `@bt_post`. ++ +Anything that the function's documentation body describes and which +forms the nature of the function does not need to be written as an +explicit postcondition. For example, if a function adds some object A +to some object B, do not write the postcondition "B contains A". ++ +Use the simple present tense. ++ +End the description with a period. ++ +Make sure there's no blank line within the postcondition description +block so that Doxygen puts all the descriptions in the same section. For +example, **do not** write this: ++ +---- +@bt_post_ref_cnt_same{other_param} + +@post + \bt_p{other_param} is still in some state, and woke jean waistcoat. +---- + +. **Items to see also** (if any). ++ +Use the `@sa` command, multiple times if needed, to refer to related +functions or types. ++ +This is a way for you to inform the reader about other existing, related +items. Keep in mind that the reader does not always know where to look +for things. ++ +In the referred item's brief description, do _not_ mention its +parameters, if any. ++ +End each brief description with a period. ++ +Make sure there's no blank line within the "`see also`" description +block so that Doxygen puts all the descriptions in the same section. For +example, **do not** write this: ++ +---- +@sa bt_some_other_function() — + Does something else with a parameter. + +@sa bt_another_function() — + Cardigan celiac palo santo, tacos chicharrones pitchfork chambray + photo booth subway tile 90's street. +---- + + +== Writing style + +The ultimate goal of the Babeltrace{nbsp}2 C API documentation is to +make the layman write code using this API as fast and correct as +possible without having to ask for help. For this purpose, the +documentation must be as clear as possible, just like the function and +type names try to be. + +Do not hesitate to repeat technical terms, even in the same sentence, if +needed. For example, if you document a "`value object`", then always use +the term "`value object`" in the documentation, not "`value`", nor +"`object`", since they are ambiguous. + +You can use light emphasis to show the importance of a part of the text +with the `\em` command (one word) or by surrounding the text to +emphasize with `` and ``. Likewise, you can use strong emphasis +when needed with the `\b` command (one word) or with `` and +``. In general, prefer light emphasis to strong emphasis, and +use it economically. + +Links to other parts of the documentation are very important. Consider +that the reader never knows that other functions exist other than the +one she's reading. Use as many internal links as possible. Use the +following forms of links: + +`__func__()`:: + Automatic link to the function or macro named `__func__`. + +`#__name__`:: + Automatic link to the type or enumerator named `__name__`. + +`\ref __ref__`:: + Link to `__ref__` (page name, group name, function or macro name, + type name, variable name, etc.) using its default text. + +`\ref __ref__ "__some text__"`:: + Link to `__ref__` (page name, group name, function or macro name, + type name, variable name, etc.) using the text `__some text__`. + +See Doxygen's http://www.doxygen.nl/manual/autolink.html[Automatic link +generation] for other ways to create automatic links. + +Follow, as much as possible, the +https://docs.microsoft.com/en-ca/style-guide/welcome/[Microsoft Style +Guide] when you document the API. This includes: + +* Use an active voice. +* Use a gender-neutral language. +* Use the present tense (you almost never need the future tense). +* Address your reader directly (use "`you`"). +* Use contractions ("`it's`", "`you're`", "`don't`", and the rest). +* Avoid anthropomorphism. +* Ensure parallelism in lists, procedures, and sentences. +* Terminate list items with a period. +* Do not use Latin abbreviations. +* Use "`and`" or "`or`" instead of a slash. +* Avoid using negatives. +* Avoid using "`should`": most of the time, you mean "`must`", and + that's very clear for the reader. diff --git a/doc/api/libbabeltrace2/dox/api-fund.dox b/doc/api/libbabeltrace2/dox/api-fund.dox new file mode 100644 index 00000000..f8026b29 --- /dev/null +++ b/doc/api/libbabeltrace2/dox/api-fund.dox @@ -0,0 +1,569 @@ +/*! +@page api-fund API fundamentals + +This page explains the basic principles of the \bt_api. + +You \em must understand what the API expects before you create a +\bt_name \bt_plugin or an application which uses the API. + +@section api-fund-header Header file + +To use the \bt_api, include %babeltrace2/babeltrace.h: + +@code +#include +@endcode + +Do \em not include any other header file found in the \c babeltrace2 +directory: the compiler prints an error when you try to. + +@section api-fund-ns Namespace + +- All libbabeltrace2 functions and types start with \c bt_. + +- All libbabeltrace2 definitions, macros, and enumerators start + with \c BT_. + +@section api-fund-pre-post Function precondition and postcondition checking + +All the functions of libbabeltrace2 which have parameters check that +the caller meets their +preconditions. + +All the functions of libbabeltrace2 which call a user function which +returns something check that the returned value meets their +postconditions. + +The function descriptions in the +API reference modules +list all their preconditions and postconditions, if any. + +libbabeltrace2 is very strict regarding function preconditions and +postconditions: when you break any of them, the library prints how the +precondition or postcondition was not satisfied, with details, and then +calls abort(). + +Here's an example of what the library prints to the standard error +before aborting when you break a precondition: + +@code{.unparsed} +10-06 09:12:20.228 62362 62362 F LIB/VALUE bt_value_array_get_length@value.c:887 Babeltrace 2 library precondition not satisfied; error is: +10-06 09:12:20.228 62362 62362 F LIB/VALUE bt_value_array_get_length@value.c:887 Value object is NULL: +10-06 09:12:20.228 62362 62362 F LIB/VALUE bt_value_array_get_length@value.c:887 Aborting... +@endcode + +Because precondition and postcondition checks detect programming errors, +libbabeltrace2's approach is to abort as soon as possible so that you +fix the error. Therefore, the libbabeltrace2 functions never return a +programming error status (like what \c EINVAL means on Unix systems, for +example). + +@attention + Some precondition and postcondition checks which occur on the fast + path and which would therefore significantly impact performance + during a typical trace processing \bt_graph run are only enabled in + \ref guide-build-bt2-dev "developer mode". + +Common function preconditions are: + +- A pointer parameter is not \c NULL. + +- An index parameter is not ouf of bounds. + +- A string or container parameter is not empty. + +- An object parameter has a given conceptual type. For example, you + cannot call bt_value_array_get_length() with a + \bt_bool_val. + +- An object parameter is not \ref api-fund-freezing "frozen". + +- An object parameter has some specific state. + +@section api-fund-object Object model + +The \bt_api is +object-oriented. + +With a few exceptions, API functions are actually +methods +which operate on objects: their first parameter points to said object. +For example: + +@code +uint64_t bt_value_array_get_length(const bt_value *value); +@endcode + +You can create some types of objects with functions that contain the +word \c create, while for some other types, only the library can create +them behind the scenes. For example, you can create a +\bt_bool_val object with bt_value_bool_create(), but you cannot directly +create a \bt_ev object: you need to borrow one from a \bt_ev_msg which +contains it. + +Each type of object has its own C type. Learn more about typing in +\ref api-fund-c-typing below. + +Some types of objects conceptually inherit other types of objects. If an +object type A inherits an object type B, then you can use both the A and +B API functions with an object of type A. For example, because an +\bt_enum_fc \em is conceptually an \bt_int_fc, you can use any integer +field class function with an enumeration field class. +The API reference modules always +indicate the inheritance relations. + +@subsection api-fund-object-shared-unique Shared vs. unique objects + +Some \bt_name objects are \em shared while some others are \em unique: + +

+
\anchor api-fund-shared-object Shared object
+
+ A \em shared object has a reference + count. + + A shared object's creation function returns a \em new reference. + + The API of a given shared object type contains: + + - A function to get a new reference, increasing the reference count, + which ends with \c _get_ref. + + - A function to put an existing reference, decreasing the reference + count, which ends with \c _put_ref. + + - A macro to put an existing reference and then set the passed + expression to \c NULL. This macro ends with \c _PUT_REF_AND_RESET. + + - A macro to move an existing reference from a source expression to + a destination expression, putting the destination expression's + existing reference, and setting the source expression to \c NULL. + This macro ends with \c _MOVE_REF. + + For example, bt_value_get_ref() and bt_value_put_ref() get and put + \bt_val object references, BT_VALUE_PUT_REF_AND_RESET() puts a + value reference and sets the expression to \c NULL, and + BT_VALUE_MOVE_REF() moves a value reference. + + All *_get_ref() and *_put_ref() functions, + and all *_PUT_REF_AND_RESET() macros accept a \c NULL + parameter. + + When the reference count of a given object reaches zero, it \em can + be destroyed. Some shared objects, however, have a lifetime that is + managed by another shared object. For example, an \bt_ev_cls is not + destroyed until its parent \bt_stream_cls is also destroyed, even if + its reference count technically reaches zero. + + A function which accepts a shared object never "takes" or steals the + caller's reference unless its name contains the word \c move: you + still have your own reference when the function returns. For + example: + + @code + bt_event_class *event_class = bt_event_class_create(stream_class); + + /* + * At this point, we still have a reference of `stream_class`. + * We need to put it with bt_stream_class_put_ref() at some point. + */ + @endcode + + A function which contains the word \c borrow returns a + borrowed reference: if you need your own reference, get + one with the appropriate *_get_ref() function. +
+ +
\anchor api-fund-unique-object Unique object
+
+ A \em unique object does not have a reference count: another object + is always its sole owner. + + Because you cannot get a new unique object reference, you \em must + ensure that you own the unique object's owner to keep it alive. The + API reference modules make it + clear, depending on the context, which + shared object is the ultimate owner of a given unique object. + + In general, you cannot create a unique object: the library creates + it, and then you \em borrow it from another object (shared or unique + itself). + + Unique objects exist for performance reasons: some optimizations are + challenging to implement without this concept. +
+
+ +In the API reference, each module +indicates whether the documented objects are shared or unique. + +@subsection api-fund-freezing Object freezing + +The library can \em freeze some types of \bt_name objects when specific +functions succeed. + +A frozen object is immutable: trying to set an object's property once +it's frozen represents a \ref api-fund-pre-post "precondition" break. + +For example, the library freezes the source \bt_comp initialization +parameters when you call bt_graph_add_source_component(): this +guarantees to the component's +\ref api-comp-cls-dev-meth-init "initialization method" that the +parameters will never change for the rest of their lifetime. + +When an object becomes frozen, its contained objects, if any, also +become frozen, recursively. + +There's no function to check whether or not a given object is frozen. +Because the API reference modules +document which functions freeze which objects, +the "frozen" property is only useful for libbabeltrace2 to catch +programming errors (\ref api-fund-pre-post "precondition checks"). + +@attention + Some "frozen" property checks which occur on the fast path and which + would therefore significantly impact performance during a typical trace + processing \bt_graph run are only enabled in + \ref guide-build-bt2-dev "developer mode". + +@section api-fund-c-typing C typing + +The \bt_api typing system is very strict to catch many programming +errors at compile time. + +Each type of object has its own C type. Consequently, functions accept +and return specific C types. For example, all the \bt_ev functions +accept a #bt_event pointer. + +The API uses +opaque pointers, +so that you don't having access to the object type's actual C structure. +This helps with the development of features and fixes in future releases +of \bt_name. + +Some objects share the same C type when different conceptual types can +be contained in some collection. For example, all \bt_val objects have +the type #bt_value because an \bt_array_val can contain different +types of values. You must be careful to only call the functions which +apply to a specific type of such objects. +The API reference modules make +this clear in the precondition section. Such objects always have a +*_get_type() function to get the object's exact type +enumerator. For example, bt_value_get_type() returns the type enumerator +of a given \bt_val object. + +When an object type A conceptually inherits an object type B, and when A +and B have different C types, the API offers a dedicated, inline +upcasting function named bt_A_as_B() to have access to the B +API at no cost. For example, an \bt_uenum_fc mapping \em is conceptually +an \bt_enum_fc mapping, but they have different C types: +#bt_field_class_enumeration_unsigned_mapping and +#bt_field_class_enumeration_mapping. Get the latter from the former with +bt_field_class_enumeration_unsigned_mapping_as_mapping_const(). +The bt_A_as_B() functions do not change the object's +reference count and they accept \c NULL. + +@attention + \b Never directly cast a \bt_name object pointer from some C type to + another C type: the API is designed so that you never need to do + that. + +@subsection api-fund-const const correctness + +The \bt_api is const-correct: when a function has a +\c const object pointer parameter, it never modifies that object from +the user's viewpoint. + +As such, when a function returns a \c const object pointer, directly or +through an output parameter, you can't modify the object. + +@attention + \b Never remove a \bt_name object pointer's \c const qualifier. The + API is designed so that you never need to do that. + +Functions which accept or return a \c const object pointer end with +\c _const when they have (or could have in the future) a non \c const +equivalent. For example, bt_value_map_borrow_entry_value_const() is the +\c const version of bt_value_map_borrow_entry_value(). + +Simple property getter functions do not end with \c _const. + +\ref api-fund-shared-object "Reference count" changing functions, ending +with \c _get_ref and \c _put_ref(), accept a \c const object pointer +parameter: the library does not consider that an object's nature is +altered when its reference count changes. + +@subsection api-fund-int-types C integer types + +The API only uses \c uint64_t and \c int64_t as C integer types for +clarity and consistency. + +@subsection api-fund-common-types Common C types and definitions + +There are a few C types and definitions which are common to many parts +of the \bt_api. + +See \ref api-common-types. + +@section api-fund-func-status Function return + +libbabeltrace2 functions which cannot fail return a property or an +object pointer directly. For example, bt_value_array_get_length() +returns the length of an \bt_array_val, and +bt_value_array_borrow_element_by_index_const() returns a \bt_val +contained in an \bt_array_val. Both functions cannot fail: any +programming error \ref api-fund-pre-post "makes the program abort". + +When a function returns an optional property or object: + +
+
If it's a pointer
+
+ The function returns \c NULL if the property/object is missing. +
+ +
If it's not a pointer
+
+
+
If the property is available
+
+ The function returns the property by output parameter and returns + #BT_PROPERTY_AVAILABILITY_AVAILABLE. +
+ +
If the property is not available
+
+ The function returns #BT_PROPERTY_AVAILABILITY_NOT_AVAILABLE. +
+
+
+
+ +Many libbabeltrace2 functions return a status code, that is, a C +enumerator containing the word \c STATUS. For example, +bt_value_copy() returns either #BT_VALUE_COPY_STATUS_OK or +#BT_VALUE_COPY_STATUS_MEMORY_ERROR. + +Although the API guarantees that any status enumerator which has the +\c _OK status has the value 0, we recommend that you compare the +returned value to exact status enumerators for clarity, for example: + +@code +bt_value_copy_status status = bt_value_copy(obj, &val_copy); + +if (status != BT_VALUE_COPY_STATUS_OK) { + /* handle error */ +} +@endcode + +The API reference modules +document, for each function, what each return status enumerator means. + +Some functions return properties or objects by output parameter. When +such a function which accepts a property or object pointer \c ptr fails, +the library does \em not guarantee that *ptr remains +unchanged. Therefore, such a pattern is \em not safe: + +@code +bt_some_object *some_object = NULL; + +status = bt_get_some_object(obj, &some_object); + +if (some_object) { + /* ... */ +} +@endcode + +Always rely on the returned status code: + +@code +bt_some_object *some_object; + +status = bt_get_some_object(obj, &some_object); + +if (status == BT_GET_SOME_OBJECT_STATUS_OK) { + /* ... */ +} +@endcode + +@section api-fund-user-classes User classes + +The whole \bt_name project is about extensibility: you can implement +\bt_p_comp_cls, and then package and distribute them as +\bt_p_plugin. + +When you implement a \bt_name \bt_comp_cls, you override protected +methods, just like you would do in any +object-oriented programming +(OOP) language. + +Here's the mapping of typical OOP language features to the +\bt_name library domain: + + + + + + + + + + +
OOP concept + \bt_name equivalent +
User class. + + Class object with implemented user functions. + + For example: #bt_component_class_source. +
User class instance. + + Instance object, created from a class object. + + For example: #bt_component_source. +
+ Instance pointer (\c this keyword in C++/Java and \c self variable + in Python, for example). + + "Self" (private) object. + + A "self" object has a specific, dedicated C type which starts + with bt_self_. + + For example: #bt_self_component_source. +
Protected, final method. + + Library function accepting an instance pointer ("self" object) as + its first parameter. + + Those functions always start with bt_self_. + + For example: bt_self_component_source_add_output_port(). +
Protected, overridable method. + + User function with a specific signature, accepting an instance + pointer ("self" object) as its first parameter. + + For example: #bt_component_class_source_initialize_method. +
Private user method. + + Custom \c static user function having access to the instance + pointer ("self" object) somehow. +
Private user property or attribute. + + Custom \bt_voidp data which you set and get using + dedicated protected methods (for example, + bt_self_component_set_data() and bt_self_component_get_data()). +
+ +@section api-fund-error Error reporting + +libbabeltrace2 features a rich \ref api-error "error reporting" +mechanism to augment an error with custom causes without having to +explicitly pass an error object to the library functions. + +When a library function or \ref api-fund-user-classes "user method" +returns an error status code (any status enumerator which contains +the word \c ERROR), it \em can add one or more error causes to the +current thread's error object. + +This makes it possible for the end user to understand the contexts which +lead to the error, possibly across many \bt_p_plugin written by +different developers. + +An error cause contains information about the source location where the +error occured, the actor involved in the error, and a message. + +When you "catch" an error, that is, react to a function returning an +error status code without returning an error status code yourself, +you can: + +- Take the current thread's error with bt_current_thread_take_error() to + get its causes, possibly presenting them to the end user. + + You then need to release the error with bt_error_release(). + +- Clear the current thread's error with bt_current_thread_clear_error(). + +@attention + You \em cannot call any libbabeltrace2 function when the current + thread has an error, except the + \ref api-fund-shared-object "reference counting" functions (ending + with _get_ref() or _put_ref()). + +The +babeltrace2 +CLI uses this feature to pretty-print an error's causes to the end user, +for example: + +@code{.unparsed} +ERROR: [Babeltrace CLI] (babeltrace2.c:2521) + Cannot create components. +CAUSED BY [Babeltrace CLI] (babeltrace2.c:2336) + Cannot create component: plugin-name="ctf", comp-cls-name="fs", comp-cls-type=0, + comp-name="auto-disc-source-ctf-fs" +CAUSED BY [libbabeltrace2] (graph.c:1343) + Component initialization method failed: status=ERROR, comp-addr=0x562fbd275f40, + comp-name="auto-disc-source-ctf-fs", comp-log-level=WARNING, comp-class-type=SOURCE, + comp-class-name="fs", comp-class-partial-descr="Read CTF traces from the file sy", + comp-class-is-frozen=1, comp-class-so-handle-addr=0x562fbd285810, + comp-class-so-handle-path="/usr/lib/babeltrace2/plugins/babeltrace-plugin-ctf.so", + comp-input-port-count=0, comp-output-port-count=0 +CAUSED BY [auto-disc-source-ctf-fs: 'source.ctf.fs'] (fs.c:1148) + Cannot create trace for `/path/to/trace`. +CAUSED BY [auto-disc-source-ctf-fs: 'source.ctf.fs'] (fs.c:928) + Cannot add stream file `/path/to/trace/channel0_1` to stream file group +CAUSED BY [auto-disc-source-ctf-fs: 'source.ctf.fs'] (fs.c:734) + Cannot get stream file's first packet's header and context fields (`/path/to/trace/channel0_1`). +@endcode + +@section api-fund-logging Logging + +libbabeltrace2 contains many hundreds of logging statements to help you +follow and debug your \bt_plugin or program. + +By default, the library's logging is disabled. To enable it, use +bt_logging_set_global_level(). + +To set the library's initial logging level (checked once at library +loading time), set the \c LIBBABELTRACE2_INIT_LOG_LEVEL environment +variable, with one of: + +- \c N or \c NONE +- \c F or \c FATAL +- \c E or \c ERROR +- \c W, \c WARN, or \c WARNING +- \c I or \c INFO +- \c D or \c DEBUG +- \c T or \c TRACE + +By default, the minimal, build-time logging level is \em DEBUG. We +recommend that you build libbabeltrace2 with the \em TRACE minimal +logging level for development. See \ref guide-build-bt2-dev. + +libbabeltrace2 writes its logging statements to the standard error +stream. + +A libbabeltrace2 (and \bt_name project plugin) logging line looks like +this: + +@code{.unparsed} +05-11 00:58:03.691 23402 23402 D VALUES bt_value_destroy@values.c:498 Destroying value: addr=0xb9c3eb0 +@endcode + +The line contains, in order: + +-# The date and time (05-11 00:58:03.691). + +-# The process and thread IDs (23402 23402). + +-# The logging level (\c D for \em DEBUG). + +-# The function logging (\c bt_value_destroy). + +-# The file and line number logging (values.c:498). + +-# The message, which typically ends with a list of fields adding + details. +*/ diff --git a/doc/api/libbabeltrace2/dox/examples.dox b/doc/api/libbabeltrace2/dox/examples.dox new file mode 100644 index 00000000..507b6e4b --- /dev/null +++ b/doc/api/libbabeltrace2/dox/examples.dox @@ -0,0 +1,233 @@ +/*! +@page examples Examples + +The examples of this section apply the different parts of the +libbabeltrace2 API to accomplish real tasks. + +The available examples are: + +- \subpage example-simple-plugin-def-file +- \subpage example-simple-src-cmp-cls +- \subpage example-simple-flt-cmp-cls +- \subpage example-simple-sink-cmp-cls + +@page example-simple-plugin-def-file Simple shared object plugin definition C file + +This example shows a basic \bt_name +\ref api-plugin-dev "shared object plugin" definition C file. + +The shared object plugin's name is vestige. Therefore +the \c input and \c output \bt_p_comp_cls would be identified in the +\bt_cli command-line tool as \c source.vestige.input and +sink.vestige.output. + +Assume that \c vestige.c contains the actual source and sink component +classes's code, and that \c vestige.h contains its declarations. + +vestige-plugin.c: + +@include vestige-plugin.c + +See \ref guide-comp-link-plugin-so to learn how you could compile and +link those files as a \bt_name shared object plugin. + +@page example-simple-src-cmp-cls Simple source component class + +This example shows a basic \bt_src_comp_cls packaged as a +\ref api-plugin-dev "shared object plugin". + +The name of the plugin is dust and the name of the source +component class is input. Therefore the +component class is identified in the \bt_cli +command-line tool as source.dust.input. + +A source.dust.input \bt_comp reads a text file having this +fictitious format: + +@verbinclude dust + +That is: + +- Each line represents an event record. +- For a given line: + - The first token is the + Unix timestamp + (seconds since the Unix epoch) of the record. + - The second token is a number of microseconds to add to the Unix + timestamp. + - The third token is the event record's name: only \c send-msg and + \c recv-msg are possible. + - The remaining characters form the event record's message (payload). + +A source.dust.input component accepts a single +\ref api-comp-cls-dev-meth-init "initialization parameter", +path, which is the path of the file to open and read. + +A source.dust.input component creates a single +\bt_oport named out. + +For each line of the input file, a source.dust.input +component's \bt_msg_iter emits an \bt_ev_msg. + +To simplify this example, a source.dust.input component is +not resilient and needs a valid input and valid initialization +parameters. The code also doesn't check the return status codes of API +functions for simplicity, but you must check them in production code. + +The source component class implementation and the shared object plugin +macros are in the same file, dust.c: + +@include dust.c + +As per the \ref guide-comp-link-plugin-so guide, you can build the +shared object plugin as such: + +@code{.unparsed} +$ cc dust.c -fPIC -c $(pkg-config --cflags babeltrace2) +$ ld dust.o -o dust.so -shared $(pkg-config --libs babeltrace2) +@endcode + +With the \bt_cli tool, assuming you have a valid input file named +dust, you can view the event messages that a +source.dust.input message iterator emits: + +@code{.unparsed} +$ babeltrace2 --plugin-path=. --component=source.dust.input --params='path="dust"' +@endcode + +The output is similar to: + +@code{.unparsed} +[17:10:37.154215000] (+?.?????????) send-msg: { msg = "Jowl pig filet mignon, turducken capicola." } +[17:10:37.200774000] (+0.046559000) recv-msg: { msg = "Pork belly pig burgdoggen venison bacon." } +[17:10:41.001831000] (+3.801057000) send-msg: { msg = "Bacon ipsum dolor amet strip steak." } +[17:10:41.944187000] (+0.942356000) send-msg: { msg = "Spare ribs filet mignon boudin bresaola." } +[17:10:45.115406000] (+3.171219000) recv-msg: { msg = "Rump cow t-bone hamburger short tenderloin." } +@endcode + +You can also view more details with + +@code{.unparsed} +$ babeltrace2 --plugin-path=. --component=source.dust.input --params='path="dust"' \ + --component=sink.text.details +@endcode + +@page example-simple-flt-cmp-cls Simple filter component class + +This example shows a basic \bt_flt_comp_cls packaged as a +\ref api-plugin-dev "shared object plugin". + +The name of the plugin is distill and the name of the +filter component class is theone. Therefore the +component class is identified in the \bt_cli +command-line tool as filter.distill.theone. + +A filter.distill.theone \bt_comp removes specific +\bt_p_ev_msg from a \bt_stream based on their \bt_ev_cls's name. + +A filter.distill.theone component accepts a single +\ref api-comp-cls-dev-meth-init "initialization parameter", +names, which is an \bt_array_val of string values. The +array value contains the names of the classes of the events to discard. + +A filter.distill.theone component creates a single +\bt_iport named in and a single \bt_oport named +out. + +To simplify this example, a filter.distill.theone component +is not resilient and needs a valid input and valid initialization +parameters. The code also doesn't check the return status codes of API +functions for simplicity, but you must check them in production code. + +The filter component class implementation and the shared object plugin +macros are in the same file, distill.c: + +@include distill.c + +As per the \ref guide-comp-link-plugin-so guide, you can build the +shared object plugin as such: + +@code{.unparsed} +$ cc distill.c -fPIC -c $(pkg-config --cflags babeltrace2) +$ ld distill.o -o distill.so -shared $(pkg-config --libs babeltrace2) +@endcode + +With the \bt_cli tool, you can use a +filter.distill.theone component, reading a +CTF trace +(see \bt_man{babeltrace2-source.ctf.fs,7}) for example: + +@code{.unparsed} +$ babeltrace2 --plugin-path=. /path/to/ctf/trace \ + --component=filter.distill.theone \ + --params='names=["sched_switch", "rcu_utilization", "kmem_kfree"]' +@endcode + +@page example-simple-sink-cmp-cls Simple sink component class + +This example shows a basic \bt_sink_comp_cls packaged as a +\ref api-plugin-dev "shared object plugin". + +The name of the plugin is epitome and the name of the +sink component class is output. Therefore the component +class is identified in the \bt_cli +command-line tool as sink.epitome.output. + +A sink.epitome.output \bt_comp prints one text line to +the standard output for each \bt_ev_msg it consumes, for +example: + +@code{.unparsed} +#1: kmem_kmalloc (5 payload members) +#2: kmem_kfree (2 payload members) +#3: sched_waking (4 payload members) +#4: sched_migrate_task (5 payload members) +#5: sched_stat_runtime (4 payload members) +#6: sched_wakeup (4 payload members) +#7: rcu_utilization (1 payload member) +#8: rcu_utilization (1 payload member) +#9: sched_switch (7 payload members) +#10: syscall_entry_write (3 payload members) +... +@endcode + +For each line, there is: + +- The event message's index (simple counter). +- The event message's \bt_ev_cls \ref api-tir-ev-cls-prop-name "name". +- The number of members in the event message's \bt_ev's + \ref api-tir-ev-prop-payload "payload field". + +A sink.epitome.output component does not need any +\ref api-comp-cls-dev-meth-init "initialization parameter": it just +prints to the standard output. + +A sink.epitome.output component creates a single +\bt_iport named in. + +To simplify this example, a sink.epitome.output component +doesn't check the return status codes of API functions, +but you must check them in production code. + +The sink component class implementation and the shared object plugin +macros are in the same file, epitome.c: + +@include epitome.c + +As per the \ref guide-comp-link-plugin-so guide, you can build the +shared object plugin as such: + +@code{.unparsed} +$ cc epitome.c -fPIC -c $(pkg-config --cflags babeltrace2) +$ ld epitome.o -o epitome.so -shared $(pkg-config --libs babeltrace2) +@endcode + +With the \bt_cli tool, you can use a +sink.epitome.output component, reading a +CTF trace +(see \bt_man{babeltrace2-source.ctf.fs,7}) for example: + +@code{.unparsed} +$ babeltrace2 --plugin-path=. /path/to/ctf/trace --component=sink.epitome.output +@endcode +*/ diff --git a/doc/api/libbabeltrace2/dox/group-trace-ir.dox b/doc/api/libbabeltrace2/dox/group-trace-ir.dox new file mode 100644 index 00000000..db258057 --- /dev/null +++ b/doc/api/libbabeltrace2/dox/group-trace-ir.dox @@ -0,0 +1,108 @@ +/*! +@defgroup api-tir Trace IR +@ingroup api-msg + +@brief + Intermediate representation of + tracing + domain objects and concepts (contents of \bt_p_msg). + +The \bt_name +trace IR (intermediate representation) modules +contain everything you need to represent tracing domain concepts and +objects so that many \bt_p_comp, written by different authors, can +exchange trace metadata and data. + +The trace IR objects are divided into two main categories: + +
+
Metadata
+
+ Classes of data objects. + + A metadata object describes many data objects. + + For example, an \bt_ev_cls describes the numeric ID, name, logging + level, and \ref api-tir-fc "classes" of payload \bt_p_field of all + the \bt_p_ev you create from it. + + Metadata objects are one of the most valuable concepts of + \bt_name: because they describe the structures of many + data objects at once, they enable great space and time + optimizations. + + For example, a \bt_sink_comp which writes a trace following a + metadata-supporting format, such as the + Common Trace Format, can + serialize the metadata objects once so that the data objects are + more compact and take less time to write. + + The metadata objects are: + + - \bt_c_clock_cls + - \bt_c_ev_cls + - \bt_cp_fc + - \bt_c_field_path + - \bt_c_stream_cls + - \bt_c_trace_cls +
+ +
Data
+
+ Instances of metadata objects. + + For example, a \bt_stream is an instance of a \bt_stream_cls. + + The data objects are: + + - \bt_c_cs + - \bt_c_ev + - \bt_cp_field + - \bt_c_pkt + - \bt_c_stream + - \bt_c_trace +
+
+ +The trace IR metadata to data object association is: + + + + + + + + +
Metadata object + Data object +
\bt_c_clock_cls + Stream clock (see \ref api-tir-cs) +
\bt_c_ev_cls + \bt_c_ev +
\bt_c_fc + \bt_c_field +
\bt_c_stream_cls + \bt_c_stream +
\bt_c_trace_cls + \bt_c_trace +
+ +Within a trace processing \bt_graph, \bt_p_msg carry data objects from +\bt_comp to component. + +You need to create metadata objects \em before you create data objects. +You can then use the data objects to create messages. + +For example, you need a \bt_stream_cls to create a \bt_stream. With +a \bt_stream, you can create a \bt_p_sb_msg, \bt_p_se_msg, \bt_p_ev_msg, +and other types of messages. + +Usually, when you create a data object from a metadata object, the +metadata object becomes \ref api-fund-freezing "frozen": you cannot +modify it for the rest of its lifetime. + +All metadata objects and some data objects have an optional user +attributes property (a \bt_map_val): you can use it to attach +custom attributes, without any semantics specified by the \bt_name +project, to those objects. +*/ diff --git a/doc/api/libbabeltrace2/dox/guides.dox b/doc/api/libbabeltrace2/dox/guides.dox new file mode 100644 index 00000000..ad2166f0 --- /dev/null +++ b/doc/api/libbabeltrace2/dox/guides.dox @@ -0,0 +1,211 @@ +/*! +@page guides Guides + +The guides in this section are step-by-step procedures to accomplish +common tasks with libbabeltrace2. + +Guides help you navigate through the most important features of +the library and its API. + +Make sure to eventually read \ref api-fund before you use the \bt_api +seriously. + +The available guides are: + +- \subpage guide-build-bt2-dev +- \subpage guide-comp-link-plugin-so +- \subpage guide-comp-link-app + +@if meow + +- \subpage guide-create-graph +- \subpage guide-write-min-src-comp-cls +- \subpage guide-write-min-flt-comp-cls +- \subpage guide-write-min-sink-comp-cls +- \subpage guide-write-simple-sink-comp-cls +- \subpage guide-create-plugin +- \subpage guide-write-full-src-comp-cls +- \subpage guide-write-full-flt-comp-cls +- \subpage guide-write-full-sink-comp-cls +- \subpage guide-query +- \subpage guide-seek-msg-iter +- \subpage guide-intr-graph +- \subpage guide-intr-query +- \subpage guide-graph-listeners + +@endif + +@page guide-build-bt2-dev Build Babeltrace 2 for development + +If you are developing a \bt_name \bt_plugin or an application which uses +libbabeltrace2, we recommend that: + +- You build \bt_name from source in developer mode. + + The \bt_name developer mode enables more \ref api-fund-pre-post + "precondition and postcondition" assertions to detect + programming errors. + +- You use \em TRACE as the minimal logging level at build time to have + access to more \ref api-fund-logging "logging", should you need it + to debug your plugin or application. + +To build \bt_name from source in developer mode and using \em TRACE +as the minimal logging level: + +
    +
  1. + Download the + \bt_name tarball and extract it. + + See the project's + README + for build-time requirements and detailed build instructions. +
  2. + Configure the build in developer mode and with the \em TRACE + minimal logging level: + +@code{.unparsed} +$ BABELTRACE_DEV_MODE=1 BABELTRACE_MINIMAL_LOG_LEVEL=TRACE ./configure +@endcode +
  3. + Build and install the project: + +@code{.unparsed} +$ make +# make install +@endcode +
+ +\bt_name developer mode build configuration command line examples: + +@code{.unparsed} +$ BABELTRACE_DEV_MODE=1 BABELTRACE_MINIMAL_LOG_LEVEL=TRACE ./configure \ + --enable-python-bindings --enable-python-plugins +@endcode + +@code{.unparsed} +$ BABELTRACE_DEV_MODE=1 BABELTRACE_MINIMAL_LOG_LEVEL=TRACE ./configure \ + --prefix="$PWD/install" --disable-man-pages --disable-debug-info +@endcode + +@note + @parblock + The development build creates a libbabeltrace2 library which is + slower to execute than a production (default) build. + + We believe that, during the development process, a less efficient, + but more strict library is more desirable than the opposite. + @endparblock + +@page guide-comp-link-plugin-so Compile and link a Babeltrace 2 shared object plugin + +To compile and link a \bt_name shared object plugin: + +
    +
  1. + Compile the plugin's C/C++ source files with the + \-fPIC + and + \-c + compiler options to produce position-independent code and + to compile without linking: + + @code{.unparsed} + $ cc my-plugin.c analysis.c -fPIC -c $(pkg-config --cflags babeltrace2) + @endcode +
  2. + +
  3. + Link the resulting object files with the + \-shared + linker option and with the \bt_name library: + + @code{.unparsed} + $ ld my-plugin.o analysis.o -o my-plugin.so -shared $(pkg-config --libs babeltrace2) + @endcode +
  4. +
+ +@note + At least one of your C/C++ files must declare a \bt_name plugin + and one or more \bt_p_comp_cls using the \ref api-plugin-dev macros. + +@page guide-comp-link-app Compile and link an application which uses libbabeltrace2 + +To compile and link an application which uses libbabeltrace2: + +
    +
  1. + Compile your C/C++ files as usual. +
  2. + +
  3. + Link the resulting object files with the \bt_name library: + + @code{.unparsed} + $ ld my-app.o analysis.o -o my-app $(pkg-config --libs babeltrace2) + @endcode +
  4. +
+ +@if meow + +@page guide-create-graph Create a graph from existing component classes and run it + +TODO! + +@page guide-write-min-src-comp-cls Write a minimal source component class + +TODO! + +@page guide-write-min-flt-comp-cls Write a minimal filter component class + +TODO! + +@page guide-write-min-sink-comp-cls Write a minimal sink component class + +TODO! + +@page guide-write-simple-sink-comp-cls Write a simple sink component class + +TODO! + +@page guide-create-plugin Create a Babeltrace 2 plugin + +TODO! + +@page guide-write-full-src-comp-cls Write a complete source component class + +TODO! + +@page guide-write-full-flt-comp-cls Write a complete filter component class + +TODO! + +@page guide-write-full-sink-comp-cls Write a complete sink component class + +TODO! + +@page guide-query Query an object from a component class + +TODO! + +@page guide-seek-msg-iter Make a message iterator seek + +TODO! + +@page guide-intr-graph Interrupt a running graph + +TODO! + +@page guide-intr-query Interrupt a query operation + +TODO! + +@page guide-graph-listeners Use graph listeners to react to topology events + +TODO! + +@endif +*/ diff --git a/doc/api/libbabeltrace2/dox/main-page.dox b/doc/api/libbabeltrace2/dox/main-page.dox new file mode 100644 index 00000000..22c1e5d3 --- /dev/null +++ b/doc/api/libbabeltrace2/dox/main-page.dox @@ -0,0 +1,124 @@ +/*! +@mainpage Välkommen! + +@note +This documentation (text and illustrations) is licensed under a +Creative +Commons Attribution-ShareAlike 4.0 International license. + +Welcome to the +\bt_api (libbabeltrace2) documentation! + +To get an idea of how to use the libbabeltrace2 API, have a look at +the \ref guides "guides" and \ref examples "examples". +That being said, we recommend that you read the \ref api-fund to +understand what the API expects exactly. + +If you are developing a \bt_name \bt_plugin or an application which +uses libbabeltrace2, we recommend that you +\ref guide-build-bt2-dev "build the \bt_name library for development". + +@section main-bt2-nutshell \bt_name in a nutshell + +\bt_name +is an open-source software project by +EfficiOS; its purpose is to +process or convert +traces. + +The \bt_name project contains: + +- A library, libbabeltrace2, which all the other parts rely on. + + libbabeltrace2 offers a + C99 interface. + + This documentation is about libbabeltrace2's API. + +- A command-line program, \bt_cli, which can convert and manipulate + traces. + +- Python 3 bindings which offer a Pythonic interface of + libbabeltrace2. + +- "Standard" plugins which ship with the project. + + Common Trace Format (CTF) input + and output, plain text input and output, and various utilities are + part of those plugins. + +With the \bt_name library, you can: + +- Write custom \ref api-comp-cls-src "source", + \ref api-comp-cls-flt "filter", \ref api-comp-cls-sink "sink" + component classes which you can package as \bt_p_plugin. + + Component classes are instantiated as \bt_p_comp within a trace + processing \bt_graph and components are assembled to accomplish a + trace manipulation or conversion job. + +- Load \bt_p_plugin, instantiate their component classes within a + trace processing \bt_graph, connect the components as needed, and + run the graph to accomplish a trace manipulation or conversion job. + + This is what the \bt_cli CLI tool's + convert + and + run + commands do, for example. + +A trace processing \bt_graph contains connected components. The specific +component topology determines the trace processing task to realize. + +@image html basic-convert-graph.png "A conversion graph, a specific trace processing graph." + +Between the components of a trace processing graph, \bt_p_msg flow from +\bt_p_oport to \bt_p_iport following the configured \bt_p_conn through +\bt_p_msg_iter. There are many types of messages, chief amongst which is +the \bt_ev_msg. + +With libbabeltrace2, you can also \ref api-qexec "query" some specific +object from a component class (for example, the available LTTng live sessions +of an LTTng relay daemon). +This is what the \bt_cli CLI tool's +query +command does, for example. + +Make sure to read \bt_man{babeltrace2-intro,7} +to learn even more about the \bt_name project and its core concepts. + +@section main-contents What's in this documentation? + +
+
\ref api-fund
+
+ Explains the basic principles of the \bt_api. + + Make sure you understand this section as you need this knowledge to + use the API correctly. +
+ +
\ref guides
+
+ Shows how to achieve common tasks with libbabeltrace2. + + Guides help you navigate through the most important features of + the library and its API. +
+ +
\ref examples
+
+ Contains simple and more complex examples which apply the different + parts of the API to accomplish real tasks. +
+ +
API reference
+
+ Documents all the \bt_name C functions, definitions, macros, + enumerators, and types. + + Each documentation module describes its API thoroughly and how it's + related to other modules. +
+
+*/ diff --git a/doc/api/libbabeltrace2/examples/distill.c b/doc/api/libbabeltrace2/examples/distill.c new file mode 100644 index 00000000..81fe2e82 --- /dev/null +++ b/doc/api/libbabeltrace2/examples/distill.c @@ -0,0 +1,284 @@ +#include +#include +#include +#include +#include +#include +#include + +/* Filter component's private data */ +struct distill { + /* Names of the classes of the events to discard (owned by this) */ + const bt_value *names_value; + + /* Component's input port (weak) */ + bt_self_component_port_input *in_port; +}; + +/* + * Initializes the filter component. + */ +static +bt_component_class_initialize_method_status distill_initialize( + bt_self_component_filter *self_component_filter, + bt_self_component_filter_configuration *configuration, + const bt_value *params, void *initialize_method_data) +{ + /* Allocate a private data structure */ + struct distill *distill = malloc(sizeof(*distill)); + + /* + * Keep a reference of the `names` array value parameter so that the + * "next" method of a message iterator can access it to decide + * whether or not to discard an event message. + */ + distill->names_value = + bt_value_map_borrow_entry_value_const(params, "names"); + bt_value_get_ref(distill->names_value); + + /* Set the component's user data to our private data structure */ + bt_self_component_set_data( + bt_self_component_filter_as_self_component(self_component_filter), + distill); + + /* + * Add an input port named `in` to the filter component. + * + * This is needed so that this filter component can be connected to + * a filter or a source component. With a connected upstream + * component, this filter component's message iterator can create a + * message iterator to consume messages. + * + * Add an output port named `out` to the filter component. + * + * This is needed so that this filter component can be connected to + * a filter or a sink component. Once a downstream component is + * connected, it can create our message iterator. + */ + bt_self_component_filter_add_input_port(self_component_filter, + "in", NULL, &distill->in_port); + bt_self_component_filter_add_output_port(self_component_filter, + "out", NULL, NULL); + + return BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_OK; +} + +/* + * Finalizes the filter component. + */ +static +void distill_finalize(bt_self_component_filter *self_component_filter) +{ + /* Retrieve our private data from the component's user data */ + struct distill *distill = bt_self_component_get_data( + bt_self_component_filter_as_self_component(self_component_filter)); + + /* Put all references */ + bt_value_put_ref(distill->names_value); + + /* Free the allocated structure */ + free(distill); +} + +/* Message iterator's private data */ +struct distill_message_iterator { + /* (Weak) link to the component's private data */ + struct distill *distill; + + /* Upstream message iterator (owned by this) */ + bt_message_iterator *message_iterator; +}; + +/* + * Initializes the message iterator. + */ +static +bt_message_iterator_class_initialize_method_status +distill_message_iterator_initialize( + bt_self_message_iterator *self_message_iterator, + bt_self_message_iterator_configuration *configuration, + bt_self_component_port_output *self_port) +{ + /* Allocate a private data structure */ + struct distill_message_iterator *distill_iter = + malloc(sizeof(*distill_iter)); + + /* Retrieve the component's private data from its user data */ + struct distill *distill = bt_self_component_get_data( + bt_self_message_iterator_borrow_component(self_message_iterator)); + + /* Keep a link to the component's private data */ + distill_iter->distill = distill; + + /* Create the uptream message iterator */ + bt_message_iterator_create_from_message_iterator(self_message_iterator, + distill->in_port, &distill_iter->message_iterator); + + /* Set the message iterator's user data to our private data structure */ + bt_self_message_iterator_set_data(self_message_iterator, distill_iter); + + return BT_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_STATUS_OK; +} + +/* + * Finalizes the message iterator. + */ +static +void distill_message_iterator_finalize( + bt_self_message_iterator *self_message_iterator) +{ + /* Retrieve our private data from the message iterator's user data */ + struct distill_message_iterator *distill_iter = + bt_self_message_iterator_get_data(self_message_iterator); + + /* Free the allocated structure */ + free(distill_iter); +} + +/* + * Returns `true` if `message` passes, that is, one of: + * + * * It's not an event message. + * * The event message does not need to be discarded based on its event + * class's name. + */ +static +bool message_passes(struct distill_message_iterator *distill_iter, + const bt_message *message) +{ + bool passes = true; + + /* Move as is if it's not an event message */ + if (bt_message_get_type(message) != BT_MESSAGE_TYPE_EVENT) { + passes = false; + goto end; + } + + /* Borrow the event message's event and its class */ + const bt_event *event = + bt_message_event_borrow_event_const(message); + const bt_event_class *event_class = bt_event_borrow_class_const(event); + + /* Get the event class's name */ + const char *name = bt_event_class_get_name(event_class); + + for (uint64_t i = 0; i < bt_value_array_get_length( + distill_iter->distill->names_value); i++) { + const char *discard_name = bt_value_string_get( + bt_value_array_borrow_element_by_index_const( + distill_iter->distill->names_value, i)); + + if (strcmp(name, discard_name) == 0) { + passes = false; + goto end; + } + } + +end: + return passes; +} + +/* + * Returns the next message to the message iterator's user. + * + * This method can fill the `messages` array with up to `capacity` + * messages. + * + * To keep this example simple, we put a single message into `messages` + * and set `*count` to 1 (if the message iterator is not ended). + */ +static +bt_message_iterator_class_next_method_status distill_message_iterator_next( + bt_self_message_iterator *self_message_iterator, + bt_message_array_const messages, uint64_t capacity, + uint64_t *count) +{ + /* Retrieve our private data from the message iterator's user data */ + struct distill_message_iterator *distill_iter = + bt_self_message_iterator_get_data(self_message_iterator); + + /* Consume a batch of messages from the upstream message iterator */ + bt_message_array_const upstream_messages; + uint64_t upstream_message_count; + bt_message_iterator_next_status next_status; + +consume_upstream_messages: + next_status = bt_message_iterator_next(distill_iter->message_iterator, + &upstream_messages, &upstream_message_count); + + /* Initialize the return status to a success */ + bt_message_iterator_class_next_method_status status = + BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_OK; + + switch (next_status) { + case BT_MESSAGE_ITERATOR_NEXT_STATUS_END: + /* End of iteration: put the message iterator's reference */ + bt_message_iterator_put_ref(distill_iter->message_iterator); + status = BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_END; + goto end; + case BT_MESSAGE_ITERATOR_NEXT_STATUS_AGAIN: + status = BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_AGAIN; + goto end; + case BT_MESSAGE_ITERATOR_NEXT_STATUS_MEMORY_ERROR: + status = BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_MEMORY_ERROR; + goto end; + case BT_MESSAGE_ITERATOR_NEXT_STATUS_ERROR: + status = BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_ERROR; + goto end; + default: + break; + } + + /* Output message array index */ + uint64_t i = 0; + + /* For each consumed message */ + for (uint64_t upstream_i = 0; upstream_i < upstream_message_count; + upstream_i++) { + /* Current message */ + const bt_message *upstream_message = upstream_messages[upstream_i]; + + /* Check if the upstream message passes */ + if (message_passes(distill_iter, upstream_message)) { + /* Move upstream message to output message array */ + messages[i] = upstream_message; + i++; + continue; + } + + /* Discard upstream message: put its reference */ + bt_message_put_ref(upstream_message); + } + + if (i == 0) { + /* + * We discarded all the upstream messages: get a new batch of + * messages, because this method _cannot_ return + * `BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_OK` and put no + * messages into its output message array. + */ + goto consume_upstream_messages; + } + + *count = i; + +end: + return status; +} + +/* Mandatory */ +BT_PLUGIN_MODULE(); + +/* Define the `distill` plugin */ +BT_PLUGIN(distill); + +/* Define the `theone` filter component class */ +BT_PLUGIN_FILTER_COMPONENT_CLASS(theone, distill_message_iterator_next); + +/* Set some of the `theone` filter component class's optional methods */ +BT_PLUGIN_FILTER_COMPONENT_CLASS_INITIALIZE_METHOD(theone, distill_initialize); +BT_PLUGIN_FILTER_COMPONENT_CLASS_FINALIZE_METHOD(theone, distill_finalize); +BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD( + theone, distill_message_iterator_initialize); +BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_FINALIZE_METHOD(theone, + distill_message_iterator_finalize); diff --git a/doc/api/libbabeltrace2/examples/dust b/doc/api/libbabeltrace2/examples/dust new file mode 100644 index 00000000..de238606 --- /dev/null +++ b/doc/api/libbabeltrace2/examples/dust @@ -0,0 +1,5 @@ +1578694237 154215 send-msg Jowl pig filet mignon, turducken capicola. +1578694237 200774 recv-msg Pork belly pig burgdoggen venison bacon. +1578694241 001831 send-msg Bacon ipsum dolor amet strip steak. +1578694241 944187 send-msg Spare ribs filet mignon boudin bresaola. +1578694245 115406 recv-msg Rump cow t-bone hamburger short tenderloin. diff --git a/doc/api/libbabeltrace2/examples/dust.c b/doc/api/libbabeltrace2/examples/dust.c new file mode 100644 index 00000000..fd1f1db9 --- /dev/null +++ b/doc/api/libbabeltrace2/examples/dust.c @@ -0,0 +1,436 @@ +#include +#include +#include +#include +#include +#include + +/* Source component's private data */ +struct dust_in { + /* Input file path parameter value (owned by this) */ + const bt_value *path_value; + + /* Stream (owned by this) */ + bt_stream *stream; + + /* Event classes for each type of event (owned by this) */ + bt_event_class *send_msg_event_class; + bt_event_class *recv_msg_event_class; +}; + +/* + * Creates an event class within `stream_class` named `name`. + */ +static +bt_event_class *create_event_class(bt_stream_class *stream_class, + const char *name) +{ + /* Borrow trace class from stream class */ + bt_trace_class *trace_class = + bt_stream_class_borrow_trace_class(stream_class); + + /* Create a default event class */ + bt_event_class *event_class = bt_event_class_create(stream_class); + + /* Name the event class */ + bt_event_class_set_name(event_class, name); + + /* + * Create an empty structure field class to be used as the + * event class's payload field class. + */ + bt_field_class *payload_field_class = + bt_field_class_structure_create(trace_class); + + /* + * Create a string field class to be used as the payload field + * class's `msg` member. + */ + bt_field_class *msg_field_class = + bt_field_class_string_create(trace_class); + + /* + * Append the string field class to the structure field class as the + * `msg` member. + */ + bt_field_class_structure_append_member(payload_field_class, "msg", + msg_field_class); + + /* Set the event class's payload field class */ + bt_event_class_set_payload_field_class(event_class, payload_field_class); + + /* Put the references we don't need anymore */ + bt_field_class_put_ref(payload_field_class); + bt_field_class_put_ref(msg_field_class); + + return event_class; +} + +/* + * Creates the source component's metadata and stream objects. + */ +static +void create_metadata_and_stream(bt_self_component *self_component, + struct dust_in *dust_in) +{ + /* Create a default trace class */ + bt_trace_class *trace_class = bt_trace_class_create(self_component); + + /* Create a stream trace class within `trace_class` */ + bt_stream_class *stream_class = bt_stream_class_create(trace_class); + + /* Create a default clock class (1 GHz frequency) */ + bt_clock_class *clock_class = bt_clock_class_create(self_component); + + /* + * Set `clock_class` as the default clock class of `stream_class`. + * + * This means all the streams created from `stream_class` have a + * conceptual default clock which is an instance of `clock_class`. + * Any event message created for such a stream has a snapshot of the + * stream's default clock. + */ + bt_stream_class_set_default_clock_class(stream_class, clock_class); + + /* Create the two event classes we need */ + dust_in->send_msg_event_class = create_event_class(stream_class, + "send-msg"); + dust_in->recv_msg_event_class = create_event_class(stream_class, + "recv-msg"); + + /* Create a default trace from (instance of `trace_class`) */ + bt_trace *trace = bt_trace_create(trace_class); + + /* + * Create the source component's stream (instance of `stream_class` + * within `trace`). + */ + dust_in->stream = bt_stream_create(stream_class, trace); + + /* Put the references we don't need anymore */ + bt_trace_put_ref(trace); + bt_clock_class_put_ref(clock_class); + bt_stream_class_put_ref(stream_class); + bt_trace_class_put_ref(trace_class); +} + +/* + * Initializes the source component. + */ +static +bt_component_class_initialize_method_status dust_in_initialize( + bt_self_component_source *self_component_source, + bt_self_component_source_configuration *configuration, + const bt_value *params, void *initialize_method_data) +{ + /* Allocate a private data structure */ + struct dust_in *dust_in = malloc(sizeof(*dust_in)); + + /* + * Keep a reference of the `path` string value parameter so that the + * initialization method of a message iterator can read its string + * value to open the file. + */ + dust_in->path_value = + bt_value_map_borrow_entry_value_const(params, "path"); + bt_value_get_ref(dust_in->path_value); + + /* Upcast `self_component_source` to the `bt_self_component` type */ + bt_self_component *self_component = + bt_self_component_source_as_self_component(self_component_source); + + /* Create the source component's metadata and stream objects */ + create_metadata_and_stream(self_component, dust_in); + + /* Set the component's user data to our private data structure */ + bt_self_component_set_data(self_component, dust_in); + + /* + * Add an output port named `out` to the source component. + * + * This is needed so that this source component can be connected to + * a filter or a sink component. Once a downstream component is + * connected, it can create our message iterator. + */ + bt_self_component_source_add_output_port(self_component_source, + "out", NULL, NULL); + + return BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_OK; +} + +/* + * Finalizes the source component. + */ +static +void dust_in_finalize(bt_self_component_source *self_component_source) +{ + /* Retrieve our private data from the component's user data */ + struct dust_in *dust_in = bt_self_component_get_data( + bt_self_component_source_as_self_component(self_component_source)); + + /* Put all references */ + bt_value_put_ref(dust_in->path_value); + bt_event_class_put_ref(dust_in->send_msg_event_class); + bt_event_class_put_ref(dust_in->recv_msg_event_class); + bt_stream_put_ref(dust_in->stream); + + /* Free the allocated structure */ + free(dust_in); +} + +/* State of a message iterator */ +enum dust_in_message_iterator_state { + /* Emit a stream beginning message */ + DUST_IN_MESSAGE_ITERATOR_STATE_STREAM_BEGINNING, + + /* Emit an event message */ + DUST_IN_MESSAGE_ITERATOR_STATE_EVENT, + + /* Message iterator is ended */ + DUST_IN_MESSAGE_ITERATOR_STATE_ENDED, +}; + +/* Message iterator's private data */ +struct dust_in_message_iterator { + /* (Weak) link to the component's private data */ + struct dust_in *dust_in; + + /* Current message iterator's state */ + enum dust_in_message_iterator_state state; + + /* Input file */ + FILE *file; + + /* Buffers to read data from the input file */ + char name_buffer[32]; + char msg_buffer[1024]; +}; + +/* + * Initializes the message iterator. + */ +static +bt_message_iterator_class_initialize_method_status +dust_in_message_iterator_initialize( + bt_self_message_iterator *self_message_iterator, + bt_self_message_iterator_configuration *configuration, + bt_self_component_port_output *self_port) +{ + /* Allocate a private data structure */ + struct dust_in_message_iterator *dust_in_iter = + malloc(sizeof(*dust_in_iter)); + + /* Retrieve the component's private data from its user data */ + struct dust_in *dust_in = bt_self_component_get_data( + bt_self_message_iterator_borrow_component(self_message_iterator)); + + /* Keep a link to the component's private data */ + dust_in_iter->dust_in = dust_in; + + /* Set the message iterator's initial state */ + dust_in_iter->state = DUST_IN_MESSAGE_ITERATOR_STATE_STREAM_BEGINNING; + + /* Get the raw value of the input file path string value */ + const char *path = bt_value_string_get(dust_in->path_value); + + /* Open the input file in text mode */ + dust_in_iter->file = fopen(path, "r"); + + /* Set the message iterator's user data to our private data structure */ + bt_self_message_iterator_set_data(self_message_iterator, dust_in_iter); + + return BT_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_STATUS_OK; +} + +/* + * Finalizes the message iterator. + */ +static +void dust_in_message_iterator_finalize( + bt_self_message_iterator *self_message_iterator) +{ + /* Retrieve our private data from the message iterator's user data */ + struct dust_in_message_iterator *dust_in_iter = + bt_self_message_iterator_get_data(self_message_iterator); + + /* Close the input file */ + fclose(dust_in_iter->file); + + /* Free the allocated structure */ + free(dust_in_iter); +} + +/* + * Creates a message from the message iterator's input file's current + * line. + * + * If there's a line to process, this function creates an event message. + * Otherwise it creates a stream end message and sets the message + * iterator's state accordingly. + */ +static +bt_message *create_message_from_line( + struct dust_in_message_iterator *dust_in_iter, + bt_self_message_iterator *self_message_iterator) +{ + uint64_t timestamp; + uint64_t extra_us; + bt_message *message; + + /* Try to read a line from the input file into individual tokens */ + int count = fscanf(dust_in_iter->file, "%" PRIu64 " %" PRIu64 " %s %[^\n]", + ×tamp, &extra_us, &dust_in_iter->name_buffer[0], + &dust_in_iter->msg_buffer[0]); + + /* Reached the end of the file? */ + if (count == EOF || feof(dust_in_iter->file)) { + /* + * Reached the end of the file: create a stream end message and + * set the message iterator's state to + * `DUST_IN_MESSAGE_ITERATOR_STATE_ENDED` so that the next call + * to dust_in_message_iterator_next() returns + * `BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_END` (end of + * iteration). + */ + message = bt_message_stream_end_create(self_message_iterator, + dust_in_iter->dust_in->stream); + dust_in_iter->state = DUST_IN_MESSAGE_ITERATOR_STATE_ENDED; + goto end; + } + + /* Choose the correct event class, depending on the event name token */ + bt_event_class *event_class; + + if (strcmp(dust_in_iter->name_buffer, "send-msg") == 0) { + event_class = dust_in_iter->dust_in->send_msg_event_class; + } else { + event_class = dust_in_iter->dust_in->recv_msg_event_class; + } + + /* + * At this point `timestamp` contains seconds since the Unix epoch. + * Multiply it by 1,000,000,000 to get nanoseconds since the Unix + * epoch because the stream's clock's frequency is 1 GHz. + */ + timestamp *= UINT64_C(1000000000); + + /* Add the extra microseconds (as nanoseconds) to `timestamp` */ + timestamp += extra_us * UINT64_C(1000); + + /* Create the event message */ + message = bt_message_event_create_with_default_clock_snapshot( + self_message_iterator, event_class, dust_in_iter->dust_in->stream, + timestamp); + + /* + * At this point `message` is an event message which contains + * an empty event object. + * + * We need to fill its fields. + * + * The only field to fill is the payload field's `msg` field + * which is the event record's message. + * + * All the references below are borrowed references, therefore we + * don't need to put them. + */ + bt_event *event = bt_message_event_borrow_event(message); + bt_field *payload_field = bt_event_borrow_payload_field(event); + bt_field *msg_field = bt_field_structure_borrow_member_field_by_index( + payload_field, 0); + + bt_field_string_set_value(msg_field, dust_in_iter->msg_buffer); + +end: + return message; +} + +/* + * Returns the next message to the message iterator's user. + * + * This method can fill the `messages` array with up to `capacity` + * messages. + * + * To keep this example simple, we put a single message into `messages` + * and set `*count` to 1 (if the message iterator is not ended). + */ +static +bt_message_iterator_class_next_method_status dust_in_message_iterator_next( + bt_self_message_iterator *self_message_iterator, + bt_message_array_const messages, uint64_t capacity, + uint64_t *count) +{ + /* Retrieve our private data from the message iterator's user data */ + struct dust_in_message_iterator *dust_in_iter = + bt_self_message_iterator_get_data(self_message_iterator); + + /* + * This is the message to return (by moving it to the `messages` + * array). + * + * We initialize it to `NULL`. If it's not `NULL` after the + * processing below, then we move it to the message array. + */ + bt_message *message = NULL; + + /* Initialize the return status to a success */ + bt_message_iterator_class_next_method_status status = + BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_OK; + + switch (dust_in_iter->state) { + case DUST_IN_MESSAGE_ITERATOR_STATE_STREAM_BEGINNING: + /* Create a stream beginning message */ + message = bt_message_stream_beginning_create(self_message_iterator, + dust_in_iter->dust_in->stream); + + /* Next state: an event message */ + dust_in_iter->state = DUST_IN_MESSAGE_ITERATOR_STATE_EVENT; + break; + case DUST_IN_MESSAGE_ITERATOR_STATE_EVENT: + /* + * Create an event or a stream end message from the message + * iterator's input file's current line. + * + * This function also updates the message iterator's state if + * needed. + */ + message = create_message_from_line(dust_in_iter, + self_message_iterator); + break; + case DUST_IN_MESSAGE_ITERATOR_STATE_ENDED: + /* Message iterator is ended: return the corresponding status */ + status = + BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_END; + goto end; + } + + if (message) { + /* + * We created a message above: move it to the beginning of the + * `messages` array, setting `*count` to 1 to indicate that the + * array contains a single message. + */ + messages[0] = message; + *count = 1; + } + +end: + return status; +} + +/* Mandatory */ +BT_PLUGIN_MODULE(); + +/* Define the `dust` plugin */ +BT_PLUGIN(dust); + +/* Define the `input` source component class */ +BT_PLUGIN_SOURCE_COMPONENT_CLASS(input, dust_in_message_iterator_next); + +/* Set some of the `input` source component class's optional methods */ +BT_PLUGIN_SOURCE_COMPONENT_CLASS_INITIALIZE_METHOD(input, dust_in_initialize); +BT_PLUGIN_SOURCE_COMPONENT_CLASS_FINALIZE_METHOD(input, dust_in_finalize); +BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD(input, + dust_in_message_iterator_initialize); +BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_FINALIZE_METHOD(input, + dust_in_message_iterator_finalize); diff --git a/doc/api/libbabeltrace2/examples/epitome.c b/doc/api/libbabeltrace2/examples/epitome.c new file mode 100644 index 00000000..852ca3f7 --- /dev/null +++ b/doc/api/libbabeltrace2/examples/epitome.c @@ -0,0 +1,196 @@ +#include +#include +#include +#include +#include +#include + +/* Sink component's private data */ +struct epitome_out { + /* Upstream message iterator (owned by this) */ + bt_message_iterator *message_iterator; + + /* Current event message index */ + uint64_t index; +}; + +/* + * Initializes the sink component. + */ +static +bt_component_class_initialize_method_status epitome_out_initialize( + bt_self_component_sink *self_component_sink, + bt_self_component_sink_configuration *configuration, + const bt_value *params, void *initialize_method_data) +{ + /* Allocate a private data structure */ + struct epitome_out *epitome_out = malloc(sizeof(*epitome_out)); + + /* Initialize the first event message's index */ + epitome_out->index = 1; + + /* Set the component's user data to our private data structure */ + bt_self_component_set_data( + bt_self_component_sink_as_self_component(self_component_sink), + epitome_out); + + /* + * Add an input port named `in` to the sink component. + * + * This is needed so that this sink component can be connected to a + * filter or a source component. With a connected upstream + * component, this sink component can create a message iterator + * to consume messages. + */ + bt_self_component_sink_add_input_port(self_component_sink, + "in", NULL, NULL); + + return BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_OK; +} + +/* + * Finalizes the sink component. + */ +static +void epitome_out_finalize(bt_self_component_sink *self_component_sink) +{ + /* Retrieve our private data from the component's user data */ + struct epitome_out *epitome_out = bt_self_component_get_data( + bt_self_component_sink_as_self_component(self_component_sink)); + + /* Free the allocated structure */ + free(epitome_out); +} + +/* + * Called when the trace processing graph containing the sink component + * is configured. + * + * This is where we can create our upstream message iterator. + */ +static +bt_component_class_sink_graph_is_configured_method_status +epitome_out_graph_is_configured(bt_self_component_sink *self_component_sink) +{ + /* Retrieve our private data from the component's user data */ + struct epitome_out *epitome_out = bt_self_component_get_data( + bt_self_component_sink_as_self_component(self_component_sink)); + + /* Borrow our unique port */ + bt_self_component_port_input *in_port = + bt_self_component_sink_borrow_input_port_by_index( + self_component_sink, 0); + + /* Create the uptream message iterator */ + bt_message_iterator_create_from_sink_component(self_component_sink, + in_port, &epitome_out->message_iterator); + + return BT_COMPONENT_CLASS_SINK_GRAPH_IS_CONFIGURED_METHOD_STATUS_OK; +} + +/* + * Prints a line for `message`, if it's an event message, to the + * standard output. + */ +static +void print_message(struct epitome_out *epitome_out, const bt_message *message) +{ + /* Discard if it's not an event message */ + if (bt_message_get_type(message) != BT_MESSAGE_TYPE_EVENT) { + goto end; + } + + /* Borrow the event message's event and its class */ + const bt_event *event = + bt_message_event_borrow_event_const(message); + const bt_event_class *event_class = bt_event_borrow_class_const(event); + + /* Get the number of payload field members */ + const bt_field *payload_field = + bt_event_borrow_payload_field_const(event); + uint64_t member_count = bt_field_class_structure_get_member_count( + bt_field_borrow_class_const(payload_field)); + + /* Write a corresponding line to the standard output */ + printf("#%" PRIu64 ": %s (%" PRIu64 " payload member%s)\n", + epitome_out->index, bt_event_class_get_name(event_class), + member_count, member_count == 1 ? "" : "s"); + + /* Increment the current event message's index */ + epitome_out->index++; + +end: + return; +} + +/* + * Consumes a batch of messages and writes the corresponding lines to + * the standard output. + */ +bt_component_class_sink_consume_method_status epitome_out_consume( + bt_self_component_sink *self_component_sink) +{ + bt_component_class_sink_consume_method_status status = + BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_OK; + + /* Retrieve our private data from the component's user data */ + struct epitome_out *epitome_out = bt_self_component_get_data( + bt_self_component_sink_as_self_component(self_component_sink)); + + /* Consume a batch of messages from the upstream message iterator */ + bt_message_array_const messages; + uint64_t message_count; + bt_message_iterator_next_status next_status = + bt_message_iterator_next(epitome_out->message_iterator, &messages, + &message_count); + + switch (next_status) { + case BT_MESSAGE_ITERATOR_NEXT_STATUS_END: + /* End of iteration: put the message iterator's reference */ + bt_message_iterator_put_ref(epitome_out->message_iterator); + status = BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_END; + goto end; + case BT_MESSAGE_ITERATOR_NEXT_STATUS_AGAIN: + status = BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_AGAIN; + goto end; + case BT_MESSAGE_ITERATOR_NEXT_STATUS_MEMORY_ERROR: + status = BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_MEMORY_ERROR; + goto end; + case BT_MESSAGE_ITERATOR_NEXT_STATUS_ERROR: + status = BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_ERROR; + goto end; + default: + break; + } + + /* For each consumed message */ + for (uint64_t i = 0; i < message_count; i++) { + /* Current message */ + const bt_message *message = messages[i]; + + /* Print line for current message if it's an event message */ + print_message(epitome_out, message); + + /* Put this message's reference */ + bt_message_put_ref(message); + } + +end: + return status; +} + +/* Mandatory */ +BT_PLUGIN_MODULE(); + +/* Define the `epitome` plugin */ +BT_PLUGIN(epitome); + +/* Define the `output` sink component class */ +BT_PLUGIN_SINK_COMPONENT_CLASS(output, epitome_out_consume); + +/* Set some of the `output` sink component class's optional methods */ +BT_PLUGIN_SINK_COMPONENT_CLASS_INITIALIZE_METHOD(output, + epitome_out_initialize); +BT_PLUGIN_SINK_COMPONENT_CLASS_FINALIZE_METHOD(output, epitome_out_finalize); +BT_PLUGIN_SINK_COMPONENT_CLASS_GRAPH_IS_CONFIGURED_METHOD(output, + epitome_out_graph_is_configured); diff --git a/doc/api/libbabeltrace2/examples/vestige-plugin.c b/doc/api/libbabeltrace2/examples/vestige-plugin.c new file mode 100644 index 00000000..5f607ffd --- /dev/null +++ b/doc/api/libbabeltrace2/examples/vestige-plugin.c @@ -0,0 +1,45 @@ +/* Component class method declarations */ +#include "vestige.h" + +/* Always start with this line */ +BT_PLUGIN_MODULE(); + +/* Declare the `vestige` plugin */ +BT_PLUGIN(vestige); + +/* Set some optional plugin properties */ +BT_PLUGIN_DESCRIPTION("Input and output for the Vestige format."); +BT_PLUGIN_AUTHOR("Denis Rondeau"); +BT_PLUGIN_LICENSE("MIT"); + +/* Add the `input` source component class */ +BT_PLUGIN_SOURCE_COMPONENT_CLASS(input, vestige_in_iter_next); + +/* Set the source component class's optional description */ +BT_PLUGIN_SOURCE_COMPONENT_CLASS_DESCRIPTION(input, + "Read a Vestige trace file."); + +/* Set some optional methods of the source component class */ +BT_PLUGIN_SOURCE_COMPONENT_CLASS_INITIALIZE_METHOD(input, + vestige_in_init); +BT_PLUGIN_SOURCE_COMPONENT_CLASS_FINALIZE_METHOD(input, + vestige_in_finalize); +BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD( + input, vestige_in_iter_init); +BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_FINALIZE_METHOD( + input, vestige_in_iter_fini); + +/* Add the `output` sink component class */ +BT_PLUGIN_SINK_COMPONENT_CLASS(output, vestige_out_consume); + +/* Set the sink component class's optional description */ +BT_PLUGIN_SINK_COMPONENT_CLASS_DESCRIPTION(output, + "Write a Vestige trace file."); + +/* Set some optional methods of the sink component class */ +BT_PLUGIN_SINK_COMPONENT_CLASS_INITIALIZE_METHOD(output, + vestige_out_init); +BT_PLUGIN_SINK_COMPONENT_CLASS_FINALIZE_METHOD(output, + vestige_out_finalize); +BT_PLUGIN_SINK_COMPONENT_CLASS_GRAPH_IS_CONFIGURED_METHOD(output, + vestige_out_graph_is_configured); diff --git a/doc/api/libbabeltrace2/images/all-field-classes.png b/doc/api/libbabeltrace2/images/all-field-classes.png new file mode 100644 index 0000000000000000000000000000000000000000..aa39252f4727973fbe7aff4a358bf4a944142a74 GIT binary patch literal 49187 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

d)h<~!ob(l7 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 literal 0 HcmV?d00001 diff --git a/doc/api/libbabeltrace2/images/all-fields.png b/doc/api/libbabeltrace2/images/all-fields.png new file mode 100644 index 0000000000000000000000000000000000000000..7385064c68821b62a6268f56e57398b440bcf8fc GIT binary patch literal 48842 zcma&O2{_c>`!|jjiYVCzkz^mcEZIsSM%H4KwJ{|7nw_$RLAF6e*-C^#*_SMX8Bq$^ zQueIbcmC%+KA-RR_j~@=^<2*-S7YY9&$+jA&VApn`<@70ZS^y!Sx=LZk)6@FbyJ^= z?6^Gm4X2_2@1O>L`-1;YIo~pNBO{}xhknU>MgsQ8$m;zxZeG9RHMp>U7&UBeHnW>? zcx~_c^Nly;xPj7hBU2&c%puq4POI}ev+hw;b@KJUZ=0Ao!@6;NgqI`nxo`3Nv*YY3 z$1n4LN;?Bg0dW z`A1K#n(t-Txkh3fPWnIM?PkP3QM`S7*6t%OE`jtlNkr6T=3- z(BKY@gq8yn<0aVq1ptkJ?jS${SevwDm?YM(p1;jT^uRAgBL=qnsW&MDPk;D6_Fux$ zd#gx&$ww%;^`Ys=w;|PuZ69!ZJ3G@2>jtA6`Aa)7US|*Ye{voK{L4+=*S7ebW$K1q zyX`k(3AfImIxHkBAb0A+|Jp6>%Sw8_d`cw8!MZy#Mko7ovn^U+i_7+JB=g z#}TXSyF3m1N1&*>)7d@EjyDk}PzF-F$B+GZgn9 z8eWbEZY$R_0AnD4O$_Ab9^7@pLCcq1R+zTIh^q8z)mtx(=jj^cTg7Qm`i4DtI3ZmdN0kI0l{hES zaZ*OKN>&>mebNr-+$Kyd08y9*dK9xD6k=?~yov0`AnX41#jA9G1qcDmhj^^XitwzR zSarc*C?Ih(ayid04gelp-}x&g;OQrB?rqtzb7zz06>|_#YKU_)(pIidztQvv6=CCg z3(0<7oghLIy;dwc-G=pJdHo`~J~6C`IGj#QnucU4-?;hS4hQbSIi|~ZSKd5;b1D`2 zum?s{x>#x3#d(m#lTum49_Xw@>62S+Uq3W!3t#p-mn5rXrh4yaX=AXcNguqv)LZ^d z>6#Rlj*|~(C4(3bC26s7OKx-R-XFm~RbDR5NWw}RXZ=?>13Io_q=Sw(ONdj6cJ0w- zsuX6jxveOv)R4uNq~}H{cb@6D6Gd^s(LDX9h1^VU9a$<~Llz$qp3J&BHQs=JO0Ym} z|8=QG3_K{kg-HK)(~rb1`!kuEAxq{roaRLfS(X=lSrJ3dWA-jxUZo=lur9Dg8r7~e zr+H)pFyZnXv#(w(s6X59WXnGDkVE-`G;nv?uc6zgPp5B+Hjbf(S{WEQxE;pP_YvwNkdTxr8f{MTlM4t%47+?ED zwk*tgk?;_&|MQX(KB(etooXO8$rRITG-Jrw<^?&GVg^rZuvkiT)C2X&?cba}nf_N;(zf z$mX|#SJfBOtGD*>8Q=8Af&jS}to(m}g(mMajCssCbz|xQnM>{K2PDx*b|fq$@1B`+ zTWUX>7A)J?j*kyuTvD1)ivNIVl^H1;ry>mt@1Cl8Pqh;}qR1w|K{Iey|D&UV*Kpuj z6l|dxvyntnxieK(`~}+0Q6;vOP&pd=cE{*HEQt6EO3gI%LM;_tjy$s@L4G-PNsaUN z9i=;E*YPzweU+HW8y`xI{kneF<-Ql$B^(`|?9ZN!6gN~S-*2+HSwH&Pq-v}$#PBpn zHm^= ztEwBLiYMuX_U7?{54q`HUIHo`U#;=e@Z`AWeGwMK{c5$0e0pydIoP)GP*goL=~A!^ z{=;6HwA!WqF_CU`2FX8nsBOc$lM|gQi!`p;zKE)etg{MJ@8Z1NOcKD9uHL0zF~8(5 zEj?QwAN6AIW^WN0`|#ndmiNzXcTBD>@4%aCc7@SF^mPk}md32V){kq}vc6j`e_EPb zsvZ6O!@u04*}5M&I2(VgZmfYaJujZ;?r~o2`#u&lV7G${Y_$>Sfqs3eFoJ!?1Ke1+ z;VK

    c3D#OBqt+qYj&C)&W;4<1V=1N82S5PhV_HS1(^0 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 literal 0 HcmV?d00001 diff --git a/doc/api/libbabeltrace2/images/basic-convert-graph.png b/doc/api/libbabeltrace2/images/basic-convert-graph.png new file mode 100644 index 0000000000000000000000000000000000000000..a97dfcacee0b263d0cc0011387e28140bc113c26 GIT binary patch literal 26459 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 literal 0 HcmV?d00001 diff --git a/doc/api/libbabeltrace2/images/clock-terminology.png b/doc/api/libbabeltrace2/images/clock-terminology.png new file mode 100644 index 0000000000000000000000000000000000000000..5e26b5b8389897ffcc3e962e1b7cfc355b1df814 GIT binary patch literal 22008 zcmd43cU+TM*EY)77#palNFN&=QIHbqIEbi75JK;Qh;#_O#xhC=kq!w_P(ts$qZA1U zBE2IJA|)U#lt6O!9rT&!E#E2c`F-bi{&0J9C%dn`_O;fvR)X%sRgNEFKf=JkaQx2g zo0<#^`&qz0kKgx!H_gVcRKb6Too?&9FfbfF1^xT&>!|+@1A}(votrnbJcmf5_Sr@r ze%~o~16ua+y>|@PI$TmI+Hv%fiP2$gmHtXyFAe8sC$u$&OkUt_zrCR5ds5&<+VS{P z7uo+xzjNo0R}4?nu2sC{|HLbI;Bv!>-<=VYUz(YR3os?M? z|GzE%g#E_P2Z}f7|59A*&8=R+ALo#4@9f-Is@$9m5iOs1rtLN7Ip#?YQk?oMHD3KK zyS%_{zRxqZyk>`wefd`3GyCDvrnV5p-TquO1EKMLuHCcJW*vrr;}7453kzS!&=hb~ zNwgcQuJ}vP(aOy7PIPE|dO~{E$eWzpXyzcF)x`ehFb>-hMA@_5J_te(Dxh7mGb}nq%Cx~mNd6``% z;mi`hi4*Bk#6bPVskewuy%ODsFe^JA4iuSoc20ztT8KVWi-=}dt8Fuvsnd z6rGx`r7YTZZtrhF&xH<$o0Skw%Z~Wz7@M|*m~T~Y-SnDVia>^W&I#j2()wByR^4a* zs?JaUd%%iVIhN0Q)vjGYws1S!#IUx6%s&1-%S{_z;pZ??@kc!ConiT7zM>UaasjEv zt9W(H*K_2IdYovgUy*)-HhllM0JKDMLhuAOA?M~W7x!=}SL8!iSZ~DOZ)}G4u-khW&;QT0B_AnG!h6c0fZBMlJpuX+y-j z3ck&}ppq$QX~RcyOSu=|j2F20hlzdouGU{}x#cASR~HV3#uK$zOU>Kdzo)w#citlO zm=v}*vTd4d!vMrpl^32!d=X~1mqv5b# zC-{z@lIc`5!sK0+YFI_*$-1*;1J`h`U!2SnWGUien_I)bZp+|eY7YPl*T&;wgDNUi zRH`1!poKxFqf1_?jIS&E71?!cM%7BJTbgisxbd)TK*`EIIlDxSCZo^&Y|A~Qkan)- z2+aAEj?neO0WUa)aR!g(8V`EszVc?^7-Io0Vh7l-hhYn*+Q++FVxjNBK^ zG8*M)oYeOEF(b#2Z|nJ2WRLl?!Z_h42T^5L)aNkce{d}KV5-}yhQh5;y1BGg_5G*{ zM?IKjTCwgI_=f-CT!n*~I^mn6l_v>WadVRdw<|SnW2!WfQ1HqhrhSz#-zv?q3D zK~5U!4XIrC4SzVA1rh@2)IWtr@B}Itpx6J40w@ru!vAwE5;hwfQv0AlPdN5L8;N6S zl#;3hx`{#-f;Y}_KDpywliv~ldQ%W9YO+G&8L!a=<62=(X)-Setr}TxU<_~P(gnj6 zJ{!^`wzyJnA0Y^|!r2hZA1m)YMpi>`G(RF2<gO8Y;T!_Sn z!=yexEI_vyakuz5`~7m0sRq$l`JEXgLQEOzM{ z_iJ^`{8Yv&p{b~`rh=%)#xWf-8$FoMnjrcIvvH|GcBe-iCA4Z%U}bRXmYi};h-lrs zKkZ~9EEjB`e&1j`B6+j->If=2>Zfo0DvVSRYP@W@u+HC%h1O`

    ?Lo<~LBd6+0@|_c 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 literal 0 HcmV?d00001 diff --git a/doc/api/libbabeltrace2/images/clocks.png b/doc/api/libbabeltrace2/images/clocks.png new file mode 100644 index 0000000000000000000000000000000000000000..0a3f375e06912a4bd145f2ca914987d83c573645 GIT binary patch literal 23381 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 literal 0 HcmV?d00001 diff --git a/doc/api/libbabeltrace2/images/complex-graph.png b/doc/api/libbabeltrace2/images/complex-graph.png new file mode 100644 index 0000000000000000000000000000000000000000..53d7bf6ea6f6ec605d4d41346b4afc28b756446f GIT binary patch literal 14255 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%0A2FYXv2hkWuhQKI=e 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 literal 0 HcmV?d00001 diff --git a/doc/api/libbabeltrace2/images/component.png b/doc/api/libbabeltrace2/images/component.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9c621cae01e8c854d39ac06015ccf00c957fed GIT binary patch literal 10844 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 literal 0 HcmV?d00001 diff --git a/doc/api/libbabeltrace2/images/error-reporting-step-5.png b/doc/api/libbabeltrace2/images/error-reporting-step-5.png new file mode 100644 index 0000000000000000000000000000000000000000..0f3fbc60548888b97c73f2d43479f2171bd34b97 GIT binary patch literal 14117 zcmb7r2RPO5`~NwPotaIDtg^GRi;x{<6Uv^)-XWnpQ%he$L4h?KfLDhPNGV#z%2c zsOT1H*_daPW~``Ns?r1Q7c>&8X}E6U_C8d&;?*lQV;|gxo!I3S)Dk&kqZMM;BR&w` z5nxcu*4S@+8Eu#9Ui-7>8P5yn*lhl1Lb;KbbdoH?$=97#51wXt1qQ9AOZ(WYj8^S* zt;WFYuhj~69nJO+*6> z>tqJr$OaIS_fExlEe_5H+||*Uv~2KlEOEKGnw#OH?`$EB%(G&uJHPnUYDX}5uiahv zO90+V?WUG&;pFsrYjAJ+*_XR8nd}sL9>Dl4$)j_`(r7Q`vo;Tm<8x`=xYTQ=^ghYSh~Ue z1D(_%r8kxJANC7*r(sBl3xsV@>Iz0`yK3c==f_rj$%kbn|}jUJ3kXrol>5>#&XA}zM+dZR?$9# z>tvyDdu1%oAXDDoCoQF#jtNse+n}OhehG7@5J8*@8ZIc+JjF0+|wAAo_T-TkwnAb z1o=DOz4_#lC5LU*H8O?4=R%@zX2_SFOQVCX47bH-YHIGIdU8Cc2SZ|WYs$#N<{PJP zGj7ma^<*O5bk}oNmJR<3k$v)*AR}juWmY6O{Mf!tqoVF=di#|s@j9*DOFt+_HMT|M zdP#r35TSU$36ssv3;$iIf3U~eSpEiGQP?VRTmD)dTf;zDyV$F9gti~AG2nX~S)^8K znCtx_<;F0kr8K%96_l^WNhrPPEmYnh^M9TzJz+kZ_;I?dQs+m3VSLs3qv0gSoj7}3 z^pEbX@V4&*2TSTyBuKT46dn;O%tNf-jEx=gc-o63=(1nEB+29C875s-k_J} zjFlQWgzOk2{N(zL^1)H+^>3U}k<4Bc5&;nvzm>HQwvZeUlXj2-F_6}ex$)#J1Wod6 z>icEeBi;_NIZUMF6I@6geoQR;Csu!r)$3 zoOg1TM3ip0?xnmR`a1c#@vHK{{`C&wQQe;W!%&RN30WgHhexX?J zAUDSUwK0+2$%Q(SERE^AiyR^*{rRSjpTZW6YN2Rp0y>n^m!IUbxOj^i%v3Dkk)E+E zKAW8%F2HhU7={eEQ><}JMd&&M+G>}v-gd863o1xOt z!{0OwWN95#)!#;V^u7*R95&--fz#A#yuevp4)Dksr>5M*Hw{vbd|WO`5L8h1>3v$4 zo9U2Jmt8^TOB%SDwzKAy+b_kEE!!9kxigFiT+9Ud`i*2D20pEKm7pjkP9_W9ckTu2 z3G_N&h%Adfw9%9c8@57|zv|WzqVV98Add^t16Msw$Jf^gng9R@J4FDLEdS*7zu*DD z7f_@SD>kj)^hII6dWH`mbZ2=T_kT0aDars?0!#p35h6f}#VY>-3p#|8mO(w4?Gf_C zqV%r3_`H_n%Buv}2Y{!1X=a580Q^xbaEdD=b}4*bQUZWN_@DTMU54TeR-7&igcSGh zgyd`+-}V7sdQb58gE2Tr`sXaqSx8PtU<$}l+({+xefB!G+5eM97h#KAkKYx}@+@!$B0l7-?h^#5Hr*ojk=6uNdjPU4@Pz#3*3 zW+`-PU0e+NF6AXoWhaxHPfg9WxI>mb~YhRRQWo1n&oYtd*OG2H#GFyS?{())9YZUe` zUc7J~tJa&y?M#!XtgIv_A-N#y|ND39ROlg(c3Yt*(~zNes60hT)Y+1trqoJAwF_8q zRqQ%Z-~T3#)JkORp7-Pb>nl3d&JGT#uV2e7E0&}Z7&-d1vWTX%ws))H*E2j?EfA?#r@%k+lf1_^;m!JC! zzP?-fK+{;#b){WuR)fqPZRTT5N?x-5IaN3J?unk4r>E$2-pY!L>=VW%R48oF-NvNS z#hQoi`0XDz%OWACRv@!ZiNvNfQtsOTbLnpO^J z?cl&b;#%jY!a}sW%?}6|qPhC)j6^<;jO^;t+A|p*899O=K2}vpQeoO|9M-xF3=BwZ z3=a=GD8mT|2)H-;=H@q*z-ft_nGn^Xo`2yBF0K>W8N+=EGz(HFD>!8N?`{% zMfil|t*bqq#?~wg%gb9Vjfr7%yKE4*%xXW%B%Nf0( zWNFJ%+`$+-COzsYkRVnGmA@(Ny+qH-YHns`W^8;Ok^bh*%!`P>EU!~#Rn+@#78jWr z5rH4$XQP9Op}XgMqsQCLO*qC0mjpkUng%{U@t3pVTrbn5e(V|U67Cid5KwoATFtKL z*|TSfiHWtPltT1}(0}>)y<_f_r>SXavJkY!Ro-`v;;!Qw3ON5--E`jM zJ%^ZLsT?-s*I&BvL*oHHDJiL7-S57R4w5?fL%Wf_zD&Etd`icA-a}jl)rn@F<{lJ( zt*(p^y3*9tG&g70kfWQMfa_&f?mO8iwbwfJ^o_KS!0N)0^~c=Y%Z`WwA-h4k9_l>@ z2ZxQ6yo+h`KMH6W!~O~fQ4|pCN4|YeMR9TO^I;o)3P<|N%uM#h*CIoxsj(|#TyNxyK(@lBIQ1w}Otx+= zDU zmNH?1whwRKux!@l6&7me#7-yovPBM;SVvVZTf>H)OSb@S2m-a(vef~CnRPFuTsG+2 za`=TcyCax81w?}2MRfFxEPPQaLH)i<$m9*~gL9cg8Kh)nO-Q4L^WVRJH|%#d(AS@t zojoVB)YEg@);5RXynbuU#)m`V=u%hmOR?QfACotPwnt$9gp&%sH#bqxFXUzDwqZ`G*yI5sP>x(<;nA zgI3!#g5sqYtCPXwwO68u{fdQ-kZKwf};czVLL?Olz zX3Azfh89mXSqb5tW3U)^<`NSVYb;SBCja&8SA?7P8yQvON3~?BZYIN_CMy>&VSzzN znwSzB6^8iBFa&+!8$ME@too?*WNn$-^?*?l>Do@6C0L=GOMT7c!`j8?CVF~Vmy*9l zGxJs+`#3nXeJ2_(we1GMw69OMmB0lH!mz~@81AUXC8R&k4HL~NJa|-^|6=NM^~s{2 z;gM+b;JS(mee>DoNb+QwvD6PHn(BszhS>7S8UX-LE>|Jw)Udp*FQPOzJm~YiXwD1O z@zJA5xg|qyhW9iz50%;`x+#T)g$>qU&NZ^jrhRqI$N>K2mNCv@Y~>LT(W6Gue4NbC;2QTN?+i&*3f)8d-JJ zmCFPaN$)|B09fxrOdCGs+iy)bGlr$j$^7=2~6eo&IBSM zACE$wo>qa7w6te+LWSDJzOHtYH+a^P8xFJH*d1&yuWPmr3|tU*`T<|~o;y7~jqFf- zB)>uRJnGbIpraS=#w}RzIq7e#t!=amrX`FjMv{F4>=_n;lXVF%k$B1VNFr>8qB zwW&dnoZZ^DTdl8GvPDLE%yy+Dm=?q_(WT(%1_cG><>mF}`6_beYC%1p9pge4vpNKCX< zIFEdlvYp09@*yDrUPBOqAg1jb*=t-gWch6y{}#^ntC9LM|G@6I&2ITsZZkIB5MH}_ zBv+GS6%=vRMM)`K&LUj|LI?1-J;bGp2)ReI7FP$bmZKwYIrUHXu+?((JrUT08lP1g z3zFj}NDVXF_2uFR-_~f(2t|;JQ9n6x{_Q-)24-gFhqQ4PUn2V=BIoDl$H(u*BOszE zR!a2lF0yL#VoWjZpWhhRQg@vv$T^sQszctAN9UC6oMn-uT? z#0>Ay(ar=pu;FhJEC@7Xm2+&1O|hkoVhSv*+cpNKzo)CH80JGMoD&fdAtfzM>i25n z9!Lexm;&kf44JRNQQr-DW=Y(!6vns;h9Iz`^=eCA7SGfJbt;IAbpK-X_;6Omhx)Pa!eAq>ZQTBWGRgqlQ>eE%{QKWD`>SSta%APf@^H~{% z=wv8Vd~rX}IuUW|kl>k}(P>^@UQpxyZiRY?%jbi7;2h>h3kKQxD-U91#X%wfs6f7= ztn77{PD#{?3D+fOh>M;7uNM*;)lFUL((P73a%a47WOX*m=5`i*`r1P+0?b!-8A2(L z?NkaYN=kH9JknBAwPrb)zl~LU@q+p|jiA|$`b0oPEKUpM#!XO(bgcunu9cOQ>w%ZQ zLE-V#EV#_~{H7B>eYz6wvnV3cC}wbD)2;m-0_Tvjo{Nj?xz5%bY`q>Z-b8z5Q%CEt zCdbPylpUJR5Q#&Qil1KIrKP3&T{h`@NnTwkgJjrU{L-^n*f2gYVC~?;;mdQnmHI0o ziz2ocU*_7#^|L)Q2&6;t#{m~A`>Md@9yF6;%gD$mUXWW*u)MqeE2ZN5u;o*87|t=z zq-6P(1=~%@o>~Sb_Coqle*3lcvf2m(X|)EO}q6&3pzKJ!~qnw{7Z zU74Umk!n_-Uqzv=b2-suGGDlmKoCjJs{gf9^a(FPZ+RdQIXz#;yHS~>cV9tK0vj)4 z@kj4onQm|~mrCzyj+VZdMR8FO*8|8HuAA|0}ZX)cr{nyx=@KnO6^A)m-;=!D=NfeoFSvgO_ilj z(@~4wOFt~RGDt~CEQ+o!H5zi@pt3kg;T~l zcqIA?b?aZ5ursduRTi+b@``Kb{wX;g4a9d#bgPTH(&FloWwOA{;T4x+!zC&q5kO7& zAdUe)>JdoTUm|Uu%JsgFku(1AdGy`8cYsJ9?a~9(Xcd~can>bTk$ztwY2D@^=Mo%z z@;Gg3PbNCa(OWQtiE`SQOM^pOmy0A!iNS-Ln_Kg~i?y|N(PsCQ9kx=ia^5u)w5K zMY+BgSnyRXv)@Jew)mN_i%jhTts?ZQWt6M$LD`IAY9q{$G?u*mrKJgchlUT(7|PJIWe30xVh zR6`o#U14s*r!6&vfql5C?VIVlWKN!*)JdAUzCBEZ=VLZurleC5Zt*Xw)>JgaBqV&M zS}5boE}rk$idVQeGPljo&tLUW)QWBl9gM&^%R63^!{G4uD8r{sr?@#T$>5%EieZ-a zp6Os%yx`q9iesBV#e#`J38Pcf@&vY6EJ>#pGcMqUvH1&u1ld{eSV1a%Wo~Xwq&2_1 zTu%x(zx7JG^`||~k(Q)~5uwwy?%q}SeKhx(SsqmrNz2L>ymBN-dA^l(zL}NdhC^S| z`mb*V=3hT&A?B-~Tx+}ec@PXc$o+#M0mp}amOZAM6#EAU9vhiX8IIeJOcQ-#%^(u{ z&rNnk85>QDL(A9dA)ouT<;^~1egN*9_KhziC52({>L40z%gp?v+%Z|KMw#~!-c`Ii zWO!g;tmoH7IMvkDY%czeB1I~@hfhnsW!hPzaAM>|yd#8`YMAX+VSO=w{?3{T zJEuT;Mg}V*W62EvT*wN@REs({yNxsj@8HSax!JA#l?-def(uZI7#dIKOZk$1#V=DF zTnz;NxQYr!+nHa)?VH&F=jVI1~VXN_MWYfmoWw*dtcTElXQMD<&#>*T7)$ zB7y+3Z{ETfhL=fIH}-zVRU>$F@nrSa$rsT-6*h`4z52tG7JdiLaMQ!DRo$&KG*xz^Z zJLkveOpM9QtVfTx5`ntR#x-8dGsx(D*hkkvSrwv>mtne>d(Sgm&N~DK}Z{y69eaP6dzuA9@j;G4~WJNnmS3J5fFE2`` z(QNlp%t#}a1kdmTs!Bpaa?|@dcGC-5iN3|K3i6^}ED?BQdQ{$DM3J)6AC$`Lf9(8j z1sl?+OlAgcqhx(G6sf}={)t~P-ps*_?2|kv*=yJA+989MV^5OV!sIvVnVs5Ao;cOv zK`KXYqr{YMNPW~~_|TH}of>cNn4$48yJF?McF-I;;{+)&<`Ca$_3Nq?7?+kGjJvBZ z+^g*d8_Hh89X-T%D=;=Sy}-;&^Sxrd?zDQDss9mr%p>D!d2)O-SR4LP^Ck@5t|Hak z=M`s!2uXXTYSY}@ynl2@NP>MrzFQ{vmgH7=+Hni{uyNW_=0TD+0tWLO=AZ8W59}G;v#1Hn z4?{MRO?-OP$xHE?=A%~@*5uBeJHs@+kkJh&2>xvH=VW)G zrlsP~ii_V`YHP>5ZrU#A-^cI2VVWlD)wpG#q_=s3RN8b2vf)C`T(OgLN%^h^f!kB! zj9L)fIhrEDeMK3&!|otCEkw8^<&mI{Q!{#l%=Ws0y1+pTE)(EC9{NXBMMcg(XLf_QAm%YIj1Ukynr z;sr(V^Imq-zk63hOKV1@5>&PX2>bwopPikZmfq{@>)YMkJw7_9sjdcjdorjd-(It? zV5?A7s`#lGUVyenbav!G{FN_*g{}Ex%lwu*fFc#-=eJDI57&5PR+{iWs=B|(6zsET z;#zO%tUe!>LT}(0nb^!o0Z#ap5T?5Y0w-a}FZA`K!5U34@5P0MsXca@p>TNx`kwT( zH0gltd{n527u#baL5NG0Dv>sih&*b5f!dv7maYOg2G0gD9q~r=^XI>}ww6b$?(Baw zRbjA7&NfZ>#`85=taVmPpwC}g31U|74RToddYAP^emNh8 zy5RS>=fPQ~BSV7PRKf)cEG}Y$y7>6`#KJ}TUpfd!xaw_GCQMP47Zts=C+T`^#xF~2 z!3Db<_s$yMk#y{mO7st1y0Qg@^*GPgMt-U=22l1-xzT1iKbXI>ILj4wu`tjtzHp+h zu8s>&oj~7fS6@n4@nfS_{LA4?Ru)?+?Q4RJq87QY zmDW5nj>-Q~PW|YLEZ6PDeI*4E9}hJfo@VJ5g``x3Et7I0ck^r9?A&vYN)L8cD?5Kt z_K~is-O}OFX82n0@nZ{UEQt5ij+oAi)8b3J{e0Yqt+@l9#b!^`F1->I=|Tf<*tj8? z-#s=VV3`(b5x*G+Zi)?#Q0^e@Vc4x3MGk1Qju?Yl46{7}@1R_iX)jW)C42W`u zv)|Las-ti_?lC%PBr|?5)PVkSAJ@ml1#!LFZ0=!;R;2;d2bBD|QJo2y7S4qy-GzJ& z8*xG_t`6d{nGj5$8aXnwumTe+etXH2P=w51@=aS?4JaSaoKs~JqI-YytLf?hZ5*!A z6B__NXJ^CM$DV9P9`dKM=1%Ye*6gfq8*9z9-tpRS3g!EOb2s(p;gK}m2|5Fbv+{G| zq!KWSO|$JcRyItXTll8wR$K(npMX-iaU8VL7q7`wMNg5QpRB>qP{+?;lVQrM{jQHf z<{0Q;d3v#)_`LXqL$TLcaoO2d=)(xWMeY4t=GJ`shn6Ku1@jD#HZ}+%8hY*mj*)w) zvzs@|Yp^_G?)h$H6k0i*m$Ab`wLO!~`a_qR7Ju6>nJ6BH?bPXeqP9-hVv?s;t6$$F zS_K7jz?-V8t2Go?2e%|k1yor(J08OqIKvgIQ*#_InW1&M>DMD`Ykwj%)5NQ!*612` zzf^h5-VzCsSGyKvVdLJB?oz0Abu%LqQ`Zwl15Y;hv#&1x`rt`&I15;&ZwS-yONW+c zI*cwX!{B$_!N(r+Z*6UDkNEUCu4Pqzd7- zVlsp>Ms&PaTY$Z|TO8H#y>tt+CFTrW*OT~L>|HwdLk9Uss}PU0`#@NYue7(avg&># zTcMr7B{YYQiF-_-`Bd1)%PBWQ|7qc8Gjh4zw_B>kuiq|%nsn*g%a7z0@JB1JoYc@^ z#(&pG6^y(N;71>33caA91nv% z((f?=(}sYcV1|^J+DC(3MFM}>kCju^i-?-3iTu*Gk}k=9$r&9oh?L@}m>#-gB98Rg zB&*+3QFK;AL&N*`mloqb{Y*(pqOH=}W9Lxro6i1hpe?ihcu($f%StdNiO&R5`LWP> zYiG6N7I6KYKDvh!6>&yeJM|uW{b<#I;-H*bZn_Rb=aJJDhv?)@I5ysBn3;b4cciIx$|1no0eZ@}{!H_?`rB#(`|m z!|6dL=LyNeK+EH8X5-040H1iyT1kJ+9)a713qu@wL0q)H*OZlUJZCo)xq9_}M1a!6 zd&~P`^HbuzC=_Zf)m<%MZfPk&vAnXN;f?Ga*0H|?H;Urkgs)_08>k|{S*nqCs2Tl}gFLd-v zG{GTcWjM92;b5@x_~%dallkei!hqS?H)P z&G)=;st^X>Z02iZd`Anb&m0)g>-3-p1g50$bHiu;rGQ!>_jZ~k~(G2f`ih%tRKC-I+Cf~ z({GOelBxzE`-$FEfDT*xM|Ow=yg+|!g$^!K2AtZ|%$eQ?6G3j3?!m=mH||{3%O9f7 zD~sW(SK|y}+U@k@K3J%mUl+T4{LI+c_%P;p*lO@fJBK{BKr)c$`SbHr%SiumezvXs zybXljo;pO1})UXjt-_Q5Al!Mzb&Xpr#_BCH2>?Iua5f0K)XU zu`u{OSa06bxFhgz*Nyp+tjCPTl|%<;=kgbC+d*rr{wf>2lfNd4{gASpr6bDa2)Z&| zcw(@sPz88ZnfEJ|c+$2HHfQji%j;>RyWt93b}5xjp&GBuk88euepU1#CUNJzq%WLL zT`j%UPD!6qW%?;AE9-k|pcYqraubcWm^@odpNRjvlP}qur9FMH-_K4Wu ztWY13$U5EXZrBM$Whqg^0VO<7j@*#IK^8Akg=y;03r2fNhG`fZ85w!n9gp>0HdU^8 z*K^pU$n`^PfWB|OEJG9sxQ?F~kXL*+E+6%DExLr1EWix~Mtck~pbJ#1m~zF1Kj2tZ zwULA(Qmky;xp5417V)WBSa7ZIY|HUqdptK%=h4v6Kqd_X4N#2lmW5Q_QUL*PDb7mP z>ch3ZlOu!V`t|XAN#sLiI3-{+>==X~ITR_Zt7YAE7qsY~UZ&EoT`NK&dHC|OKEDpb zCRyW<4h|6ra!us|bcgtt+}cjR?Y;KL6|S-ytNIyrGr9+^)`gipTiP4BDSlf#`cSyN zFl^MS&@yRvtK(TGYp>}X8_=$Wv;3@)x~|h4Rx3B}SzS{zQhxibU&+gXG@~{^${fgT zGPDD~WiY%nI~vhO_AJXE=M3bWRP`*=pvI01OCc*cg*CdC)%$M}yN||$cE*xhS_m9vI@> z*zuY??{GaSa^is8XoISL?SQv(+;^|Pfj{QU=4q9V3bVbllT3tZGbhG;y@jJ|eCXxw zepS9Yk-1zq{{r!GONWOtd{UQ*1(r=%je<7J z>(9X}k4?-sI|hdr7OuDe+qmJ3g3iKKsOg?MbktW>y#v&uL6=@CK$lFxx5dQE%j;3m zxpU{#)zx#f()+fgWoQvpQv-UbUQcIgshB82(lU~KM$?Gkf^uuD1)hr{1ZcjgbD)Dz z_6q7EnQ;3SoGsi6hN$BH0g@r_Serm~;Yr&3U5* z2*od9Lp#|YfhU(zAZYPG-sO!;t~rzUTJ`3TGkwgft%S(R30%xqI=KDx5W>h@3kMEU zjU_4d_|9&=fArZF@yN-hzM^&IapX@14c@|e2WEUfuLOf+yTSWk5e#)xP4|oL|F&QX zUaQkcq;m4i3pqdxx@ms38YNiCHawL@fwDj)&vO$Uomf!Mc6#eq+4^?m$9g1tA;a{* zC#xA|DCjW~%Kqqe4IZ!aRnSKTaVYAqbfOCo2p~Se&|5oR=q>1As!uIqoBJAI=uQ$VVzk!2dXG9g3+Yl$?8Ga9uXjS4@1<+ z1VWhTfb_s=sN~CmSrX}eGZ7%OqtAyI98cBw;UGMQhirp=ycWLy{K>BW^nK%P$;CDW za&SDJ=8OP21FiopP+rHjXuSB%FP#>K&Q$LPgF**gIXKYKD6^9?@I_hK7kUs=Y7x}H z30EBALw#_u$z14)oZn%ns*oYBE#>!#t+A+y<04!YSuSyn{Iu+-E`Cs=TD zKbsFvdQ5JkTVn{9xrTF#7NrCc0NQ_`RWqC-5f9k@ZBkQt`B(kcZUfkHX0+-4*MP#F zWdph0L3PFFV>qDqdG-VRC`2QuH`CoqL+-A{2o|3F{KAZug6@DQU{<{~++I2H;ZB>r zzP^nuP^4n@gwzjEoJ4VJx8F9llzg$6Wa5+W02M#;6#BYrYZ#L{^Pt7tZgYo#!m_9> z310NGq~zojU2rqu?4|;cV;BOhr=5+BGLN^ty}g^8o3-W!Jpu^#LZWWz{LwW60nR@f zLm_$vhyc6HMXaz6wBK<6d)he;=eX4b!|L*YwCC*Z0*3aqCvhrx{2zw-Gs<5ILpEG+ z!myIY+xaA4)!6At*Z>hay@G)i)c`r%zjTw>D;6lFGsWe9&g{xHnS63%&mqtoJG+zd zXX@B~5sCfFK>mz%`nA(#{DdK`iYQrrS{J!foel;jh3zsN zLW8l*aIkb$9UvINULHC9E!HfjkNGp-e=l2!jC=}no<*&NmE$Uwfv`Nccya1TV4Yw7 zV=8~I{$Bi6KcG_rI!C+ zbG-~#_T^y<&R6L@Zb`5t6R0CT-9a#03^|sLVl{Zc9zZIJRV898z2Mc^g%r?t0&fz6 zXP;?434wVKCaa3)IVRt6VAYd`-~EO7pl9BOH5{f1$WKp=i)@UPf7G>quN5mJ{bw-X zK2Rjjx3%jPyp!)9ABG;Cs%3B;|2!L9uEE~qp#T*Q?Cqfcab;lSzm%*vaGkPdn4itx zcaHuXqJO;UGpXEXW~+bM>s0W2>d*h&Bl_caJkgCG%VHYmfN>icPj4MzZ3-j||BLy6 z4dzUhZ%M#Ll;@%@fBzKg8XZJu8~R@wDS54^Ugjpy^xkGCRdxk!!c&7MuVEV{bf;GR zuQ%_>+I29_>1qAXBl2H*{6Dhhe;EB#6~&%)LatiOx|0k^wuOK{s!Ccn5egQM{tpD_dxBd({&wlochxe5!NH38>AP|asckgIIAo%Yg5GW-v z9(aXbU{wSBM*_dA?*f64oyYxy_K*7=K_GHk_wL9&dOo_EcIaU==()Qk`#bSyvq9Fn z5ZPaGcS5rW)-NCwCz_S3-ru3Zx*_h%NUT24OThTblE_Xqw3U`%M2B6AH-TTdv?LlW zpFmNf^dmtUrh2ZDx^+`~laSH4_lxFm`=K7y%GR{7LV#) z;`?t1;9e!|Gb5E6mKuG=H3%_+(4AuzqKADpBSvRIQN(D)4WecV!Z#32U=I+7b9ie%We>{)kJeA)GlLxc ztq12%7b0g&A$0KsSeetKt@P8Q`P$mr#e%8Gg^*(*`eri?ytNI!o9TXgY*V-F@#4-2 zCBJ>tz1=%}!p+sE1Vi;m@A!JwExt&Hpgy@mcUMNrN}E1Y$zJYZ))9PAVeyT!S>e{c z#jl@V4w&QPDlpMB6yu#%Gq3hdq2( zVg}5G;*hF~O{GMb3xcFy-cq_^)xH&&Vf|E# z=b?Bk(F56|C`d{1`&H#HR!w)9ND}I27{-;Dm!Vdwo=PSCqCwRv_1TNpt&~Spiw2~c zuQtYC*>-hSo6pTU{w8}8B$;BAv%lOKUa|H8kxvvyU5YHlDBh zLH58S)nq(^0&cuIe=5JfRbp#ufI;wya_=ojy;>qfl}4P;0DE`l36Pu@PzDCY~ z0~IPq;}Rmg-Ch{Cc&lPN$;&3h!uDz)6f>OnZurV9R;G8+i*_tt&p%F9%e}9FO0x8* zy{7h7kv|zCLVk{F)n4n3@72-v$cl=J19WeW>+BF>YS7pqtm!w_nTKMZl%eKzsAu(6 z$;@~176|4$%?fC(y~wTPM)^}wEABB9llf8=qtZ8+ z+tu0`_2?(R^P}s6WGt4tcZWT>Y$R9hFS>WoS|aZ>R%VUWKYxwAbXeW+(8Smm-B2D5 z)mVg&ogMlJnEF93Z z)&!J9U2d0xTS11c*_I*k_E9pd*ij=kW+4ga@2AL#UaE-g%}ze*U+VLCVo6&;xs%$R zj5EJODd6_S3uxDH;AyE^Eg2l=ii(#>2nK`fW2+fvO94vx(X zCemKVE-56Pe1%+~D7jF{ z&v-_QsJi=f)Hux^461hDh9IH(^G~z5@jnuxqzrOD=OYzzs_~76wG3k^>R?8`?ZJyh z1-c7fwEpOAmL@{DM)&^b1bk|0c*TX?#;jS)?e!5!t&2VoU1gm*saXUssaHqO3?Dcw(~E6iZ>l4t*s4h#6m788kI(8T_UR8b2HyrOpNUL9r32dtIsFmq=` zzC>FSSL%oNGdZ`dEsP95l0_i9=tUm(LTLgPoAYV z`)HX{#BiX%$Tlx%S^o$+EK5X(R;>O>HBUgetj2VK*#|Q08ZG0o)%Ec*e(oH@i0+kS zPbe}uVoug-!ku)uQC`p_2a!Z3F7ameVmqd?`YE^B4XADqZEUA-!YZ@qfa528w3>WhW;pe8HAjX3@oZaeUBxoPG3CR%)G_h7|4OkC~p6eEQp32`_5-c z+3~b%RR`%NK5|<;i2Fa^|8fZ~C~oI@XzStgve`N{ z&5uV*1NIH>VJmoAcqksKDRccFA38#1OGW7&`CuIuR7&eaSg#7IbZ@1Sisd(ku#R7(+;hH= zZmo7a-Jzn*y41}?1XphhheGR^oNQRhH@b}bCyU1A>LymZsU_d4;Y zLF&qfLs*;k^V#$S;%TY$#`1ZZ{dmgdc6_EG>75mo4D<2ZNqT-z25)rM3?wau7}efA-zh3_hv53vk7~2C&920Vb?bbOifkeBx z72R0I%ndJ_Q$7N?hMLHah2E*iTceTRJAaDMJ90_uA)&f_fmv_06P&w~hbYOq&AlF& z5P%}DA9C)|^wM62cYV=I)kHna<)(Rh5MY;mMR>aDWuCR5r{=wJ zm7PCJoSO>RfB?gR2sm=VI!NJRrq50I0{79&-?V$wJXTNBZFRG{(r!*yfW=g8DZ)+t zkMje4_1|De9e#C)h|j2#!M7jRZ9d)}EodBk=CXNvVd&$;5;2m2#{CWUz=#bIfof9z zn@=auV0UCs!XG|c|0(EczC43eQXGpz@DW8Tv_bKmld|it=GDw$NiU^X>M-4|i1`$M zqfioc@aj#TH3T&j;j|_|XQAmv@u1@?DawmMDlVVSY|{aJ;(uI+4kDlL7v)54YrMX! z!A_F%>W}QaIDJxQYU7UKdDp<8A$AlpgiMWw5WlIWq(6rO-qj*zD-|%Jnv8B zf?#8URB10wW!%-|yjRo$ijJTVN|Z@wUTzg0s;rGeF4P%nRAk*{2n-JAY4-3zbwQpW zffh5ewU>EChCL`yU8!j%{LizaefBc&4Ys{8vGGtnwuDtS<^x)@9@H0q{1l9@^`5mw zYF>dtrIuseRoV7Nh6loB-M>n^XgUf!3y;apZuoEM^za29(m%PlWAb{Y@>y#B`Rj&WYmE1VUhIK9dR=01!5#^pqTpg;YZXW z3U#HwY^nTJJM7xTt)W69h8@)tKf(l0`{QPXI|P2bu@Lxbca5lgh;`tSi8Dhbld)}b zTYM`l#nx8Qe)+2bap(7QWhSY-Jl4kXT{S!@`dvRR^Ka?0NCkn&||x z-SKw}`@~k#2-W3KPhj`^oW8aOSuI5R{n;S(GRV{S8|QJ|C|2Ix!J+Jd-2k zq~GeBxGS4@MsiZN4FL`o_*%$G(K}8%!;y)ixvvjJFHa6kX=DK-0vy2n3pq z>)q(V3{lw<3>OU8;tv!n!R=oVINNuBH`GN}%t^M2c!>_%5kaaxLOmF+&JY_c90gDa z(M#*`jukzG>~hP=?7nig+3YsNpS#*>E#=Oq?oQ=Q%O^~_p+9h5lxUa*P9yEcqZ_bZ z5!Pt6Y3l0?Pea&_-yp^w%wua3Jc?(rDUHK5dCB)54`>;hQhz>fZ<+fJ5dfF)^?Ld5 z-@nVt%fEmBu2-b)7k6b=7a|ahJ3RVprU+Xr4DzPKJ;`}B@!q;ItgEepQmnJt!yX+= z^w&gSoe5$O-9>kgDTZrwG~ivc@xFz*=K>>75X;(%O*HV?ht?KMy5jfFZDul{;=4Kt z88s!6$zjojsmalHki?6GasHsFDbz3fDtpofD`fx?4G|%vX9Cf6p%G=#wGG=AIO)gM zM|4U(*}M%zt6)!>8;7;2z1JWD5W-7!e0+S{VdS8P&Gyouy1Kftv2o7*v>FtvC#!6G z>?Ys1l6ZnKmI^=yU-4%`CtFz#`!r z4{Q4Ca8Hb2xcALTebd2@LPuBk%BjwyN58kXe|7)oCtupw+78r>A(Bau)uh}k66;4L zj*~JjT($12k9p{D%l|=B!eU}|2vjBWug$&{k!;u{m1wB$*C^NN9svSOB-?{-yxiPAXX_sjAj0RGzcR2>QStNhZ&rzli4j7LG>nbY=&&Ff&;`QOjy(3ztN5U`9QY1V8h;rWlvqC(a7*{7zLKfOQ?VhhxxQn zG_WTkTgC2x{p!)t5e9>4 zX(4cwI+COM2Pyh8nUPx2?(=7cPt&{iGvdBBRCT3J)Ii%*=d*uL4WBgtNlI~wC%PTGI2enh2Ab`@)ihoyJTlZAGb0yXG^_w^DZf=Ff zwL_Tp-v$ey?(*JQ`E}2_Sl~CrpA|y)4}O-8hs@Rx;Pd%Xb|~XAr)Fqq=;>Kqp;Qp~ z%u;nb;ZckPNgTu>V6;fIiv)L1arqk?-?bhrT0fB4=Y+BvmD}6di6-i5Xqelytc};| zHtN2W@s$#(iDxP_RfQPQB_E^j~qq0&Q=ew;uVzhH;ns!h?w$|cz9jMknE*my_32XK!Ug zgGt|zKF3hqN~wB{D_`wG!yM}d5#Cvr{p>m(W^r-x@Uk49WA7*A|4jCDm_r?jn=iSscG-MRgl@lK*G2|D8{c}pR9B3M(I(O{g;9!$T z)Kxw{LU$|WVzJ*FW=yUZ?Z+zZ9UShPECDSM{tAvDc5~97rRv(kBKQbeMu}O< zqu3NYiXLcuBdQGWX&jau!GtA6%#~|>Dk%6^F3&U7}Eo!u$AOyUynoA0J=9s8Lv0z4z{txvAg&>|-V>5!YJt&!KH? zZHy8QuOcHaFq0loZYGO75kJEA*{iONmp{|;(fkB8(!7Yf5k5{du!!zq-9bxXlHob2 zTbHF=TjMVBH1v~-*SsE#6W-%sJl+{JZrqQMT{PN$q@{Ji3~U}87l5;#ObUlH`aT!p za&{9FT%bJ(Z|r9A(SqoXuH~egG1#142N^ay=MH=Hq)%o>23xOq;D(tBU--`Yl=^Rv$$hl(Y*>;!t?r{(j9?r2fu{6aWRXG|$cde1l7N?}skI(uVnD6bXZbG!; z9p2BMuh;LYsjT&7Dw82&SC^Lhhi%|+xPya0rPu{*q+J}!JDLKX<#r2x`sUP+q5I56 zps14W2M^nHH|Iu4@%&zXH0RWcmB8`JRr(b!M6Gy}f9uCmW_js$}&9&pb<6`yrU}3vdxWESERe`4^#~FdN>B?Gz1Q^;Fjo;B&7F z!Te`*S&VO_qrCg7$Gf(+wl)cCi&nnjp|1GXU^op^Yr21q?N0i$nEq)hVJ7*k4&)MO zY}^*As;ebi<PjQ>d{yxWty*JoRqDIe1P7g;I1=)YQ*+X{l9ot644Zhrp16F{n#j$~UGU{P zgw<66$>yI6rg7m?}}s;{7+fNJ4Y-s&;zjWdNvG)fO2Y%kl|*!=#r zG?<@AlZK64DUvnKPhmPq^dBv?irC&SEiI)pdESH}WDh8fgC_dHaQQ{Lb^9C_$55El z&6_u&m>a=F0ilJ4Rqc(N&%eB+F^DBYhsbWWQs?{a1wDwkTE13ttn$jHAqISe5@__| z6C7q&d(CSojzgrUfYo6mP1fHJXn@x}VCcUE+22wKa*L#|5gJ2&lSX@x`?SZl;LS3V|iL#buU>``$;z)+p=f=+RA-@f^(R+@7_`N zr8tY8)=->JfMDoD!^r3a2rjoX(bMbIx)-)h+S}NGd`Ze}>H8PLHvD~!ccQuVr6nu! z&k?eCOTFh4bFFoZ8+=BdyMZXZK?J&l0F~^rrwNI>cW(dq2L#1(XkAPabF!q{D6C(7 zfL7fcJ3ibs{T*+I^^bboZbs?8satK#a`SD7 zQPG8fE(flEnfJ?Ch*m3P|w0uX8NkSR1XdC846fmL)*-_Pdw4#b*V%hR9@B!hM|~keUC% zWfdt=ZI;5sPL-9Fp+8k6DG`Qh;9*lUZLu^oG~DarX4ZkW$iTVj1bJh^J&po7OsuT& znt@; z#%Y5}n(SUSz5R8#!Hv*D1Ta)g*$AN1;?+GVU@UzUsUDi zcaRx|JOzc&Y!k>5;+*PXPP42v34#C|pM6R_?8YMzWc3Lo$v6b5To2!YJ(}30N-$Z? z+Uy%bYot_?5Rtmu-CdwP$1!E#kB$$DlXnf4-INK>Pf1F8KK)ukZGHgMdY2i<{&e0Y zUW*#3KcXhRx4c*Ci=H9SM)Bd(@nOFfKlO}yW|@L4c3aj-w})Wl=Oe>kC;nnZMxz|I z=DMsm^>uaWV0=x?uN2uqhExJ|FxbbhSyO<+;`xILR;X2I2@s4f=+(6~+8P?!y~u5V zXgU~NlJt8-aaVb^FA1g5i9tJtg0L#lYR zF5>m`^ODkE!{3fS<-|5ypVWA5FEKjSnXladp1tt)1()k*O#uh)AXGc*M3H8uYO$Yx z`@&1Nm}G12?;v_#B({iQfOY6465Z!sGvR!7vw!5>Y{u8GUt7YgU&!=zr`>dkOBx#( z80hc+z{0`-{6c4`Ci5TjKR$kHYmi);5;-<9B00nDDHD{Ll{yYUk~@nDBp2FZ<48W6 zvDsj=u0k=NRo9srnc7aC237-u7JpF<3}~ubHZ~K7W;CkCQ3#t1QsEpQ3~MdJcx@(` zoy+tVTgygNqDQZ7Mwqns4gryo@j?K3CHq|D<@$^Vr^C}kYsaNRYte&NHFGXI;`A&m zvTjR{P)Rq1go@o)4Ys1A9bEy$!R@GgmgDcUwtg*D{l)N#b2MpJ10qoP38Kp&F=1A3SEi!>FdFM(mNY|764rX^jmhXwvf2 zv&2_eTBLRV$NALoB&+G@=qPPK6UtoO-8Jb7h#fZWwGJ2i9{gVHT+neBovO>u&VD~% zjE~yy{}mErzAkf+_DVH$-)t?KL%ASn?8lF!p^KslRlu)9Ww}d}?cPHFCObxr{iKWC zw^Z{l>-qc3Uc)&K$2yf;-Q;kwC__g9y6bbzERy}R0kKlysmFFAx**`byW!N#$sbPO z67-R}RlLR*{M4{ej419>yvqk14;*jA7*$zOAy#_MNRn=!t@p zx%u;?Xwt3hL-Q^RrOep1AkNkoFJ4SdnJ*_^cgnT(atJ561zo-h0eqOOcu}lLqn|Oo z==iPR?(XjLI-aqd)OuFkSyM|o^lRB^YuVRILb`Tl{B?p50Q59mrr{!lN5J62w{|{p zU#;8k4>ju9WME-Q6trMsVjAiT`1)1J*8Q~(0htwP_GMCBQw_L{1BwygqOFG(=P$uu z&ycFR+^*{VtbhuMB5)}(uH{a$O`9wO=_#J^W73oG)?l$^m$Xl2E{os4g8&~X<|s$x zI_b5{pU&>pZR2G^^IPp)JuAb_KQ5O5L$1?X@wzyB_KTf$9-+|%di3jzW`3(8h{)+7!K^W<54dy{qTT-uN@&p*!tHHe+V zSXS+Oq<@}+O4}eFDkQ&`j)Mk4Pfvf>){kl`Lv-I_W>3So(F5hA+L9xVUt_)Vu}6OB z!)rzfpsq`-NYDf|ZM_r(APYPYM-3>URgI0Zhi(l0n~!($GqVgI+C6>x>Ah{#Y?hjr zxm!`w{4O=KiYH<<=)m-;@LK$Y$EGuM(^t*ZKK8?O{M+6JR-9KQ@LAVeVC$F=9Jb}f z!Q=csXo{>8U09lN!eC3kR3@bcnVy8GC}(V2U}_Nz3;VvehpMXvw^CUbLY^QFu1)*O z$?{xq8E_j7e!m_wPuiZ&1lQC^dA>alSA;kqp%N(-ak#KgD~u&w4e4iUoxk<|oOwBib@F;D@b0B<9v)Tv_D5sWI^uyk|dC$pt`vqBe}F224o!|$`%cICXI9e&OAwq7npVXyjwQ|624RRbTx zX_t5nKOO@E1I+{ytt>T-USV^=`rn%EOV58vBvpvY0c4UtgU6Knh27u%z)-_Qrc_lN zcO}Ca*ER~TV(Rdk^aBi@+%sFuBk0;92DwEzh^}zT1s!eeSr0`~h=kzMQMWAdG;`f@ zC7n*Z@=nIW;vz|DuL3n%>_Y0R*Mt-R;hniyS!55Er2IMhF_#S4`0};}^3SdGLL@Lv z-&rN`*{tta)`c4wNRs2#c3+;YLksYd_K`2xw1w1tFXL2X6FgXG-p{1EM)OsA2itE; zCwRwwf;w>tBpg=0zQ>^yYpT>_tV7?w6I*26WV~@Hs7+TTKzF~Tji$1^yuhHM-EF~g zeWHG|UR1^6PGf>F@DBa*_?Y7CM8fnvnqvlqz6#r6g03`@TGCp)rgJkZc&KXT-gs(T z#o*0NXOb$7Yyk*rKL%cS|Hg&>*RP!7ZzwRZ`m9zAgFrBIbAM%J1&hTt1rg!caGqP% zr(;$XWHAnfE^_@ZDEN6W-jAI{r3>CY;;pon%ic(63?45ssuq@zxZ-bNnXtj~n2xOE#V|%8Kq#3^C00%9SgE#xwgAy*!Wi<;7aF+CF(;T zxm@?jk7?u*O#igF_)OgbKDT1CSVAqrpdzj)e9&oDnBo1ig~V_vP{+8{I7UDcwLhrJ zm%viDEN+geYB=@JyeA!L7t_F6V9lg=AwC4ET+cI z_FEtUim)ai`Cr6jE?LUFL-28HIY_y|H87g;@ol!m3D)uf~ON zgByrt%Tnsuk5VoXSLuMD>)Mo}W_LfqUsGGdC8nFK_c#u69nb5Fxiz7KhmRZ}RX2Wj zupHOYQr_HXRp{$1d{x?MV+~_e(c<9XKz_S-?dg(8TbOFGw~r6TJ$iOlBIlsZLv_T= z-F-+3o;sUa>$C4%UH2s2SA0*v#FjUQ5Yn(`zmy=&>FC1=PHZIQMxhu=sW7+uq@|ku6 znpf868p@w@u6yElw?l7Gtu682+AloabGY|Q+0ZcczWGkH9ktUhrotNdVn3Im@Ablu zsnUyIlVyW%alZTp->>>

    M^$n@VH6JC+^-ot+})+a*8*G~|9EbRL{yyMneUQ&xX zBEA4gbB3bW%gWCTY?B<-tw>G7UH#;8OsFMTG09_ z%C!TI_F26S=p$5;2LtOc$KVrDMty)_`!}gj8AX-YSn;T3S7H&$gWBdtDiehT1)`>R zO9QI$R6^8tP3*<*MU6c5@$s>-xq7YtwWNRR6iJqNyFs;wC{naJ; zglN5SH|K#sWT#nmM<;LiW%~5;;FTO3&hszI-G8N6S~GTS6B)$@#$<{*fS^DKm!*>n z5E|APBvy*Z6r@eini%wfd5+gD-M?FIYiIX;&^K^WOyFX1t6inK-{&Bd7bC8Jf66Ss_z0_1U49`R(OM`C*C11C0L((NXjy=lTM4IA2W<7rGSXWC%~J znn690NK1&#K4cTT*fzOc`#5gHK{y$hPrhrfiNgBOwxpK8J(ix%;HOJmiV8I;Ikp_e z!x}w!KdC%DzZjqIFlO32SS~WHcFx*ct1o-r@%x;aX>JGYF zicS6*M0{A4s+F=RVKQk5s{AfgqLghgT>JJj6vI>CU5XkG@?3i_T(}@d%Xj{5|5%Dt zFC)?3md2Z_6Z0C@N-1USN%vJ;xP@B6WL>u(Rm)$GMBQzW+4orsp00TRERIZFF?X3x zkl9eLLw9tedv!zE4m!+tIK;EZSr)0Ehbx-cu}ZNB#(Gi-3W@Oz)(uPJf>u^XW#ur| zB7TPN_v%w7-dogH8&qWs*(wa=&OwL9XR{0&bCj?O(mZ=Z5! z?=rmgwx4V;er0TPd>%l$^61yspb~;t--u$!n}aAkfd_Y5!$@YBOi?i{Y-dc=+3s)7 zatUjG5NR>ia_c(cA7Q0CiB7!hVk~v@W@>7xmO$>+cezDHiOX?<@{c)<9aMZOymuY8 zd^Mw__t5rGHx3h)5-M?RzG-G(vo=r_Y$z8%BwBCQKK?>l6yN!(#P|uJrOT7tq*6QJ z_X?mAfutzUM{o0|lvtR*e)|^U&F_{mar`qS1Fn1wYl)98}N0i)dqL!v~lY%y59Ez{X2E{~>;=B0A6+B@>vv;dE^AgM*o<8k$GYYW^ zX|~VLS^A*mH7nJ^H<>uY80W??_<_i1FvQpUf`?##9Hwlwa6{P~igXt<*&eo=lq_tw zc7WhK5<8v|$y-Ho)aEc0^-N|!?2bV!@2yK5UC8-Btyg%^cyr?Jw3MXK+iNX-Zy9- zZrfhecA&lO$E|*A@SI$cS1iDjE+9ZJ7Ug82f*yRxNpuZ`elHk~(xuiyZM8;oY`z?^ zIk9CAYvi=%+r0W^XLq-w4^M!Isl{w_Fe@)lrGR}hqEuh0qL<765Z$8#K;7tR<*CRz z9A)$Q?fR30WhC;=-(<~-5Y_S07~-%XF_5;Bzne`&_i>Leuc(Mh=D=2~ohB#{;=rs+ z4sdX_A_aSY9=7e2o*7w2CA=BXhZ`LmoAf)h-#1~4v{yAK&@1`*MD{TG^1~0gF4x38 zV6n1WAdlg?U!{~t>GrH9usk4TdqdgJyEsmyQ&Z(YpeT4VP|y4v@O7$};9S&zVGw$L z1&YB=H{3rO>@)4dKItc=8ZtKF@ZejT9~{aQES=dM_8h!vr78fSjnPTYM`%g`>pj}ZZd1eO0CGoi61M264H zEM*nX3C!Q}p%V)5@#+Pr?uinl3VYB3*SZLE;V|w-tAehd2&MXQhAU}ev^|e#*#?%d zHv5u-a58yJC>ho|q&kxWVDCl@x@NmU2L^i_!>|kQ?dcPq=MuK6 z3F9Leb?$e=r#rYU*!Js*Hbbg&Z1O1is|VUEy4{~I{+!|$BcwomNHq2H1ie2p`$%T# zysTPH*qb0Cs`i|(3Ht~DpFtrGPDSR{+8W3ww5Pn6szGhZkKVpI^=@|%`jeV@X8Rs@ zEa=)HL-4v{M+zp4E~`ogfB2=EsZb$!by_L1n&Vp}vq6pCxt-ObBOIBJVxo3oWzx@c zW_>M+o9e9Jnl*NL|EqLtP|nZEp#8cGKAi%%%zlLF(c|aOe|ULcnI*6anFHxsB@YJ& z@ZkpN)%A73bLjZSi)emUDH5mL3Dz%K`P!)ah_QylbBwJ?}Dt>*RrK~(S*-Ow!%X@p!ZEQ*&SUJQExCPZ6+Qjul z7izsi5V|IwU-p@9nC(3WRq5G&%@Bs9To+%WqU4?Mk=0l9fWya8#OA)TPqAGKdL0?L ze82>h4de|q24Tp7sgOE=aJ4-5?@X(6_WZQ-1>gn%>+rRbl_{$di<`Ecum@zYfhuxNfnzS@|e^iH{qv2b%TCR@Cz@QZQ<`PelKwrU^SH>b<7LSYf%#d}VbSCzm zyM62Qozmr&PX4obz$1&utmLL#?W(0nO2($-zu!km=H*lCP*tvZpBn7;sG9CCnY#PU z>J+t;@YYhA8>Oo(T_gi-?=w(pF8E*egXntYjfI_Q`TWmCt+q;@6<3ozl_8k8m_!G= z=TAW=sm%~|uf{)}ZP7-tIIaxGm>3u}cUo=&z2B|xs@ixJb0PgY$LXhQ2DjK+hb@W< zFo2r_YO<#^xF*c?cw1g?&5NY$x^i1i74CWfxJT#f&;J)og3ilYJ^)XE)amwae*mRz zD3Wa)F+%oa)DUpZsOtQTwmV&iPfn}dwMPM0(c3%lZ0e#O{5 z>=gsATQc^78{TiuziI!GZ*`nST6k}=LgsVL@v;s{{Eom$3|-~@HJeA}>Le&2=7D zpbX8St`KHGPl$atpN?3xR{*N3rZsP?oGbsN5#!1x`kwl&sK!t8WB!gD z2G71R8(l3z@O?Kp-2rIdSi!ef&|LrvIJ1xa0`xvo2zt>-BgS(jr8R-y74-MdJqq!#o(UAn zuSlEx#W$tHLfYShmhrDXCG-@bS2O|sXrQbOnF7P-zTfs#G+R} z8hyC#xqC>ZdQ(f6V|993+WJ|!R?dCUP|qc7vzlig+y;3d@V^>Yc6W9TAZuiTb*y6r zM%9~uKx4T=i#tO=q(VeIzH<6Mn9nk?odt+7-yU`=oq_w(hjE+v<@rRrWM5PwUNi-# zhL{q%0EUc-|FPR}wUvAoa8CogRv>*Cp1%iXF zjfJYl9?(4}z6-RES+WL003FBsXz!P$@cvru`VRlXYl(@6$iY%_HC}w2T)0V5Jk)jV z_7G;|36?GP#m(`G(@~KJEiM^hz5E|}JIcz+fWvhmi}?oU$9){!5I8jGCsg8+A|Pkt z_<4Y@T^uuzo02*R2k~vT*|+M6QdMc@iU1MAgk})vI^b5p@tVGvQF|;tZW@?LtFnfn zz$g5GPc{RMKX&k5gzViwPJo1SzSV08Z8$%5$ zd2_e{LD>u$XqRnK)vsha`T9SXiE{#SZ~<25$n7l$7xgOoSIp$#0q2-;6S7uF@O-iV zi#0nZAOa2Q3t|H@;ihEKic<@Z)Z>RJx1NP13Uq695s)iUg@PS{iCVOxWMA^m& z`ArAz-`eQ~Zl_wW3tUM_46!u5JaFM>Gr2VJppi!ozV$Dc8`tavd;WLu_m7sGjrxNA zIyhgy=Fg?Yiis3|xK?K;cs82@#)JXg94DQ_2HRh5)xYbQha~*sI0yszDTYx=uwlvU*f9HtLMEo;>{70-epYbJ8 z!C|*HiC(TovR0v7s@>7}y`H?iO-`)9w--nqByf{Qa{EUD4k%tusfxF|s%Km4MXE*j=V`9`mLBLITmIsG5 z3)8pY7y`H*;HEx-bhm*pXW#xG5Bobj{*Q*74SIp;aWE$>`Wb%&d3LKiXXy2k!?lb4PM-fggntIsftbH2sb-S@ms+0*c;*Nt_NZ~=Sh!`*4Dw95{-@rY zeR7IT0+!h?1Ir}(Y(`*vcHy{{aqPAK4|#%#9(_NO%f1GSm@xb3WP#ImoY~>L-sAg! z#m9}?0SV9C^go00XQuOaY~_!7ECz>JWwABm9|gSZH~S4clOG&83DudjINM=Yg#NFc z<8J29cA$TBALj;ufdv!cR2i7-|31zC6z9xu0_px*^*_UT|9GeWL)X}`A3o6imnxsR w8F0pbV-a9XfT8M&C%)aH5ER45=@S}o}H28n%%?XJi!Ciqc)v%Kh)?v@1 zlnIfvE6}q~f`X^N947RUK7Abi69I;72j$I4NoisXR-w3h_SpnHmH_z*!cTytJ@gh7 zq@;vm?m(Ev+0LJRA|%BBvQ`quhNJPte;b<$#hmSzj8G1OU?5l-ZudGCKG~|i@M=;( z>bO7sWJ+yQ02ORWfJ}U|Kd;?3$l~p?)9~g=gr1*2vZL~j!pUvoOPw@VC99O$?}@YVsB2JIsq&W`i8o%GgVm!Mk>E8H)s+TvqXS+DYDKbli4Hd=mE zUWa{()^29VMq)k7E0-xwma8+O?ghm?z#h%S94oFn6XBAZku>K>hd&9D?L2)*7+m|6 z3o?vl4a_TYTZg#3eEA42aVM+YV@BA=fRb|BG8JA!P73EtBg?fl(-b$eEEVkb6H)M9 zNMpjk8%mdV&fN;bt5WzVueXzKF{Q6qW~-a7PO0zm%%!a|^P%n_{g$vU7Ly*MqCd{* zHfgK+%SI>Tt0TRRpH{j`1B!A?QC2M76w9)?U47(-sCmT+_pBN14*OLd%M%g}DHH|n zC(g7|-5c9KI~;D7be$b%xyMwsMr?EIKAUxZ-X~Zx!+`}CY3_1tf@mhP{7-Fm?1!pg zN6L+DyO-$d1!fOB`JPlw4>S(BF**B4*iUm!>pmngnl zS**FVoqTNm%>0e_9IgnuvzT{O_8|U8Zb^E|_=6#&a;Khlqh|h4L-XCdP4=`M_hQ?g zgRGJ){|2d%A_alr$1W^|h|w(h*D8`nhiUAAB4&Mej;y=}3tvUD23As4Tbq|v>_SBU z9M)EUM@mswL~D!Uf`0mjdz*Btpt7_=$UJR(3b||G`?nqjy^HGQOeaG>e_97uPh%~O z5$bYT9!Xms#Pufx;UF%PAJT1-MA!&Ed%Lf*2JYlYrD^}jrm@lU+CZbHxAh?K3&LLg zJt9_1U4OJ~6A}`Z{ZiBnnk%WVc1?G(kQ9VkY0hj=31x?uy0S)XzbqGIH)eV79)Jm6 zyO(%yVY?$F&cn)VFh)mQMB>Tr)lo9U^}i0zrmRc#Vgc(PylsU4_%7ud{tafU*;?r< zLAQtsx<4wRI_eQYKSz>2jelzA#H@>>>G~{mp#9nA8zEX)n2EQf+AY^WoLk?t-^2be% z#{9{=-$O;mn6Sjiw*nT<(_263I?vUy)Yzk}OaybYob{qsOfNM-t6m3+y$+tV3}iyK z(Z4>&(acXE?I$u}%52E=vT1_3Wji(0>T#3YnxhI78BB`#oifB1QSw%p)25jPV~<)C z=CnmMGkpsu!$@UCP+|Nb#YGQ>^4NoS)`mr&PWb<3ur!{RRw>u9yK!?w!~?bXwqdg{ z0-IO4li{PF(baB?d*9DmUXF2v_J!568h$i*K``w2m!iVQtgQRs~>y|kFs&z9mxnV^H$QYKh%Kfg8;xsdN@&F(67M2D6JQ<_!iAs5 z#GR+cc(-5PfWVh)?LIt@Q9-f9`Wj2{4UiQCi3pC-6fmP$xLPkV;TCG6Ub)ahfmRC{ z)DQ@4LC}N)n=ezj2&afJj5&pCmd101uTd-*E8BdTG?dk&IKhL+9WuflI%>=~EgZtc z@LAeJ3_=U-pc05DqeCI(s$Go!smOpOOsU=(w9JOa{oQI0_Tx82F6UMPKXq)Njwr9 z2_JkC%2-xC74v;&zs= ztZDYw44pskf?cWk;cU{n%o03v`Jp&2zRNU1Z*)VlsNHb_&c|nws_l%G_|nQ)rbzB) zV!ZGqqR*GNr}Kb$aL0O3?6n1@_Ybe!<HAuBEFJ@-a=9yeioPpyy>#WJ1zzAE?ukE&=jR^S$rS6>`QVu;RSLsC`1 zLkU(V-FLo?GSE_x!eOSICRXz@Mglqdj>3{*Sz3jPwhVsRr{}BT?VT+_snd&<*llIO zP~Fc{aX$xz!?-jVh#^c-d|2&=)B2McmhucYe7&`@2-H~!c_eV1v6)QxKzkO2ft{X4 zVUArwe846l!F595zV29n8bB0gX2u79DE|Q426df|bO6YgZl3aKUO=?$LHyds$kE{&(q`_xRQS z-Hi5alsj(x!02Q#p#q*T+ATBk_3?ir2<1DtFP2uGM_CTX^d=`8YNWHHf^I{hjVCh# zPfnIE->v)uXliU$;bXT2)V0VZ(QP=d z$mO@wRj;jClA^eH@$U&+eL)>N`RgkZ+Q$Ph=tV$G=7EG4n0$&Q;mcdb&CSyxHZefyBusiyYT`6E|}!|2)i2ce0B6 z>k8XhPL!NC*jUW~ZSqZpyfF>8FzqCWI`hqYLf zDQKH@~~BftW_(|WB8^MgYO5%?h6%{;N-_4 zS1VE9{WwusQgIJ7l`jirCJ@6tY2i!{w``0WaT3fFVlZqE-=-`QXVGn56lAM87`7~a zNCt&}{6i_iKewiMu`Rs2bwOD0371ZuDIr>ms6{-JcQIBtiHKgRCU$7Ei2DX!?yUlrOqUK#Df{*Wx#?FVzvnSxK0RjvL z)sj(n?`TbJtTb?_Pzp@!0Y<>71bFWeiQ(T{%=?X#b7qcg7+Xt>4)S?xylA~SPY4%9wk15l_2!SiEG0mfYjDZ~w!DXK4rn5k`BwrA>>Gxe7?V6THOGrKp#}HJ(ev z^boi`@|SF#>?*XE;6la2;zOk8Y_hAlBhGec5cwiJR$n`whVkhG{^9L+8vNJIql z@}cNSeOn3>I7IY?;RN;~KLlP+DE03HqwXlwT*2(`3|D&$neoo?ag(d`00ksFesKB# zttpNIWuEBQa>bJgMm?~jgdGmyRc3)P-5-bgX{BCJ5E=2?2c8U|`A`DH>$p6Jla1wh z`bH0Kav&$sXd#ocBndTaP#u_QuLsC4+Fr8XY z0=GhqQfJUTzgV;sn$||V{UYj;k=s>_{uO@5NcnrzzYAHHo5W#U2Beq?^@Oa}5>uS@ zg?BmgTh-YPxR94WcSO7uIB104_`k8w79KFJ9Y{mS}!_sx%2tDhD} z%a76y=d^h&oowV2nrV=gkJ6cb29N$8ok?5Xf}$fj?)BI-%BFh{tviWWZnj++H@N*m z%A|75W?0<+n(;j}6%kx<)Vut5d=&Jbyb&LEGM%tT0mRk&>VCQ1ZGE$(82$B>wPl^z z7bEJ|u?(HAf2p#=X;dl;yod?Vk2;3NRG%@DVMcwSG2FnRZKpdnQ4_%hd=8Yx%SQYl zXg7UXAIOM_i<=Y)NM){^=?4+c+&Xn%BvWfb6k{r7-Nrn+OG2g+ZY4vH|nmSvt#=a zYafZWI$7&1 z>+NpMZ`8M`O;Kmz@D&Oeh^O?9L&L)!Q%&zRX}=*Bmdu8)tu-$6WQirLk?IIOvpS_Q zP{9O3^h-mqvH3cIt^QB9*lsNGEv4|)r zzZ1ZR@<9X}E#?!;%gb%?zIo3ZsiEk#JDQ|AFI%HngngaX^sNbD(md=I!B%}aup5P+ zvKNL?y4{I1GwWx4a2i=qJaw;9rEPGkfqTk!P&lDyE6YQzR`|@NX zrjsei3h&^@*>2%{*lLSLd5Jr0?vdZ{mi`vSqZ1Yu_Pe!JMO8J>O2DA3KJcA1#wW>= z0Ipb)k&x@Px}8uv-y2_+;qWAcg$yGPUiTUFqBZ=F0|7iEBZK?JCq25|$()i=y1^$; zp3J-tMS0h-D-grcw#>S`|F3v2Ssv+iRFpesRD_QV6eVv?%H3>Q{HoooSoLQ-3>P!& z0Ce2i-tzZK_A&z4u<#I|zE_KbiFoo00>AtqP~(DpSu*T4LQPHWb&%{uDr-Pjb#-;Q zT3j_YUL!>XdvmcP`Bp`o{%)0a=G+B&_SGK{^llIKnPfvY3Fc?+aorcLL4ami8iG(% zFI=S7Wxu7cMc5pxc~sVQA#Ks597xP%_%lD0#62GV z{D$5*VGB2RcP0VDB{nnj__-QV%;(RaIe$@(1_BiW&OWSA+s%{^6`VEA5XNfjv^wKOvPyCZUi%8w8&lC1jbEr?1#vLEy& zyj>)OKi8v}CLvfE_#FeA@u=#37X!rdNY4ulq75qtSq(isE3;_J zUv*tC&%I|q_2`Xb7DHtT7lfY@9~qf-Z$tXbCs-?&e`Y@>v#4?y+6;V7Fif#C!q6|n z@}txPVDkinuW4LynK%1i7HnQ1)={W&1JP>mXZh;)qH!|_!Ul?NyS%7nU|^uEtnA{l z1CF7oiA<{ML7~%K(_Dk{8OwV8GFb-)hc~D!hN7|-SKK)vz}1pyQ(}wAjS%Sk2uPhVG8HzeEB*LNeGI)|}c z@-?Y+>HUtsv+c76mDMCpGp!eG(K*a_7MbRPJno8$Dz<7p6%8KIPrAKJ2plh=G6Bw< zYV0}{(#qkr9yde>4m{r_7M2tXj=Oj6kU1A!>AzI&zDB~Dde^E~MNMrntIBbn?xMB& zwO+@U<)#hfOhs+_9KE+!4)^{Rgo$aA#<*BH!nO{*_n;Vn8KVy`_yvp)$*0~F)Us8F zl;q~x*7y+b9fcGn3o_Y<_DSAr&8N%h3>K&gAPh);|DHAhQ}gbU}PwOVq&pc;F4@x{ZeXV}Wu>!wfChg3Qr z7IN?2<=??+h&5QaZ!fLi=5PMCvVw3KD>7?gWO*2E^w3|V=w(MTvOtH_Y4V>l6T(sn z(5E?%SCwar>%QI8{|C)6tK50I)rR;hXi&Tf)=9*1?AX~RH@Dn^6)0VGoj*eYK zM?L*}4#hEtv&%-uANJ>rvRKXQ8aDM$7K(Bv7AIL?=0hcP3=iCiUw*@nOIH%e3s_xHW^I zEw0zx=1=vSqPjHetFY6gA&T}iYwa%t)WGV<8%?~C7L@^`_ghsCn1?(Q2)X3>_ujp= zB4ln1Z;z_7hiAo)@rXFq%YDEUiLLnR6RNC|9EcfMgQ<|jUll5E-nnz*TdXj2Kw~bX-6$9bHJ$h{r2*4{qTqeR2N2^SH9)%?52FBldf+Ydai2b8>S_ znx>QF{4JOF-GTk;+;}}w<|HgEtf{GKMl)OsYD#j>NrkKo8IqVS%YOd5 zyJiEC(v^b`zT<5BJlbX%)f)EXh4rwI|+h#?t%O2OAQ9-)~%4cGm=UE*Zf*0@Z+5 z9F`Z6d^$B7b~(=dxM7xuw&fjd4rxqoS$^8ItzZ`~uK&4p4q0ASrgS3A#>Pfs89d9z zZ%|g~ysSSo^NxxolLe_zBJwS}s_M8tkRC+%y*3=g>srtg$HrRZV^A_{z;2Mhb#!Vh z{r&DZHR%g`YrCS{0bI&I3}Lx+2{mY1?ys64GGLzQb-ZU8>MvFX)NKGj9<)KZ^WKKp zu$+RljFj_Ie@eJiW{SZNQw4jC?@+kL1;IQeBDg4NJs>0c;Z^AQ97glcZQj}$sPZ>Q z`}QN5X&T&^;{Fwros|*vw+CBM+G`y)$?rbau=~xGR3GJpZI{k|ft5S+8GGYtuLs!F zp3Assse@<^#Qexxp7&M-t}-QSiW_%<-jg0K6|@Uc-Nmy8AO&wz_4M?dZW9&v*cE&U zBiO+y@jMzTv2Ayp&ir~`SVuTXW3Kqh?$tQGK=B4aP_xA6sn|A|(9qCnCj%QBo3A#n zhU*3jEJpH#$9)92O7bCn9X4Re)IWSEib>NmCNdQ=Y^v7EqOLLu6WZY*KWwvo^ISr| z%<?Z1qtom-5U8XyvHE4+u*fF^I#chF`ndyw^Y(wWiBYkdKkYDca zGV0oxItB20$pn9XWo6~I0p69Vsof|xCpc6O;4L3a2l#$_+xZ^h*>_bP-}pTChmJ(| zOMa5}8cm(jj~Z6$`0>1v(i5DHkg#xMs~eDx_oa&$e>s-EUi#6f4}-}7(2p;miatN` z&E}$xPe@R%!?X^=+;)(_iRl=+Hl*^9T`n-}qe}+SI9Kx&LPcad%1&Qri7*1aQ zZ4*uT#&eAv={FNu(Ck>4J~kZe{+$2|M9uJfFoZ_JWyLY2ZKhpGAa<4#zZ9r5CpZuw z-Vj$50K>u(bUrNzNG9GoD;NP&8AOzL_VR zNretzCY0d<_L(i1bsZxVn=+4MKNBM0$dPEYl zK;HQ?l!cyk%H7I{W5iHg@Y7To`I@3U&^}kSiHU|_rzsFdN2NwfmBEpt{#i-%fUKan zxcGITCXAvTmiN&JQc|IVPF0R6+fSij;{Oz5oU=FP;z5A4-R}}*>SKK^yw$C##wC&) zc6pefC8w~s*e#|tQTim#;)|V{_oJ`bW?0qko^yCg-HdR!&YvcR>#B&aU5U*Q3GRB0 zB-y3Gp`oo@L+OpCtKQR(=#!U?${U#KNA{#omi#2DkLIc+AvkSzoW9MyF}jPHWf}qz}myM}k3_RNXoOkcu^<$z{?mOio{B4D9Rrbh^y`7PD z+;6L-wo$Wj+X}TEU9e{ebF2t(|DJZEiI0y@eE0Y7-&nmx=he|=OWy8{JYl?C3-w8d z&;Q|Fh!7ZiE}sju7&no}8~ z5Jw3S?)o3eik(q+TDj7zSFegNH*L7|p$&$HhTPY1HJSyT6yR-Q2D5(ar()|0g2)f5 zPudCKun#X<{iMm&aZiPF!RBVIo!a8>;zJ2u^ z@VCwydQIZyZc5sRieG=g3EYKZ*3Bm#4qQbgOmSXnmp-Y;YToRB9&Sc{$S!6-^^7P3 z2B(*i-nXTxa6X~A-1}PkBaOoWqS9`PNx3-y@TQ#k=QuWL^G&l{-c-da=|F%<;=44= z8{2;V{K>2;+$>)OLDc4Y#_$`sO@@lXbB3u{L;}R*S+<>fGPTm}KWhJQq6jIR#|ovI zo7WCITqVVY2Sv777TZrZ|M>A^?F$n>963*(lauo+F_Gr1NW?>n`+0BArtb-! z5xH}R$P3h+u&G*NxHOH7oAm=dJq*DHmJ$%e-BPfoHzDc5;-bN*O?|5`7EavK7@CEa z)o!g6T-!fhJt?Rg?%p|GpF)pe*`pZhd-$}CEAt##r9ApCW=cAsqy+_uaGjQg)aa6Y znen0vg~U5gS+IPbB(QaU=jYF#JDV4T-D(k^X|?o^S`x~+D!udY#5+-HPS9niPg&g> zdVCZ9_U+qknJ0--taecVZ#X$SmkqLNU2bl`_sC>9VMAku&$m1+2$(JuT7uV#}7{;oqsv6#&Sy_2B*O3zEroWuWJc|klC}n38yI=OgZY)Q%Y;*W+gG#%f zwCQ_Q4m!yItM<#IuCuI6%?1VLs#@>tZ=Y_T6`2~KuI0pYjb3N*;V><|<76 z=b<(Kn7t>X$x2U_PWw{-l4|?N(N=8MY%RMPlizyE%_ya5 zlQ3HUe1?1qNXZhDgs6^QKz-3TDl7Eb)TB|V{d8xC+7zE|rQh>}vgQdkeo$KRe10^v zGrBdDAhj3|IL6~=1&8ll&iCCB5h-^4Ywof>zp{c33jxK>)5z$52d@0=yx&xz=T>;^ zC*vR&bDSmdFcBkPxKK!ICj;<`a{JesCG<^3b__jVjY)g{4Tp}{w(<$eiQd>j7CP;* zjD1?19^6c$UWh(_eDlZnG;6)nhn^gGX(yG`;_|YewB;K4&ug?0{+vOGX!;>EVTV)v zZKlP?I9AhNJ`f~5H3sw}CBp{fUT2HOjVA(_1($NJXZoY+xynuh!kglPto#nrY!mmT z`XHZkY0+yh{jGy7Gsy8Lz5X(#pE!rb{|`N?lmkU4m`q{43H^qDEsa%=CHxS)caIED z3-beYv&M$%^788ZY>Ps0v7ST0qPWRv=S9T0$;Y81N$g{bf}-Kwem7UfTdi`LivdfF zn94mK{wkuWN$ON^tpB4I#M#7tUO2Gj{tDLu_lZLDws>;YRxSnTsVoyY(6XfCvku9PYDrohMj*gBXFgbVeMYQI-m31Z^S52mUMCI)(^X5)8VfaGg$>_4EUsuju zC(YTLAu!KFPRg9DtS(x9l?A#QH8|KPGtcG?%OWL#$QuX>fT6=hEVYF=4r6u zksOHWjW4a9#N|ham)i^#*U5Bl+%Jx{auz@(oS)XeuF_fiE$Ung%{#!K?ANT}<~}rx zPMGRF79Ey^UzB|LX}^~*G1#YgG)>ETBm(Z2ITa4lX3y^+5`!pPZ*LxcS!{yNL7{y; zOuDO=5yY4`kDvKhSbzdBEuI|y%TC3Zd-Kcr6!)7g7hCUi$XQreIAV(e*>3T_T?YL7 zJUiGPg~-vnti$s7y4Qu(PlM0e0R_69j1>O!O7iuZaYd|z zkWfCz>vtkMSPg7#b6bWw@WEzB?x{tNh9^py&Zf4&8Vc9ff&yuyU5WjapQ$d`q!O;Y zrIBLpdsbPTLGHx%u*|~6T5PS0wDR^y_)G}qgiZ7cU%ljI8w13D5pkLZen8n3*<9-l zb(IhSYzG~le4uVVQu5|@Gc-IjG*Dt>w?I~~PY4;(P;jioVNO6_D0%G%AK&{uPcWN_Ln9AUJpK_EPjWp1R^#bhsnw%3;}@ zWk=;0O_g)I_W#sdwXM`5K#FZ$sAv33aKvDa?dn#g#7ODAfs1!9K8!85XlE0cAy09* z{siiZ(-rK z+dj7PgNo-UjgD9Aq)S&@f9hOUtF}l#mR)tuB4Z550rkBjP?X&rOl43ekbo`cVZ}Hy zW2NOkZO>Pvw1rshjCr-+AU8VP9n~~oF*i4NT|mxFjZ6(%_fwvc}$Ft9qp1Pch;1OUZBPd28e7O{M^@{q;ZeUGp_N8B(x2w z`m+?;mpRWS=WssCb0U4+U$KE|R-s*x#kg`)jxdR@FK;q?9kr>;a5Yv!k#gk?4 z)Uisdk+CDy_O`?w`{l*4(xc_+7V2eJxsopTofU&hH>Z!|A$pOFVQi8Ml@}wUNYZA1 z#$xGzpb7A%tq)3P4Z%zeUrT2=t%r*FZorJ4pDxEE!CEcBVo30?rM^Ps(|(u%IazP!cd9J*uH{5 z_e$9`h3#?mDploL3%pb$U0o_hz^J#aKbj9#(E(j9> z^h|Pn2_AO54;Sdxr>h+|l5+Q$b(UEMyvNVRM(Oydt1nyiD%4$m+xyA-N5p$e+F2qJWMmxq#pm4agk-CN z+ne|FmO(?&noSgRb|t>d9Z=0xi4>oHpu$&lr~cXpm=mwgS+8 zApucIr;;e<@UU<}d8hdfRnV)kDo;IS`Pn;EGiY!QgE+uURM0;>IOU4>hw=|B}^8o<$Dftkj6R z9#(H#r7VpOtrrrjwzg?j#CPlK6k*Yc1G~+UCp+bqW+!w{s!Me^+^seHYK(YqM^lCT zE~|e_DDAnnCXmR`p&z>qN?tyLSvtAR%tFhx(~6Y`E9GW;Ap{7}Es-3_EtX`VjmISN zhebjia^5=CrtPVe!0ZZlp`y|IMy~KB^6cx;U2J^ve0c~fE9F!T22n#QZ0L939v7z& z1NjXxB@vC?Y3J-{s%^7rxc`fk?TtEjux#WZLN8SI%U2<~mna^6PSUe&#<(T^5zdAr zx0lkSj=ML(UT|~L-LC+g>sF_?NpQy#AUze8knr%}mnjyk_fHQ0?q`~D&i?+)Gg(Tl z_T=TOR~?JlC>|)Lfn>O|^=z}TP@O`imgxu8e*@mlp__=66xl}h5BB#xE|2y1>&g(j z{4#Etv|IZk>0aSVp&ZToo?XfMfoP;VS>hb0+wOKaz2wp$g6mSY(%Zqc3ihgXud2WM zE{JxexCVr&m3MahgI?X}EFWwm zN~l@IUj%C8R%|Gh{&q4B^5K6PZV|z0Tag+<%{@+H#-6Zd>mF+f3tzA zJAI94_|OMq_{)=;hK8cZ(<2w(hsKrjln@1bJz5KhG9aPHECGxYY+=Q3o>7(jUnW@L zcAjz!e`uSMhuHCt&6L=~Zz02K`Ma0bIBmy4F?&O_ z3Wbmra;zJv!(+&`JOA*)-3x<{dYE08pnX0VDZK?*T%yufjo)Yb+7A&OHMact$(vdD z%ElLYzVyo^HHfky9*U(8$xq`^=qUJ2WyzN8GdP=`hNzM?AILqtC#`ARC`VTe%1IDeo;QEVX9(I><wYy?p>Q7NQ#%p$yJ})w+Dz5o{IUJgL4UJGv|d}dH1+KF zu5>k0M7pguTI5rd=##{p6g2t?X@ex+UwyzwQVN-3@MqXWV4 zoL>;0vtcB}{WO&3lq}EszSR_Dpv;NxeC{)dWjWU}+{PW3M3Tr6%*$uc&h)USR^xi1 z-hvO(8Sq+CE41@JUtjyhK4nPJ+1^_f#AM|0QP7(ac5wvX?VzG^;X`zu z+t$LSZoWuDmrK+<@2UAaRnWERkFjnDfn|*7$ z2-S5(7nc$$6YBTkA2GXOS_b#rx3hDrVzoN?J~>9VvR|QbT_<{SqRkot@}G%^aK5ur zsE-blR5w2VVKUa9z5h=7Iy-XfYNy(-x#Eab;m-)ZE*CeqGG-J{X+{+O^|j5hs)^kk z&aM_Kp;m~|^YipaNwSWBL>eC-SE*Q>C$tZu zy}rJVc_cc1nAC2%_ukp4qoZRyK|HH@!!FTtTTfWmED0`V-=7=Gf^N3Vu~1E#>e$s{7KB}mES3Sf+>($!UW?c2DxS!tFj!D(CKwq=9C4f?f$`mCpY;%gKx~a)5GP4i1x9&ranqsr0Kc24hpfBwzhr5;+k_K z64DmE-1CufaZlsj9;b2|v~+E~M;Lb(`0UCVe}Q0b(mYV zpUM9R&~ED2dFY-DJXfXIybe81mrb6fTeq-?Z3%ugLc6PGp?$5>_4RcV90v zjTZ)q0bCrP4DqngtzSJzCO$|8elki^c?K#Fav&fhUQv0AP~ znF6q6|q(Bs$9)%ACOF?X>_HrG>A|2`-nNgoWf7s|MHZR%RDQ>w84-Cdu& z`=sQ_YQ^8M@_`|Y-PJ?&Q6Al1T64WrE1fjoji6W)S`baGE+MDMz%7H%q5toT;PLHoo!Ea$%w|E%j_CMeA{PWwuK#;ClQ(M(H;J?ALo*N}TQrgpX7TcWVfXXxiJl;MV_sQWX4-1gl19#Fk@*_5 zs5MQBg6m$j@N<$ z3A{mcuBLzbA=HcIVKsQ{c z9|X(yDY=+AT?Tg5nVUwJz6J^b!=UiD@TIObEAvx3@1ES9pxYgCPf!UNzU~7Sq>p^u z|LjC6rIwYI5l|49`T4bu!dW%N>XQLg=k<4{ZIq}@!xVv*J9aA3^szD@AMp@Byk8xN=Qjal653%yAFgHUqtiYE_o4~;L_1+sz#{y46E8#&@Q!j^lg;> z{kiuBSeOV6o(WJQ7zUoXhYT0Jl*GbKZYQaH*Xy!f@>gue+g3FlNAE8}Wu)r}z#ao~ zE^R<5hF8zDz=^Em^}7W6nJ<7Y^e=75Ix)f(!W7JgCsJ>I11-N#A{LHfVI_#r6&XNC z3L1d@KSmAp_G({6WvP+lw4;{-GcVh`L0Pfsv(!jV<^25lkaMZNzP`J=JCOc{^>J84 z;G%DZh;o5y$EW^5-N0J-j#;zzR!_r0YAI$CBtrH_#HE&14J}#$N95NX+NKB$-|S60 zhK0{bvANB0;(f0cGp<+moZl_}Z%;>1EWx(u&5XBnS`G6cdlK<#oSK^I?~iTkHTmoK zLUuGMiPOX5-i%?zYdieua6gfMWyhcvI?ewhDJe+2LT(;smga+Uk==@;Hy^k11q~GvEzYBYR|anl#{w)meR~`GE{=r{=)B1VqF6R^PvH=s%0V%ZbiS3 z-`d)GT1-RB^T4Wr!lM4uJZjU zR^c{@BQbK6(m=6{wt%Ud?_2MeS0KQE3b^*m_5~lm?m?c1objJ1RpxSOxW22hKfZq4 z>yldiMcV6)qvIVV0>oG9%l9IxRzPRMFExOaqDV1QK+B?%Z{A(#NlLc54#6}r{Q=#9 z$(T09vJY5CFsRNcYCm3(`e?B)cSrjJH58t}mkOxqO_J-)eU0!+x1#a}Dqnr*9B5#< ze*OAp==?T^WP->QTpEpp`&^Pg=*Slo6AQenJ;6ZPlP?uNC(~DynLY$`>bl!^YU1BQ znI#=pVPF&{dxD^BLZl<%Wo|)1m&E0^FHNv%awEx+wLSFC@{k35sH-cI;ec25JM(RV zL~m9J=T^`DfrgblVRv?PbTronNNk_va<_SYvLd@@cfuj-54vCh1(~t%?blliT9ja7F^U{` zIX?p=4FqB4=R|B685s$Z1*Vfg0?+pbI<+ECquqE=R+g4Qbj^JA)J6NiqiSY!1Nc?g zI5RU7(fAG^LzNqYfq~~d`#}Z#Q>$%9vO<_0sBS0Y)7uz_N+`oT1@YE-+ z`_pIiUHZ+b^mp$_}Qh!^8 z-;JzR9q|8v;cKU4cqUruQ!Qy60DE9S3KX&2vb^L-;`V%U+Y O7cPw+G$ZO}ayJ z9nqVfx9*x-xvh`u7wTA!RFiro*PND~PC>&4CPbi^@1G83=&r3KJs`Z=A`(X~K<^B? zEWpN$f@-Tg4?bvL=lyB*QHx3H&Eal>ZB?97>h|iG^qs7>1W}egeLa$QAOG180f-sC zw-)7TK-Ha}z9cm@wYpk5j$X1JAsd~4A9SRMiHS+_RK5d^{h;kz;{xa=zxAL;QcGZh z{M~tA|MFfokif;rsyWRq;Fdfr|1PuzG*l~mK6%gg{cUAxu z{m{UEO=f}(7arf!)b!|yrmJhJ7W_82o8dp3Q`eaK@0MhxjA!Kd?yl3zF2E5z{rMRf zc<*hC1)MpC@79Q^F_zg&TWt1^-f?+OW-?qRegtU)r6Y$)0uhp+qUD+sof^BI~G zko;tz1U?x*vIpT0QUt9c+7i6-z(Xly#-Y6Jh~>b6fk9hbaxy3{;LE5p8%~x8#LB|L zt)JG^#Fv?)Yc5|6C=4*9dz^45i4hoY_U) zoOAd=K0)8JQq~&jA-+Elylcz_Vj?iogunO$FT(%2isWpY_$xv{mnvRQZ{@plkTQW= zG>$pm(}EtTQlIf`@P)G#PbVCK=KMRceEKN7B+mxf@QYy;)<|o?9!_;2YDhAoDZm{i z{dD>gvkthU1Rn|;z?~%csW@&UT?euU7q5aZu0Bp3kw_jrLAiIL-{r*?Xx+~ogD+5R(@c`DEU+$IAy`!U6x zV~7ENyx2p$<`LHEow^mWe?R|^UjN_2K3(g7uB`!L{%F1P;LAl|19+u7J#ZkK|5oYy zIJx^W5C5am|Gkm_NbMh^$M{b$Ge>RT7DNLR_zeoO0 zU+Legf$)!Ue{g0{r~3LoW5)mOZ%)6Xbp@B4$#gax{Qu(#bg3samcNeE)uj9Vz%5LW O#|ls6(f`k!5}E*^bNSZ* literal 0 HcmV?d00001 diff --git a/doc/api/libbabeltrace2/images/error-reporting-steps-1234.png b/doc/api/libbabeltrace2/images/error-reporting-steps-1234.png new file mode 100644 index 0000000000000000000000000000000000000000..fe6f7a8db2b1d1cf43df2583aa80bfd64cbbbedf GIT binary patch literal 13408 zcma)j2RzmP_y4{27TG(clw|Lfj7Ub-HLg99aa|c9D>JE3wvvP*uFZ9=OOl-t*LIbC zGqQL8_r3b`9sl2d@bK{9eP8Rm&g;CM=Xsv*SOdMAv{W2aAP|UFTT9R~A`fxvVW zM8JR8uC3eweo?};%)LP%YDWAIcwjQ*2n3R3)K*tD_8(h$O$#@6LM;e)jul&(en1)R zidV6?OpYl$SYRPGc~F(_=asuGU*nfLIbiNbt}*9Ee$Jm+qgD30EyVoNb6!U-wx>@_ z+p-;e+T1{|(?#JiE|eJx{1-?zR2gqHYEdjj23gK2cbv7Me_yBnW>tAI_+V?zMql;4 zccc9A+V1}L!>rxll6^*}ij6xkiimSG(V}Mc2YciyeD|dhj~KvE^+2>O8%@MHP$~$X z*aX@Yr$QW|dF!cx|GjmWObhSLn-0D{YYakyuJJ3`iqb?kp9#|eAt}%r>*Os!OE8io zEKZA_;^aEe!cG+54Z{++nHN768I}=r4gZvl#!fV{83YBfYLeg|10SS`20@9?8lY?8 zDrd+(*;1edK)_tCpLQDYr`KHaJ>t`rL}*e%Ltp`*2@uh$hs@+wv0R0b&$>+3p33x5 zo6M{Yh;@zxtGwAQF?}>IqjI#a#^JVi{58BrymZ>*WjTy*tswJ(sfVqCzj}vspuq6ij@39;k(4;?NgM3j7@mR6&e&NWHk!{k zLyOW`@NO$kKqmBXoblf3=dE+tllZ8b{8e>eyysh3Z}cmvd9VlEAhF2W`n`1%S?iq9TCMs z5Q;O@)MFvWP?p=@vTR3nvidz{%Xkc`lkPGJ>9Td3EK9xplEm#K(xB%?|MAE)>)T+5 z*e8AAvXBn?p8i?+o{thr!>BkS1djnv`{h}$J!=LV+r8wGkR;K%_RV3Hf)mcf4KNgh ziC}VDVSYTa8!!$TKwRX+c5cc{2UT!&)~cB0P2QhpAN}=7TRS}Uhf4;eQ1pGmB?tRk zdzV|p+ELF`z4wcu5yiZBLfoo-79kZU+lr3IP_hY^otL{>zrVSv1mEo$&$YY~pFwvg z;K7#5hS{{eH_NECZr)DZV>(m%H2s(?j8E?6LyH_ z-K^ciIQv6-Lj~_DKOadU?gH1(gWvAJ84v^w$lP#qa55Whl3}Gzbd`c?`-DImiTV&4zWMJW1asq$AtI3<9@R5 zg8*wA>aaM)d3p~Ihn?UnW1aDzKYuO_ud5r1UtKJoP<%bwQ%!hE0a}OOFzlh4Nbn-IB8>>(%5k8OKlceTaj9(6pL$T#sk( zzj0vs@pxhvYw^`>9P^Fy18+;ixu&6rE~zwXEq#cWC=JW6hs)0UayX8mfDHii+M8qtui zXY1l$;#XNQ(s)6=PIU0yRRf$ygGd-PRuk4+IajqK5P3Gbio6Si@QW}vswyaye0EQr zu5>%qB^(n14QQi6W>6N9VCR__Y@)bYx9rS}vialet}3N+L9@J&lswNbgJ8=bjHAyn zmE$DZOpDHG1t}ipR*_H@(K)QW#t8R7oS{$41O-+;p6a8I+urE5;p>rkUGdF!hWGX{ z!hR|n?l}U&kj2e7onxq5DSp6Qc}eQ%_?f@J!Lvz8m??TlNGx?>o~a)sGZDgIS?Z$O zpxZw-03t^0m}+vF%tLd|=sk0muv}5S0>W%%W(dXmyIPh#vX0Ke{ABZDAvHp0JF(60 zyWB0aj$OHlBhBQUOJk@@#~&x1lLQunrU`|KiFh*PSgE|v4S!N(zR?AQrri8TQB3x0 z-g&+kpe+tAJu2)0EqtggU%Z(eetybZ3k08IihfB`r%pWaSc4*Ppz@h$mutkRa#{fh zDl_@Y8jO&H_UkP$!q1P1SWvT+6_CSe+oN|)UB#|L!#*}7k2P?V;Us;-IDdT`wvTY( zM$ipLE|nBP*nVB@4Z}@DP-AnFHe-s(&;nT3^Q%ERLP5k0cUi4-ups1E1!M6YKl7aI znxpQ1_ha}>N1Nu*!Mo)7%XhRSuo+{FII{VggU{M@A3{pOi2dS>o<~xjbhx=d7z?_$ ziVVf-=Z>P00RwMu(xRV{g&s6Z^124Q&1!F21_PbXtUW&D+#(!USz?6r1G*>->=skb zsE9p&5i*~fI7e>9wSg++lFp|)RA)i*4Fm49VHX=3x- zI@&P*exYwdx^U$cjK%U9!qTAlr5XRaxd$S}X>q^g0j4FHNcUi~C!34700>|Z@^lSi zs02$-KzscP-sP<8>A+&F?l7*d%Sp8!4*j=VD9E9@7Bu2IX4Q2&{Zq0MsVQCsdJ4AO z`uX}9mQ)+po4?hono{2@$lI2#T$!rWUT>peI6Ntyl5j}-COR|Kr~RdfS-dTw`UNLQ zW*&QKv$^u*wTD_!Wy=s4UcB~r|A(a|W6Y!CQzL*7nVRR1m>8@$U`>xhKRkBmZvo5L zdvp7vP1eP|nan(=GZnU-8O83RhwfJDn4Pa5#N7HgR>wXSFI3mgUR)vAN;2{IeKiZS zV0%WF=pcs~`5SWu*m-NS$_iN!VwKT@g%rf}v(cR1+V%}4nk{27J0)hfq#NLX~jm+Me2MG-S1vx1G zg*fo@Zn4GB)G$Kl8OPGOXGe)|I9qHh|6&w8rfGHoz6nE5V9)>0O9$-mpDWL?H7V^E ze904J$*&zC0L3@ev|2E$z_4vj7(^Vo5mLAxK zzYvY^=sz&psWJZpqTRA1wOm&ZY-b9!C8p7&PU+eq>|!EM_#2Bc`c&zaj*sK@*l)j4 zZIMTU`kf^pCN z_IY?&U@&9&ckK<2$^=?RiAig}Ey_?P_rSDWhLdd4Q;!-TMm>RjMPy7>&uQL84JGtA zItcx6ex*XiYwf$bpI4u`PA&}iBCsKeJRfe$%1cGNZ~MafhB?aPR)xra5r=-en(4KZ zxCV7~oA-!PaXGc$4XQ`@^49gJcbwaQm`;s);$n8$Y~mE#lH9SQIt~Q_^~`;SI1*^b#0p!a*euW zhbN#1?RNZb^Yx`+-Fx3WYc<|Wd?Le}XPETVK15kO89TGO>(d$OFc8Fk@!N?@m=JmT z&(?sB>)UK~2Ac<2Fr zcoH?&z}qCDtgI|8Jv=@AHIpv1FZ_?+o@>v@_`LJ6s*@{c4K2OE1C@KskiGuZ@Y^-t)WC<)LB*OVSYeH#v%!LAOv-3?VrHBE}* z0kE$8R?#Ou3EU0(b#fv&!=I4-nh1I>_npeY1ChxlL6xq#uk&?vGn>G{&Tx__@@^eQ zWF`0J1$q~@XA<24$>^-4X3mq~T_*2}Qc&R6HxD*RU{1mL~Qbk5Q{a3_TVT`N-BVrGV zr|b4QnhgZig-ZK+S0!^n@nI<4vY}-~)v#%w^gQo+OY=n3$N{xs!NEmD|#CXxfJIi5o4fn%lW)Pn!N#Sv ziKY3fmPQGDE}Y)sW}lElI{BZuyf1RPOcuW#M{kk?F<6WZ*qhiQ@B}ckmGPQOJ7Ou^ zq~7Nso`at-R7QB+IlR8B3cX5~Ems@D%pI)_44c}zw-m;U@DJiy*s0jFUwW2p& zF@bkZ`!&OD9IQC1f1UgYjI|fV=jQBW6H`-D$Uu*G+I0Le;WiDo=<|7u_loMiJ8}NV zadExeA)~>~?a8tzTHbm^e%9bU2FhE^7D(lRfr?~$k+Xx5_-p8*#njc{Un<>IZEKif zz4@@JI-7(D5Yp=d3MD`DeEhLhEz^8p8qd}giZ5f`{0q5A3sS6!@ztm(#sa1wEiEl8 zn>K4VPPk6eE+R0;XwR4aV+2uqJA34p8~n9xbjYZZUo&Tsyv;JK7c63e-pE8mY@ zHXTqsxX`9`bZ6bR_NXBpe^a?1nN0mb`O)}(d{h65O7Q)riczgTf z?H!aT0yLp+w|ahh$;0#Qxkg1f>a?mKrVtM{HnuPo!-Hi(?^fU<25dqJLcojp3KUJB zm>^6dO`Mr6n3t2kFcKj*Wb4TxSu)qJa;AL&t)>!XU-n?4qNYx_XnwhMCM4$Au;*qc z(l@?4!VBM{0(y#v zmEk3{@F*8w8%s|Zf*6tgKE}7E-xvy|>B<*W@_BR6CkoU5q}|E5EZsZ!WW3vN;yyV$ zfm@kK6QJq`K?H}%kn^(AXy%-um3YMs^rPelMiB}Es$aK)c8iOONbVXX@kDxko$cw* z>RL5Qt{pzHc6F29BzY5Rx4*Zy*WRwxhM(ps22>)Ma8W`A3aVNP&yvE8ECV^q*ivIZ z8K&{b_hOX9_1SAS-|WmWO=jd+3hS_OaPR{FXq_AYh%iwgKZy9a8F%k;_^_zif(ZqB zUEC8Sqx6}Q=}NA!(pGhi;E!8ALF+kH9#pQ(8R^uwORXXBb!~H^qr}qVG)9sLfqUmt z9)aM;HW42$EHlD=Ge{`~tR&L9EqaB1bqdRn+WM!0~%cF{1LbT22RZ~XJ; z(KpTwsF_ZyuEO@9(}U6BYy0mbIna6PV8C%s$f3o}PH$r#m$&-% z$G;a`CJmRZ3V#L*mdd3$(R$*gZ?c@k*Q4SPtBi-NVK^$d!tY-)kJznKu440>4pQ_c zw%(IVXdsTpeUCss)S-@1^1tu#b{RO}skjN~^Hy+8dAWGSwkEK~Y!CSXwJ!m0uYZoB zZo2k#_`cJf*XijJ=PVbch4wyqettac^r4v=4`@NWVK`F_4UP03I{^WKY>&VJHP44} z?0&<>KJmpDWa>beJ`aznSMF~uK{8@5(Ll0*2h(AkZwwnmOLWToJ;w$j3~ayDshB`z z58EG<*Ia-=yg!&LduP9O_3@FkY&+M?OF0!1<|PIoHhgm2ATF-JMxE)TsI+AqYp{02vn?Hpl>g5u>^Noqy+o4d!10k6?sz#277hIGTFAu08zzA{Jb^~UqzPHGm z3`;~vtlF%?GDk?P%OOrqPTJa(-j^MFXdCl6j1Ya5n>_MuSo$|z-MFhy$Ab$QZBBEj zRm>Cfkc3&9sN?=Qp1wc?mu&DKRlI1yvr3aewjN$XfDLuB1RmsT@%vT`@oO zubQ?gRnOFsX7Z5XJpo9QKodR{`CRE<&ZAxtB?b9qSkt-agW?)leSQ|i&Zj)xha1b% zB7Nsw+T%BJkDhP_v2|Peo>cpHI@ButByimAzGz=iPZHh!i}N=X?s<8Mh2cJKiPj?4 zB%B5HapNjp6%ZZmlO-vPWv#TLBk}0dEl{YxphQ*pQD%ie?J3)BITIA40rz%sX;*XW z?0>c3G13^U5Qh5%_|4C1q22Et@7`m2hlT%Nxy};!Wc@bx!ZS#w-xP7EEdkEMT<_j_ zY|fN88c!ScaI`Gkuy!VhRebt_E>Fduu4VVHX7(sY@eKY-zk~<%UTR6wzB(hQzvgNE1qYs&0KRU>p z@pRSF1j+*`$R}(&%=X* z160WG7wJMZwf>WN)$;)K(0jIK9{ifKvMTy#&f&b4K4(~_bQJ1Z+Wn}u-@DWI9fN@Y zg~zzX@J)@uj|K2KS(qL<)>$L)jF0T^mhu9NaVH5^)06a_$u>fw^)PV79iRbptZKu9 zgmCg9pwpZmOg>Rqctxhw+}e6IR%A{V1WOo*$o`ZUda{yU&v|>YxT`braTS$Cd?xkg z6*Moq!OEAm4}o9t#RhHdhR!6DCwaMT&XXX8Sn)>&?>goZ*bW1U)VVVSnL(^*-9#WcUVduZ z-@d(3BJ=dy@vpcOz1U{`=|z9nkV;|S)lzf`7#!-jo~0H)m!&q?TSq*a48)xqUrZLl6M!AS2BT~qf zN+t@Pau%P3(B-)8zu*xyldrpvt7&bZkplPuAUf;palnOygeJd^LrhGP!?>;JoOI@y zKrphr$F{>)yeVcZ?gH~z><212S812m);vQUKAJ0_=2GLy-`Rst1IiDC)QQ6lz!=D2vJe-NT{C}epX(97GAhH})qPH1%cF=Pu;0fnqHL37Xb1He3gVzg(RR-Xf@1Jl&;qwxm|- z6?CY*@iz?M;fZ=sC+LDU^K8wp0pZO{Bmh%rdXeV!*qW#+TST{L8t*p@h83X0Qx-Et zcj5vrU+MNxfsR#P(pOQwID0cdyd!-B&va3Oc5zd~$SY1&JT*BvIbttn_eq|!c>0Qj z;m&?m&`pa}?2xo$>;9VdaKBs3D9y6MJ-X({S0KyLFR7jCteQE;d7-|L_mm^MsLauA zDHaeOvvjU!Z4yYR6s~Ta0kXD-=%FZ{*)Zc$(qxtL4+&ySRNE&@52ox_Kfk=GU-DYX z7oCUcltInYR@@GVC&2z=zT38VYDH(AMw6lV>$o5&m4XR-rn^sV62sF2%^5~H%Z+WP|L@7w__7$4iAp`lWD;Dk^4CkMS^!@Ba9 z)ILBJsM3hexA2-5K6>;>hquAw3Cjf%@5!Vy?b1dL?WQ)YYd6*W`hzDiSN_CP5`?gb zh`uE~;#J&1q-`#_zM=naLFdV4)q;%~?DNEhn@KML!tARU#v)T;W?#5QcDFQeV_Tmt zy!nhU8?eYWnW!5;I%jU4o~h~#;2jSS4*;0~b(>!AkPhkcyiAy_T*)gd#H0IBMSAqs zlaVVpoKd%w#EW6X>$9Hh{7dJwG^UiVhW}h!TT}3!IB>cR9W#8vYn_F&1IKp-FoU4@ z&_s)DXlQ83{xy8g*x0yrPGeMgYMHe5%7V5Z82VcRw(-e@#Jgn6r?Sc1_VdJW&6`{O zxw*g|WTFM%7zkdlX_LQtZ3so`=KHLdV!q?dZ8@ee0$q#tT`tEjzo=hd3d_;KJntL> ztA0=JdFcjYH}@ipwY%#1+Px4l5uMbua22AGL%s(|EU#tl*%>z>N_XB!sSOL@;x6bMcy$?^XtwT4R~~Sy%AH z&*X);M5^mh$ zA^>I~RWnIgN$wrA_Tla>*GPchBrSv)?eS{*WLXX1{S0!>jEpxki&)}VdSPh~0q%3! zZxJ|Th$`8)KMMBcNRi+)3Q_=IQig&NkS-ZyNt|x^l+29YL~NOl?ipQASRfu<41DOLk0kZRs}J1CTJ!4Sb;zUtw7GzveP z1;)G_<>W&7T4ptVlD0`Mab^2pyO|4{=}Z<%)i)lI_u)Lg^HwL;arG)=f8`~Sc}Y7C zF&!qKj8at3@5}Q){ZC}fj#DhV$t&!>@LQ@ftZ)Jcl@SK6sj0z?e+}x^gL>9^noM2u zyeKPVVEKD7i1TOGcy%eRc!fRE3WQPH-rbFPu$VO|DpMhp14h;oBUfT{Ca-Q`$>2R> zf*g0HyO|~3FL$IGjWky8Puq^gy2Zr~M7;>wXZ~j-%y_S{j1)1CsrrTb#}-g28lt*t zj_BLX*NR;O<$ZiRqgwNS09Q_JYK+eI@YOf{#{Lf{+X5IMdJNZ##_O-M{i>=T&$4Oq zK`u$yu-|Spq^j?{q=zWIr*GZU=^5D+30&|ZNwAc)yb&_|enY}=L+j$Z#7zUCn);Gs zL*E|GR;`CyMOi(HU%~FTXr=e zKY}_~E@wEho@lAXtcHEqE<&sNFWunKYyctUFtG~S{&yj|`ZRE-FR|LT!@bYfqgFbZ zHLPcDs7_7APcQjbWba&xbK^OL`G1<@+K%sqF!{0n;<3452EC#D;C>=x=!?jk%QgyM zzI>UBYX5Tf6JDA!Lj~{Z>N1MV>_-_J^#^}^fq9XrpLE%QqGYr<{Z(N1r(0yVE)1H= zz4u1CLuv2hYA{(*zTyA_{}+sk^FN(6pXaJjT37&C~eQGneRU@fHZ z^_vH0;~hF5Kymr2Fe*nyNprcAdu?o|iAWF#pO-qA)$6S}2>?TlHR*wjge zd6DAdKr9HRt*u=cJBYep0&&}v*Rt+UHP0!F(|!A6P4kDD4!3VDkbjYldYOH~D!t#BJini9& z(So%4ht89mxO>lpk25~5jXNNBYNulmOe|0;nYwd*`qO+ zv#VOwZb2ahh}9n_2(Ris5Bql>G(Vhkon&&ye>p!Y*4urGGjBWk%IiTMY9~@^F0E!@ zZJljaW;^%^V0sf#{6ZjBfLBtdK?58fjbj~O39gIpmVeD|yIYlp5dM@^rjHlnyxX8J zrrsn|E~SfHR?7Y8i;^BFwo*{2$4JEOsh!k+M+~YQ0Qwtu;mHZiXs4CMUc?;|0^34{ zyoWQ?ttkIMBLiNUtlMqaoys&T`mmOh`T2=n$?M`8sj7Dv`t^lurXK${s_6{(W-6X8 zWmm2fk^NqeL1bNl2+lLGc3>{W6dKIVYm>MInX2wObt8%C7+P& z4$D;C50D1mOunQ+JW%ivQ503 zXZAYD!QT402erT}i1kpi@g+^kM&!v)OBLo6Zc5*AQ~e>0_gkG+agaul4jDn5c;TP= z0+26Xz^0_8lC#0*hQLU#J8SK&lXI}<3?RgdO*SyXOw(D16Z@Jy7y%}4Rk2!Ssyqfb z9A~v^oSh|6CY8R#$omPgSy-h2^CZUGV72MkC$XN~b~bV(O8BxP^YzMC*M+ExD1iI@ zD9tkkY(9A>-a%@F_hdZ=AT^!LV+t}{Q+hr;bj!bcI`13$loEOW%;(i29hw93fa9ev^bIGQu{Xk}S!)yzRovDNYaqu;p|ZmByhq(A z&PaQKBzv_l)5-6i)mqYxJ!_u**p*J}ee>X2Cx$=eP81+c0OqAkG=bLVr@#h=NGQDu z{?gV~IgP=Vs2k0!tUe6&up7P-#{!gN>2hxB{I)5moAD-Iy+||Y22`VSk-Xm4;TaEq z>;4$Fl-J>13;4aTQgWpBW0+KGSFZ+U5R7U1@NjWjMrr>|-PB3bOmJC&L|T1!R`kn0 zVW1Sm4}d>bEKr9b0Y;8A*+7&FitMIn-+V^%(UQGlGfl&ahKTGMRX)g9vJW9WK)pto%(A3P&{z};jLw<`=#VXnBux=&^ ze4zucMu;sUnXoOfW7*s84wu(OZQh^<>dV)*_{h5lI>wDMc%n0vaY`E&hac%RUP(f- zzRfAVFmFgt-A#}+N9p_&!sY2o& zn|1TuQILD&rK25kIAi!4!3LnoQzA8p3dzjOEVm(+0-*v-N0NJS-p@+B*rV%NY=1FO zS=BE(GQUlUUkMnoYH+@fN26X1cXZT6xB5dv_eUc7k01%?LX zfna{x@6(j(Tm$XHgcO!r?&ZcrngBVig@wGNq@=jGc%MNY?t$!8=%x0LA0=^&J(R4{ ze5WOAEh@OT9aR)aKljYfE%>k5{sIAdAfXqT?7W65Im}$jjY%V;j=F&g`2yfqt!WLb zVl~Xt@FZJ znbZ;wAT=O@S5)GaA3!kuPptBdy}5E#dR*u% zP^~`I7A498;v#@R#}~N)`bXLR?R&~mzK;vH!vHZfP{w#WD^=E~W@l%IT{5*kPpw3v z2BavNJF`m`jd;q*Fhm1TZ4=boeNqQD4t>nuc13V3f!Ve6JfXIXG$~e6$Ps$9h8zk0 z#04bqoa&!W1xY{{4CN!pxB-$t{jcKs90^|21xT~;5^=U00PNwsiBn?+^iOsXcjg~A z4|s}B$)s|Gh(?IE+_;5ym3)_vDh2K{K8h09N>? zwH6>i00>CJVdnow2!;=bf7E4wB>+J~BF{ep@-z5~5MHn@NKM;zi=XiHRBDD70h}RB z2Y5=5vje57f77V{Yc7Be4OrYQd8OHh!Wr(TMO7dQ{23Dvso{B5U{tRNdZ5IOFOdEn zm0<8cA0>Q@FvKV^(zrB{r@YIy_99?bLihN2?hyn20W=}O8s>xn8$gi5oto_5<_IXg z@PaKofe1V^e8uyjSwP7#K}FE96>u(Lwhj)$Ai#Fu3s!0rzzN3d=l^cfA8|b}eSC55 zRD}=B9*h(mTzYgv6JR_Zm16+y+NrGsl<>Ylf*lCQbK?BBn9lsw;uCuKN01Tsb@qRD;LqtiAN&ZrTFQ%G%2UT@1ncY(9}<+0 z|LI`(69yO#9|rzx{XcI=0Ap@E2+Zz%`d3X!a2mYa;U5P=HpdWx3@{9^ZGW8Wzx{^L zN{hZgj7?(20f^x=n&p}VB_?1nfQH4pED=GnNr**wGyaux68!f+@t5H6mK6u9`yfk_dl k|F78aueVz?8V7!p&t{zIW6X`u0|8&!8hYx88@A#93+0BIcmMzZ literal 0 HcmV?d00001 diff --git a/doc/api/libbabeltrace2/images/error-reporting-steps-89.png b/doc/api/libbabeltrace2/images/error-reporting-steps-89.png new file mode 100644 index 0000000000000000000000000000000000000000..5a95c87cc6f45955c002c7365d394e0f4b93530f GIT binary patch literal 24022 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

    cAS+X;VGVx|w^gmlk^mqeNBc*te0nb&ef3A{Z?h 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 U?z08|FF>Pr#ZbHC^38|;1?0yrz5oCK literal 0 HcmV?d00001 diff --git a/doc/api/libbabeltrace2/images/fc-ba.png b/doc/api/libbabeltrace2/images/fc-ba.png new file mode 100644 index 0000000000000000000000000000000000000000..9d3af46c8ec09e93b82ca04005e861a5f02f6bd7 GIT binary patch literal 1784 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 Tz==4+UxJ~(IqAzkcJ|^QH9Bm= literal 0 HcmV?d00001 diff --git a/doc/api/libbabeltrace2/images/fc-enum.png b/doc/api/libbabeltrace2/images/fc-enum.png new file mode 100644 index 0000000000000000000000000000000000000000..56c74af2896f7d9426826cee8b6b590a9e3b9343 GIT binary patch literal 9292 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 Y&bt)5az4XV_^S&-TU}qR6leSJU(j-oHUIzs literal 0 HcmV?d00001 diff --git a/doc/api/libbabeltrace2/images/fc-opt.png b/doc/api/libbabeltrace2/images/fc-opt.png new file mode 100644 index 0000000000000000000000000000000000000000..60b3fcf5a3eba8ffa37b52170a1b1d2c8a044d36 GIT binary patch literal 12642 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 E04r)gq5uE@ literal 0 HcmV?d00001 diff --git a/doc/api/libbabeltrace2/images/fc-real.png b/doc/api/libbabeltrace2/images/fc-real.png new file mode 100644 index 0000000000000000000000000000000000000000..21d7240ebbc471f9a6dfc7b308e819173f0ec4a1 GIT binary patch literal 4638 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 literal 0 HcmV?d00001 diff --git a/doc/api/libbabeltrace2/images/fc-struct.png b/doc/api/libbabeltrace2/images/fc-struct.png new file mode 100644 index 0000000000000000000000000000000000000000..467e5700645e6686e54728a2c9df07ff59a89ea0 GIT binary patch literal 1773 zcmbtVX;hO37ELRTno2W(SXm5eP&}C!fe#WkWmpU#TWcvy46@Y27XnG9kq`v}w4*q2 zVj@_P1XK=1HVGg`WNRobODKFHLI9f(q=EzjgvAL+gy5v-^jGI+&pr3vKkv_b@7(up zd>RpC4!4EFU@-HL;J|YxFEH`x?hj3BH%?qN*`BY0iD@v{N0z_wgW-vsEg0-Cr6GZS zQCCztwS;@&%mL}D5rLteBR+J_Cj<_kIl|%j!}ky|*AC(Q1D{& zT2c!o;~ZpFHA*(^*x?UTDmn zy)VPCSWxtKGH|$ghmdgH<{J}0GqC#_wErz+F@b4X)@&h9(1vFj}ptsQOprLK3L zeJXPWb!}rI*Ws5(rGmAK?UJpkPJ5M9v}-)?)&n@8yEwL{(=7X%2?Bzg7xa}CL0~0H zke+?d)8{99Q~kHfPiwE+fP%z7DJA{XPCHQ0nAnRuF8-SnB7SRw0(m{1*wBsS#^*4# zi`}y5j?AO<5tRNA)JDH+4Eb95TDDI$^y|vo`D@=ogAOn2R#t1PZoS*6`(c0fin;`$ z>N+}?Il08pyg}(}vD{&7cB6xsS6oxL97`JNaIAm7RVTxg83!gM71JFIN@7tI`x``? zS;m!-XEOxrVeXzMc(A~6RL?q_R(^7f@3BMfXv@MLrm7%jY+fxn0hb84U+xLBaoyy* zI!PE1QwTgBK`Fk(r2{-*rdL$$A{!nJC+-FnuAhU7>}ZFJxA?N% zPqS@WfMWZ(SvtN%E)%I}XgXgZ^0Q8mwk21Fu?9E!CvVj|6d z4nsi+0ew7rw`*uMQS6BFPx@?!ch_9ZjdypJ`*YG?eQZ4^w(wf`3>g`jd!lrv^48+z zH9dK{#ITWvnEiJ`WnfwNftq;Q>oJNwnJ#6+MFdF%ifRXwi{R Bc{Bh3 literal 0 HcmV?d00001 diff --git a/doc/api/libbabeltrace2/images/fc-to-field.png b/doc/api/libbabeltrace2/images/fc-to-field.png new file mode 100644 index 0000000000000000000000000000000000000000..47d454009641a673bbeef7c98ab1c28c1b2f9e20 GIT binary patch literal 58514 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 z z;m~?i7X#GpX67kqbM=Rr5qJtw<)S)RQVsKp17GCrwM!5gBBr?#19KVhiMqTJg&f6R zo;3JwTaJ8;PCoU$7`haO(^YW{WKFP%%Hy9VJjQ^yWPyxYc`Ri!1w%6AI)As1Op-o7UCi6Ga|c6xPfvS{;ID@Nw#$bLuKyVyl2zH&`l29hqa|z-mhw#985pZ?PF+OHU7r*k0bbfx_y-+{pWds>x_;B%0u z+=$V3_S5eNDu`^&J^Mp&TCEwsdXD`~^XVSuSqx}eb;71I4ks}F+FlVGkYh&d-`kuZ z>GpQ};LIjq&cK_J*q3CgXgrM-J(=@I^0Kg6ikKa*q#VU8!-uGx&q9uJo*8}T%{ci$ z4_y(r9wnPsf~#Sv(8gFXu90F3Lk0)*Ir0jYiGctJ&Q)+qs6-^-x^raT5{Egr;@yZSo;#bUfDESh@zy~ zBaE`t$&Z?e&o^1?4M%&D$;-71PvP|1$s**3=R4R-&ZA#FpBRd}K!%03-|5;zGbj|R z#Qm1pLkt}m_4kzV(+P!6E~W)FpmzQ;upj7gl@2tu?;P$4J1;Zwj^r=HrFX<^33VCJ9I1Gv4*j1XW;!*QdwU*68pI(wB}a}W}Jdm%1?wmyB$#;$R7Kp?`6U? zkI@Vitg6C2q#6Z}Xz!vGPrvymrPEtSDP4+)(uR?jvo6Ctm3+ASq7cQA40sE2N^xO7 z?t?MN=>vWUn2#f*m9d4#gF8?QmnB|GiVUbJi2%)vI$7tQ^uiezuG6$XAyXlpO5K-c zWsF?4E@w5CrM>yS@uiKPr&Oftotl0fS$Rcrz)79fC!ZngR;ZW3aJ$aN*A(@#zyu#M zn3S%fm|Ao0>3xtn2aTFe37RF0C;`Grib>Pr`tTS-ylXCC zc0ne`Jey2{w$ye)sdXHA993OF!G>Wts*3fo-`7YzE4Vs8ryYYWk*ArRl+CH&x7gnaY`5Uge-j1wV z>)mtS(H@nwP%Czm8B-1?^wg5qO81NW5LIcGw0G^Yh){X;z$2>EwWQXz$hzE2SzUmqn4fyU9NSq_i|NxP!3j) zuu>I&EEmz>Po#g_Z#KwdsTt4qgj$0eIDF?NQ7=)bSBySVRU?*ZIShpr?MdQQ)&)W4h2 z15V8%)YyY*d{C^hbSE$@iF}y82>tndP@fB}dZ?FMclb5}uZ- zt&ZX}&(g{HaUPn+$aNl7AWLDH#@K+z%x#6srdYKO-Kfz1&AlhYSDG%`n*d`NW*R9o zkFzU)L0(0Kw>i+5oC6v84uud(xTEe5#%qSDt#|I$SN11%9{I?rlv^~BTjvB+vXqtz zL0%Bgf%oPvFm|hQIZLF|DnO9;y&2R9dZm|2j3%9X(q>@qxBobV;(Hh}N!mf%=vW~ZSP?~A?W+IqZ2o!rD_dF z4!ahD?T!4F$)F)qy6Z$!R{o&BS-+|i`vF2S!qRjE^3Ok;`VN++6oQxNuP_TyHtei_ z-8Dlh^rFH)oxWFo%qQKB0r<&^vy(`X%V}?TMX7SK%||y#^BKgLQ>iDsJiW!T3Pyxm zg}s$+CxtT8t2T>@+f521{a@YdYA1+e#bPvS33~qgB+R8-)3HwWDjg@i4x5j?mrG2Q>E;YcBLw;ULSC)&~7&PX_*q`=yoY9yF zW6Yv=6do}DqW9@X5NS#|f6zx$dVqCiac9NWPo`5HGmQMeVwM=Qh8OZCI^|OrU}ZySF#n0mnvBSE?`18l8#l-F+?Pr!+>(Mv3$WO9p9Zs{FTm$h%Jo zTnifEjclm7wprQs=lPHK4b>UUTmWMd(j@wgj!)oAwe4IMHx{fM$!;BlTVku5+YKO$u z4Gu5#T0WY?RJ1o(sZdJzS0ZvdD|q#(@X@=cCNIRiT?4QKi56gw!p?MeF|{(50j@w3Xg)%e143U)b}!edZ_c#V+-zm9Q1yxe*Kh_x?pOa+GL}VwfJGE!ut;n@1`>B z%dBk0JjK87Ygq5P4E!zaJ%=CoFr=isG3~VnX8}2fQKj9b*-u+3xTvUpP1-r(SLgph ze%`rmjDqHk>&sG*^7P>$k@lx~6seGCW@6ArmUUg>iEV3=Z9*k|NjnvlM1Y?)57p1? zfhHowrA1rJ&tq`Ve+<)#;#p@CeA=ztTV_Qzq}3j(MdWvQ$K{%$Uhc=*Fmv6=U=X1^-nEens`Eqnwxz&|NH5tC>0 z<-x|6kh^_;RThIvv|8sQ?S(Sw)o!!DpX#dYaA!Txum2 z*erG=M@2TfTo3>j;hx1BD6&0ee38>~ke64tf51Arn17zjN5xIj?ln7q#|k(Lr#@&x zvZZ^d)!nMweoF>|43%3viD;N&cWTT6DTtjWCc4skTsj}`YMV%_{95yjz5RVDW>U;5 z72kWi$imF3hYhN8GmXl7cT=anVJNixl4o08EK$b(vIP&x*zUN3U==pmkUrU^4dw5K zeljRPlkjUP!8A*L8iGOxy6KY(RK$iqs2e9c*@O_{inyTLY&9FSABr-6Chgz#yzPRZ1xN9%L9Yq{G@vQsc)N0bh4&8Q64y) zEl1Z&k<$>~_V3F}BNJZ3rPV7;-&0N>&9hl!(OuP$YI8$+&Q&Hb=i>jkUKfg7F=G+< zRD$#kt+b`QPCiJQB_20;tYb4QO#vD@bAOIvCQZ#^D7mt#-OY*~pe_uc8t@DM0cVWu4Rm zS!2g8#IdtGoCw>XkzFi-WC;=>uQM6F&tufZ?2S?3q3iYNz9whUkD1cR1`|A zBXYhq!ze{%hD9AadJf&Qz00^%><*o8%BhsHcy4S=B#RvBaC5oOXyB2+$n%InWDheo zO=&%hVJKsi;80ReeTm~Oi(@^rQTpD>Pa~kwVWwpCgH&jZ>GjW zx?Bu>mt*In1G}V!+-5X}W`su4Y^Zc((a+Ipg|s_|@r29znKbCaZRRdWGoy)>zWy|+ z-G}Jvh^6ir%>vjlWPKkk^N!#ceS(R{cc;LSdeq4^Q}b?Lb;V!M(i{})~+Ob6^*l2CbIMnxC z!`#B0)o&ir%&^foJ=}{ckc+K^ZW#?^Tak92^w6#EFW*OzhW!dbX z(r~d))@B?bP%kft!2Sr|u-=lKl07M4L~^e5`cTed7XzNm^AlXV(awG*Nzq-;9+qRs zP8Ca-HTU0nX7$Jz^|Khics(z>I_kx$QT@m1im8Y^ z(mp#iRS#Mj&*%DzsaU-)s>KR_GQaAuHpqUWz+yuFwq#YoiC?X(6kmLjajl&4D5l2# zK(Wgvob(1y11-1mP$9;A*`!<>3qeHAs*&)8?qwiQWX5?)UmGv0U^P{rV>3Wf3e%4s zi~p6Bf);L%*)?KGs8=L0rG$|JQ+t|U&g(S4n$7YvXn|~J(N>IH3*l55N|?MvzBrb? z{0}S~Gp$ABUWGFuG4dr}?@et#511Ab=wg|%5Ydz1anrxUC+lRfcOcAZ%j$%(%ZGgk zRH8pm#^7fntS`S7O?md7p=GDitaSNvp}F|)`w9zxf({OW3Uex@e*5P8ML@IPQLAT^ zbb6Tz%&VLUgk5NccXAS*5=r}2wHa1SxwUUBskn0clly~DMaE5n8reeZC!L<&Jw*^a zr-PDylAvM)SB4$qg@ZAWmSIhcVZlF9jG0jVk??;7q6J<0tUfqOSGP-t*z*uiAfw8R z=6sly>ddNyT4IJ@s*Gs%!&6yVCABZ;HvX#wMl{FnC=m>s_ zzh!JBLN>M}Hl&FlX2#pAmj*m=3~5 zB4lGrL6heMmhY@Bydn^B=wSx20HT(sJ|7ztjPOfCBVy#IvaK+oJf4NQ?UiM;sI_Ty zw3r@qq{g+qY>h*;8jaX95oM{5ZI`(O zh)bD8q%DHs%9Lrkg93;UzFJN0a0AE>0e`rqx;)(%id6g3)WE6L3e9RYTL(>m=}@hP zjg3Ue#^$!AL-j$FmC+?kY6ndV>Rrk~Z>(vIw8#RNuISCNmZ7fp=3c>>gqR*n|AcI2 zg=&-h1~TFevtK&jz>xgclz!PNY-}V#HnzmmVG7rP3f7cqu$LY*D^$}7#g=Z^2ZJBN z=G5DZT$b|{sx#rM8;<`p3xxc~#zrD!%ZV1KWiwEl`ie9uE(5a}+|4E?!kUOY55(s& zy@M@zkYus;S+GxQ*7Rmbox*{Czy?`XgMDfLV`C!`vawm)nNzxid;r2~2lGPGBym`+ ziJi|B2kH(E<|UYQ2Vt0@Pm?Vo7@2{U7Ut7{NF*{3=9p(#w456MV93<`4d7KIAf~PN)+|!3MF*7^k?Cnx z9Moblj9g5&hAMrQs?-|BXVRWonEHz!Yg-n$M4jPpAZK|Gjel%xBtkZ}6ak`OR>qZ; zIrb5ZNp1FGF{qVeu5Mz2qovRw!x>}w{)8`!W7fFQ(l)?%OI2!N{ocV;=&Za&17Q+| z+n4ai#zrD!V@r3svXmaw*uIQ5x#{XACOBFO4ccq+nQ~b*Fe9*19kR}4s6!Sqbf{ct zmc=n^7Uqbf)2vxzO<@V(@1l&$Utwb-5wfwd4Ya}1gHOR%YiGo4eb}1>Df<7ncgIKx z1VI>uPv@1$EU!gkD1k92uuKd+fwJ^&J3F(iB?xY<->VKufUV-Er~A$8^R|jg{o!>} zt+~3aJm9`+wbJQ{7&mrMw;Jk6k)a{BkD)DE_CezVKYY1kXU&s^UqB)R{#Qm!J#}=> zOz)i{54f*dKIh9RZH3V&EtleRx-pWU2Of|J0d$ml>c@wXcQ9k3_7WEM-{yVBRu~Px z++u!n+6zd80M7im9b#f!%NDD_{XJmE5fhJy+)`h2ahFt&O zuNr%1_y9%y#8P zb5%1>$O9k|0$2mleVkEMx0$l6@@V@{s)}w^O(w!_t!Fq*T_iRmeJH86w-X5T7NhDb7uwUC`mcCtj)QL^u3 z-^sr7+@tUF{Fc{w&Uw!3b^bYj4EN_=uj{(6_5JyT+`p%Mfr62Oh=}Nds)~XZ5fQNm z5z!gsxig@Lu0W^{{3CZ#F>oa!I)8=mBkmmWKO`dJu~Ai!)A1Z!PW&Fq(uaL{boD{x zYkh-FHrBSMkg&qf4D!vK7fcxU%!f}Ql)LBX#LIPD$Dlh*h$ z9m%Yzm+Vu|xmbP5`tJwHhR5c}-ZM30a^Fi+PwJWR*4O2Nk|5Jd-61*GjT&hw@QMvG zrVsH73cs|Lub38x#n8i8ig97bJ)>;lzk@3U{Hpp3ct}G$A`a7vGjx_RZkpBu^1VY* z=qveJ89GSL(!!fPu|;IC?oo-}*mar5%ndZSxKzr=Mohsr#VI%YHdR?J6nBSAY*<2S z;qnHJblh*z&Lv?vDw=xsu&!=o6ii#^xgDP}Je*J2o9~DEdTY{x1H^-)xCmhZR-8wp zQl6!jY?aP!=Fy_p zrD3-Qpo&+chR5B~LM%6!J*K`omMhI5l_W#%zOlC`zuMY@8ddhlew;YpAH~9zd{B_m zgid-?3vaVpkl=N!{+20K3rD6eQU>nL2np2_0hO{S;rMS9@GJa})`DS@|I|*x#dpP{ zM*Y@hI(MmoKK_{^(if|utxBT?^qHWjZH&Ly66>p6xi({RiJ&BbPGyyD%Wc8OZ)u;R z-UqC(7)M(sY{pR%LrJ7vt!8zQN}pOT)xv*rd3-XaXt-rdK5zy}>TR_;98w22yi-Di zc_w28;Zhd5_u#xaWbUd#Fam5!um^L{SQ`yBZC_M9vuE3M-(LLA`K`M1F!maUY#~)Gkxe3uff-(*XZ}aPu`=btcdehT zm{(sW=`pYF#J&ptQqTf7b%-H0$8HseE&X(WGze%ehGgHT$M2f;Wfuu9m=UD)4u=qB zowvbeN+_Pa06Z496TZLbjt$3jv?}&b=&|a4F9S3cAYP-seZP9**BvVZcz|I#?DZp| z>HV#F;$V}15gHK?GvTVo=O<1@PEfo5ne6{u`@dh|f4>@N!v9eL{$=(5UIDPS8{67c zZ#ds^WBxW1tOTCN-ciRdapLESLV$*cb->p{)oh`fQYklht0qekTT?hnbF5Ga zKC?0HGb8TliCg5T-~3{E(iPg2tBHP%oG!YGClcue@q?wEH5p=8w~XjsRAHjhx*Fi7 z`Sk?1m|B8x(88Uwi@yn_@%ffB{f5hEraA8cR`6ZK&<#wBYGtQOUh>f^!r|TU@(cZ% zN)G8EQ|A=fD3DzgHm69iLPq(T5-{eeN*We=c|cK zpVVtALg=hy3K3(lPf^CdOo&_7UZKW+HeT1D$3Gcf*u|{LZP*e_o4pwE?X05kOZtk- zQ#o8U-5qe2Qr_ce%XfA;vM}j^n}eSf2$z7tUN2A0n4{JE8jjHy8}JNr2is)t>f<5; zv$F3SLMMgWzt@K{&!5h{PGI!Zy?ljpoJMo<(;GUq>C-`uQ|C!I|KGhS23zz$aHQiJ zW_oN_iSV`8e0^ts@AsM+OBOn>{^Bhs27ZS8K^ntHCdrKE3&4E}qs?*|G9*{4 zB<{If{s_A$AeBZzLvX135w5KFL-b;{oRir-F#IbTAnX2|z)tg^7V&0Fi7OW-gy@ zo(ko<*b$==5eeuo-xy_T2)wn*V*Jq-c;wB-@fE$Tz8IaCmfaw%%#odi>wajK>{tX| z&D=lxH9YtjaQc%9aAjjR_py^e%KML95>!1TKmY-5S+=Al$!9*eHFN)YJZj>gofmYy zQb5_({yI^6x&6uxds7Qxkcx#*K{@UmxDsg=oqdUC#tyK*U!f%+TlC~${jC2K zaLezw_ix=ZA@2aRq~?epZOgMW*1~^t4ZBGzMCB>gUjt8z`LRdK-^YWO4MjF3h%s_P z^?FU)KN5dxG8B*@t*c(u)i5NENS$ovx~38pw7pn^E}WIkm)qiG*>v&SC9c`&} zONrl@oxIZ&IJaznNWd4T*(x!Iq=0=8b_4s8tkQ3oW69sYH%D(p`jF|cR6ZQR!qy&3Y_OPs)(S%P=6$|zX2P?!!*wcWoTjC z^)Oy#sajasW(cxZK=?NjE6P5R%H7XagZ%(YeymoJ!OiBlO2i7$bM1>aq6 z>#3A+MhmQMfCl`w6|b(L_fbLH=B?q83Y;rCRGM6hFWR>j?kipQ^ck0I|8o>)a5X~~ zpZa;(utd-wMgE}7EaTib@U2?cTo)%U#(1H}Df5Jp)@Oz#%eRcppd(6fi-}-0zPb~vMNy*M~69IOIe)uLr#MNh}j(fDDp5^ zKEI-!9NELZ_JX$lP9xdf#-rq;HnE!ZU9Irrz4nol24&V%PkyX;9~`1(+QY#=JGbN;*XNAean%u@BH8?0kp4z`h6*ltq~ zGKSCdxpAY}#ciMrL?#Gh3?%VoMOUl$Mv&{3$u%iAT)v+P4@HGTmkp>vX?Oz`X-^7^ z0%=;Efd(O|)94y8Gt+CusUGIgyF7bK$9gzrk9*FRIJ9~kA9(F3CvDpBD<9wd2qDY_ zt-pGl;$~T%MrR-1CCZ*9M5q+CE?$~2tGYk0+gYcdB+J5=DJ8qsUw`p=il_bAPq}Fx zy6f_g{hYkhReC0=qQ!Nfn%vsQ3FdwX^3FT*{18Oj!o`lCn_|i0X=t&+>XwAzzdR2W zR4ncv;_(rXvBOWf)xi}LQewHG>_+q4`H5cgmRSB4lqpISp?N`Qi6+{YeizAQl>SPa zhB^qP^UIAU#>=sv2EY3kb8|mu{TP7YnoIXDHb#p(k712LH_0T6F)c7oull9uoOq;{ z_{Fydn{~u7rey=oIMqrN+xD8w%X|_`tR@Fuu_rlYq%?Ez1a#D z=|U8HIHA`V~0&%7;*3F=AZmN!j@Xr_(8qn zA`5TJ)-7mZFUEN~^Bn*1++y_yc37&%h+wYA$9Q+VLX5Z{f@SDw=&!oh)hmnQopA3y zC8v{nm8cZ_m#hdL{WzCoeTSQ^m=M5@9*iBhh;ZqXt-E2Tr#KfD-hb^WK^$y0JbNpd;hOW z55!MZz3Vfs?JaB)_m~wg%Zq0=L$KcOYPhUysN~p_6yh`Nik_bt}J=&QL1{XKk1LpSz)aVIoqv(^%sdL%JpFKH_3hD&ab(D4e%4N{MEykj z+g|#HbC0boaOK*RQCY0gMw~L5tg&4>K4A4$mIN~WA%5z1<5{JX>|5neyq0Qanaf4I z4~_VBSQjuolbR*|&k=~=HcZGf*YGss-74MiYzm?2Xchxc)M}pLJRhg3E*aS@i#7h+ ztnTNnL$9NvJWp1|P}KU1bxnhG&jNW?o(x0zcb$(QK62Y@-3s*n?Sidl$3d}QKEK?U zxz(UpVJO^c6}r(?U>CuP;rSu1_DvExW7=n!&cF>!p(HHSS?WG7eJrr*Y z6@;nj_}AXu4yS#e!qocPX^7!qRm%{XTO5`e%{}G(E}cxE+c155ZUDZm@0-9}(|=d- zMy5?nN2U5kGY;X1aTceP0~0)pOp1@#G{W2?^KZVgJIbZhIL~c}$dQw?z#i(v?dmhl z@SHV)YWr-aw;L5BI(}+1;mb;HX}5PV&K8^ngeHG8jO>)_H&a79tM8+v^DH7%jY^ubZzHe`Aw z3dk$DG*)Lo2*dM2OH$EZDzC<2^-0K9+e~`;u;=KV;s>l;7*LWArar`b=3p(c+4rFe zgDAQ|er@DTvpaSoQb_ZF+gkP^s_YV7_PUlLL)|I>*LF_3tKSR?T#2=s zC4}%J1ZzT2RzX^KV7zu(4pb&JSYYx>d2K!4{sig5ZUUHPVuwiUDT^aGB^6|PJW7U` zLFnq3_^_nMoq!e!D2d>?mz74z_Zs>~*!T)4Z=ZlfhLL5@TRqqu@-(R&=gJFB?R#(z zLp&D+s;p?L>*X#Xj{x9Qh4WZZ5MMkRCjWdEPqYca-x5bVvl$U~Xof#H^KY=#-@pSv zN&sN{PgvLA=+~dp^Pga=e?cw&1?&2MjCp{X@Za&4zwx&JZ(y7MTNbdT$=**zJ`iwx z0Muii{R889N&r3otL#5T=T8BBP8$Mbvwqy}KcoCG89V#~2bP^Rn2974dzXze3LvBX z3Ua=(o4$)=W0}=k$BP2~YmsEd?fjB`aRd|xY+CCHo9s+d`i7C@4w7X@ zUjqjrt!Jj3YH@+;n(z4MIeGO;!g@cU-*b0fk)yGqHH1Csh*mbVge2bHO(_U7x%52e zH3}-4SnwD%FdY}u{`DZ&WPoe|Y4MGKlRUZGDaYT&TiW9WJ&$e1IIDC%z`pWW5BAP; zVdWDuP*RSd=7v(^H%bQJ7po_REu)6FX$~G48VI0+c?p>`f~o}tU2M!N(3E$kz$*lC zhu)5tywn_>ZUCF4!24p>%5`%zy@vW9#zX^Qe}z+R4$&EP%eX9Oy+UPUoNdhIpkkOT zJ$DyRtpum#RzT716HJJ}cBb5mYnzx#%n&TfD6*>$``s#tRzUeu)r7W7ccdjHnC@8sI?S=6>Oz}8MAL1)0f_?u z!u2zbGWQwEC2F~@6QFtS@eV?o?+<)4huOmcN|hUj3g_YUu#yJZbQ9JMg6Z(LYv-W4 z*4FiYG~lQqc5_Nd;dEEsLWIy?d$E|cQ5Pydd|7NPuE%Of81oEZyLYYIUh@YJNxXC7 zv;7b@2x%8$GEx*HJL9!3*Zp)ozv$;sW1Z#30_Ez&Tth!3fX#!W;bnH7bdMn?DVr9^ z-hP70BgyPWUS{v5k0M6t?pF%w8flgXL0C{{YvK_ysdQHf?c?F((>aavrxaEG04&GPPzVelz|@Xts2@U5ScIzyA`o^lA5&xPQxJNcxA{o>2 z9kK`UC?=4$)Xxz!KB20=ybNc7b;*nwp3l2()Hy4qTp6}KIW3I_W*TS6DJvrOcl2^x z=CFo^$TP|#T3%NlD;y#n3Q*s_p0Fr<_nqS!cogu&% zNrfaeza&%b>gl&Ake@hE=HV1Q44ie~UvRCkP5?Yjk%E{6Abq{CuEd?uYZ@T(Br|{6 zHZEz~qG#1QizWoAqu(7{X4Vb20LB(6j3j+uy3jeo7xNC(o{loR+w>eP>wn>iD4#-kb<(;(brn79XCx1*JccytCD8cd;|;FmyldA_lUim`%Ssm@jO7W-Y^ju!E?VEzYIt)=LQ&_=C#S1Q}VAW z3x(S>Ux1SQl)d=i@IAzZ1cXwJP5!m}_XvUcI{kd`!)Xf;hxc}WSm?aF=utXnT?Z$U zj$-n2G^@T%B1jOySpl+7(zAV6O-`l(=WM5fP!THSU-?$^nX(W|kP9F(GDDzTKmJrG zZ{qzgus_9t{$a1x*AsFH0JrKC0k56BC!IWU_7~N%<%R4(9M}vz12V6v#5p$r)d|Y> zC_&@{0H<>=0aqfTn_9L6Qhs*YCca!C#t_HWRCJ4w3~4<3De-{j&*QPxTlAAyaRAHD z%mSQs`(el!5YSC?up8GOtPl`KzzTQib(;A>FB64Dg~pd{fy_6yKvbkaRP)D~yrn;W z4uEK7{ob>?J~Gn*m@t^CaxKapdHCW~^7H_^y#JR%6@aXnzmBi;4r^p~21|`l;E9UH zvAwP*nek^JLBdkG)OaG1&oxzE2<3k5ww^{f(U#jsQ-7QJ?dkJ}&42}N%}wWoiYqBV zbCmU6_m^KPi6BXTX_PH`zv46s4VD8>y(U5c$Em+CRBST`>h-6V!Fl1!iIN{u1CvS`{!;og?_M z=lBmF$6)|W0;L2R(1cKfl2G54`%1IO4la~8r9-^Zx@qYzD2dh7O0*gUna*9VBVpC` zP^gvK!r9bE1(ad=$ZgSLZ>eOp(I+T$2@{|rk1ne_Ysr8=XC&qN2mrMUfwaI2&pMGR zQ%IC0guyCtu0FXs_ig%mx>iP?eUJY*XGZ*NvfdMUKMDYdTRV58to&}d>XVM%rzxet zJlp%8qLsGllufR_m6gjRkx@V?!WIJdos49UMLCR=!9ON&4A;YdKP=CDwB+cR?WrOZ zJH5+IB@J_p_8tZha~KmGMjuB@+F1(kl}Crz7qm%`3TR)I6od6akG&+2q!_xIW`Se( z8*j}xz*|?X{<6&sQ-CGY$wDvIKraUgYaI?YMgXiqolRl$^>{JF)vOk^wXW*^1!wWO7xyjG@cf02ua;`IF=g}5HSKGr-oQ@EQSUnOG&};R=VM+IM zTXxBW71p+JQ2M=n14V=iKs`$-15st~kfddzz%!O|I`QDzguD*2$W*BB8h_Wl`*&#} ziwAFX(eM6|}7eIQy?qNoLm{%_N`P^XWB%7T(A2qVLk-rW&a<>_RY9 zc957(-(i)Cs>4&She!dMi^0*&&S68ZbxiJQQ_*-Lzoc=o- z`b7%)kj;ba1~@N~M}VJ~#aP1PB>*Kh4P-xBoQiIjpVf*&J>jhQcK#MIR2ah;m0zlL ze7sXrO`rIrvj5!WFE%WB*cvV>|Mg;|nb@0E+p3SE0SBuOzZg?&e5beXRnn@aGJbm` zL8e}Out`4m?#oa6g|RaHq)B4D>2AW-o%n-L6V*ip@vtC?`|mCYbnE#G(c*7?nh4xA z3+Nxrp<6tdn0cx%z8W1(9%<6^=y3CT_WTw4{Eno0?~8U5H~A(OJ@o_X4V=B5osZwYb@N&qdb3okOS8UFM7wYDQqxZde0Y6p2*;#@B2{9pqFBBauZe z9ZyBY@h^<;h?Ucpl-ZRt&|^Xn?s4_-A1AM3T&4TYPdYW>UPNHS)unUe>|YO2S;n zJdBDCW`=ODKrS6sBjO!`TL0eN0N*S8_BaM6tPRyJ3ZR!8rt$f_rD~Gc@;$#;KM#B; zbZ0~#8f8DdXBmXDMx(M}tsOsJp)j(hjd|YX!3jA{9h4oG*s=se&omU8DYL|+(X6KY zW9^P|CCcUXwG}*b2+cCQXJTA0Y&bpkd>UPa3gQR+a_aP>PgQp6n3lX|(|!jmbSK>% zJG`h{AKjLKwKr@Z~0JNAZAqdqr%pUq^O2`>!ee2`$3G7+A|cwN6KZa>zp zem>oAUs1;i?O0>n_{A#}mA!Q?S>wSg854&&EE;8O6Z$JDU^@nC9!*Yi-~H(A{zyqGx)K{8E_7v%C;h6%6pbQk{c zL^EQB&gVRCDfY|k5qcs2#EHKaZv1`CSRE=n0L!} zh@(`cigrwX;;f-$L%BQZYBLGKg~Zg2!p%2YSNXPxbV&NH78-l0cq2Q$QE%$QRaPCX zzs?o!pt_jz&o%*)gaAoho@VY?n2BV2u`Swlxz+i7I!~OqVXvMy-|9)TV~tcN6kxJH za(?Wf@H!?`{o?D@j~J`JK=DqZF`j?~0z;IkgI@XS+6ngh`7G9^iFZs8-r?7g8zV7< zgJ)LhmV>ItU1CkTr*b0XAR(x-IDADMat67BT9)bq_~SC4e$H2+APK7Q<_MX%)#}_t zeU_b%W+Li6TP1t1ipTu<6I?e@&<;TGvwTjB_)4jn8;55X%`7H5-kS0oja|TjuCgi1 z?9ivVZ0@8hf{UeQ&gW-Z#;DQYDEU89H_*9n&lM}G?woH@epKBS?XJz zvzLQLK-;TF@sq-`&d5sDl{Gyn3J;!1u+9pgR@Qj|Z*9Z5^e-Nrr?5)0sO?E>6lpwg znb%J6L8zxH_5tw&b-*0B=x8TkVJ$rmN;q6UtG2Z?{vC1BL;wCXL0cLBMw1!{><6%`e2*VE3PiusiSOWU_9#t@x(oMO_5Iqeg#qN1g%#FkgWv~?Ag?dGn| zCof(Zc`xkGK@yPaF&p{|=rO|lAqNf7$+oI1JD>NsI=dgbz7Xr7yK~nr!VvP<^{kZ> zg(pn1dV5W_Oq%YsMd-O*+_yUT9phHo&=QB^W)Crp$Gf6w3GMxx=(Rh2 zeB`T4|Lq+_P|rsdGB##;hP_n=u;ST<-Srtdbg;_AXAqp=pi<{M?~n=`81wf?A11N2 zR*=ht^u_W58j%DYKxtxO5Q^r@J)idRqZLcT=- z#TpQMVD0DZYSIUMo-rr3CH;v#6v-e<1Q zPN)oD?_uB8vmOP+9PCYmH7v5TeqrA1)^a`Q4r zHYf>vKpmuIwFC-VOWhDzpJDQgP%2 z*~z77)o5w}5oUn;3*`y5w9JJbaL(LUCog}nXD$er+-gMWXFC?HhfzcVhll7c8g0JAH_?l@-yT+f}^CpEfEd zR+8wi)S!WGs+1K#(zOB3)KxTaQz@WeCsgw1sgfg$pA47`MZXZ)G{bOY-VOVtcmlvj?6MqZw9Yr3b~eK^iz!wpEvlwRiWRI{0p>rdQh z8Nzi~6hgImuljwn6RDc2$9->TUa%uIgN$1_Xn*{;z1iB_m2k~=&T}1R= zY+<ksD#F**>cG>Qd^82 z=tq#Hg^d%^^&~&yxZ9u#Zf`NIn%`YqqXG0kj#nQOZ&2N%{~8YZdC8LG#T|ILF=EoM zW(RQg(NSYOX1V{S{sqwQOn^6bL~iGsW5Kg}N@S%a(gTjg+yec=67yE#ceVH_GNV)l&&}=_o{XVN*3qd2NQu;R}Vf6iV7$BP!o` z7N4@4iLy>*S(hRqoT+YLI2y;I6d$p;QPxS!eQk_KI@U$GxOwH_Q=EX}h15l^jOIq$ z5HN%MM?U`i2s5t@Bx7MOUwnJq8vkWt2$R4oOZ)J)`C<6_m&;Rj9hS6spKCd}vF&s1 z+Y#frS2s3-R8m(i@(*OTzbkqm!>8K;+&rzyrF;F8XN89?bymh1_k@k6 z?ALKqsgTu8T1uVPmg$7i`6C6YdAya`mcgSbP(3SH6RB|^@Qb{PlavFc(~!Ejz}MKu zmmS-8a$;2CN~AG|d4xXpPeo-upyh|O856{jzH$j+7t%vykU+jYGyyK0k|uUVNi;t! z2ty4atNxm%-N*Zmdnfufb|Nv09(It4=ab)kt$z6f3rllOUV~w)6%T!*XXQx*eK=P zxU6-D(ZO8P1w$ppsHCKr4RISp%C_Gmq##?UmVpBP0N<7c{_6Fa^r$h`Y+Y@jQ|ipx zt2fVjyB4OGgtXOnh3nL?*>a|MRq`hojB06-HuUKEm$~O(MIp&z+~P-Fh=Qr8qJ6wi zPd*0E=9)5|B<814XG+zua4U7I*D@ufD*EQGru1(*gz@LiR{N9t9ItGH!L|89>K|R= zUVPgo7bm#$eSWa5_$3^hfmCP389a~NVr!63brYM{p}?QO!dP@}BC5Mt8XXvJ<7|2%X~7W-8S+Oau>ff7>B z{PTywh)dRuL)jeb>nPwT?&4#7(LnyeP!ev@4#*#@;^y{y22p=!RiAm8($oI!XM73l i?4^wVQxSGbu2xWfo}l$G5}~+9sJIe{&NW{JU;h`lJWav? literal 0 HcmV?d00001 diff --git a/doc/api/libbabeltrace2/images/graph-lifetime.png b/doc/api/libbabeltrace2/images/graph-lifetime.png new file mode 100644 index 0000000000000000000000000000000000000000..3d1079a059d933ebecd827f15a12109cea710952 GIT binary patch literal 22938 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 UVl8!T)e!!_rKybx+1M@WKM0BDp8x;= literal 0 HcmV?d00001 diff --git a/doc/api/libbabeltrace2/images/linking.png b/doc/api/libbabeltrace2/images/linking.png new file mode 100644 index 0000000000000000000000000000000000000000..c137fc2e09430be9ff803ab35a3f9f2b6c5b4c17 GIT binary patch literal 11577 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 z zV}{!iIAHCF4f}l}37sQvlSr$^5|Nnh`9hd?%nkGtb$chN^l-_4JS$?&eO{Pry2rb- z7^v5H1(Ff%y~^lkNi`YuROLq<6hF^GVEtnxQ*eL|X%v~BdRygpwr=JE^LU7anl%JS zkyuEk7j}F&D^=R#*4ywZ4x(Q`PNW7Dun`-x`5Wjg&4^q%hQ@fEr%G8*?gBfMyjaM7 z_$})v$IbU0m+H~E0!Z{J+NGj5o+xYcs^cMgL1y8#0G?+&>B$2)0BihTYC3o_(xYT7 z9ALGw<*149LRd1yv+5;xw;&L4vSJ>9k9yP)uyeCt^DV(h*8NEJwyvVo{1L}zwF@i- zn~Jz%;WHI|`ApXRD8wfLuUibkK%zh50K$_i`FjUG=B$?6-F~g3AoCLF#G=2X=yHAa zer`>EpBI;H$F^!t-{>D<`kSHQ5Lg?c0q^ZcFCMav;5&Mw)c}K$M1&ylQ#(7^~$Cw*egl{pq4Jb4;Vgvd(Jrp(e$l9Qx zc;MLrU<<_u_)V}P6t=a5eHW*f|5b!SxZdLSOTDD)H`@^pmgQ?fG}V5htWr#3Iw{Yl zxR~N*21?Suh1AuykuM1UPBquW`=K@^1B${fg8NwjD=RNg9d0L%SK(R82++J%8w#kf zF3b&lx}>9f#G-#M1y;J<{l?$C6$P^G#)V+ExnD;f`F{mM1)-D!lIeewJNP0=5V;)m zfiy!L?APx^St2N6SmM$_LR6#;P-p-Q)E&xF6~9GXY+G}T6*Fvmy56z#>GE1a{qVstT8|3OtUKKJjUm-Mbw^Xq%W zjMNTftcwj>@IKuFCLPBSl? z={#dgSp(u?{JGTWfFl#}Nz%h(IuQCz`?I@%AhwJVlreTlrOWWDOZOJn> zhCo8m)2qv8xZ3;q!5!NBD1}r#>I(jwqkEkS0Vr%TVG6&_V=lbfnze5 zM<+fTsG#LLssLaq^wEu6#_yDj{1yHfGn;X7yrRu-bv}>|@uR%Dv*uIrBhEm$e)^rU zLO=y6P>`}zY$j5M7Oq{)^_)Vy?FNL_OLKbUyaP zD>f5%%(dCWN<5bL)D+a0)aHA~n{>SqHc211LyGoe_l9;O4RyRvu5`9An4F>(4=@-m z+y8;AoqT>zHIF2cQ-UAuVORjY3hAkY=%Kuf=#6x_Yet6}<76&0Oq2J>w;kkgBD*S4IH5#8ITJPe*H7>#+na)0O?*s9K)0Qn)v63Jw(m}RosAy*E zLl4Ge)^2ms{+723_oL$eZYlu63pF)Iw`gQDvImD`9)KImXNJyeeP?)?Y?;yU3Ir1v z2E$R9JF1PK)0ImrrdaPn->4aj4u42E_2kUDd>mv_!?^Ze7*`*bSA;-2m8!ur=WHC& zccP=qtEz0fxo$5ZMabBDKBol@86bs6kC^sx7(#%ZAo?h4AhceQvv$y >if6pgr3 zD`vclfQ7IuInzV+1FcPDxGu*xBM<%W?5TH!fE>jW#uxA;Eq$>&%wdUuY}x-qg5w6u z&%B9e+DKv6wKPcrL=wc`i~<5HF=g)R;E5taap;Z=3DNAnn#F+zg;~U8T3I;SPLQn? zZM;*p(;6fymt&V(Jimk(d94@|lBKqSV9+PI5wzeaG9jfW_VDa94x$^^W=hCNFGgfE z%5C2&-XhdnVj2G-vNWNF{=D@Cm>v6~hdg39rl<;0q!wBSTJ>;e^3Fb|9t|%|QSi!Q z-`b2(*O^l5}oiF(m!){_V@#){g zh}}7(1@>UX?_gU|eE6=EJ*=39_3~On8D4&E6V1Al&&FwK2~IkUQqp-J_s6j|0kB~| zNb>^v=btE#taKiM#7<}aLLYN&n9P136Lg%6K8T7GI)pVhEi&ydc34y!n6g=Z0}ID} z+nNDq#PZzFUh~*!?XRUrG%O?<(T$+82NNnXjRq1a)}7R_X~I3qkz{F>y5Fx^NJeb0XqS09L&4FGNS|NVu#?2N1Vr$@e79@wM%*+(Bz67+EG8r@QaT z5GkCxJ8?69Q&LvG*yb?epMa)nP?`j#MiBqR@xUz7cnov@Qc3X);|p!w*Xu!|FkHoV z#fd_nhP)-vJcXDymxV91IZsOtR+bdseakSB=8 zHm;o$3X<5v4IZ=kdXZcyn8=umx1K m)gE(f!osXeQY**l29N2|B3fHIiIF8Nuhd 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 JN9fL@{|7Gu;jjPz literal 0 HcmV?d00001 diff --git a/doc/api/libbabeltrace2/images/msg-iter.png b/doc/api/libbabeltrace2/images/msg-iter.png new file mode 100644 index 0000000000000000000000000000000000000000..d2614042e6f88edcbb795d55a7c160a4b5df09a3 GIT binary patch literal 18606 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

    cc9TjE7tvCA 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 KMNUMnLSTaRanWJ` literal 0 HcmV?d00001 diff --git a/doc/api/libbabeltrace2/images/opt-link.png b/doc/api/libbabeltrace2/images/opt-link.png new file mode 100644 index 0000000000000000000000000000000000000000..784fa476f9eb442e83652eddfd8806a3e48e0f60 GIT binary patch literal 15219 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

    2hcTxsF0+L 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 literal 0 HcmV?d00001 diff --git a/doc/api/libbabeltrace2/images/plugin-comp-cls-full.png b/doc/api/libbabeltrace2/images/plugin-comp-cls-full.png new file mode 100644 index 0000000000000000000000000000000000000000..95915e6116eac73803afce8a6d9caad5ef3e63f4 GIT binary patch literal 38037 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 Iv1hOT9}dg3$^ZZW literal 0 HcmV?d00001 diff --git a/doc/api/libbabeltrace2/images/plugin.png b/doc/api/libbabeltrace2/images/plugin.png new file mode 100644 index 0000000000000000000000000000000000000000..3ca5058115d9be62f407575a4da8882922d77c20 GIT binary patch literal 17936 zcmb`vby!qk*FLJEf&vZ=A`B%0(v2{5jFO_#r64VxLy90n4=D}8Py&KTH%d#1fHVjU z-9z`;GwAoezwdWl=Q@8JuTfz0?ES2#)_t#gt!?mARVd+Y>f2YYTp@h&Snk=CE7u0D zT)Fxc?;3FB)9>l)z?WP0k9C}`T)`*7{Jr{X(&zNb75VQ^%JA@FTP#@v6K1n2rb~iLXvHdITfK6pJNeaq>w2bp_nxFV?LXRF?AI#Z zAN5=>|2=gw+IO6?H&@q)CJwY=IWg~(eD|}X)idOC<=O4ZEB+9ocMu)|bkmnd(e2F_ zTQ~sHlZpMs+^HjUGIuZAPUCrJ@I52Xjqh-+>b^)^?48=|q~dwu zm1Sqmp>)pKgACch*AM7C&#WbVoFLkBD_7b7wxcTkl&WccHZ1vQ2GQubJD;|H{%85X zXD+-k3^7JQ*Zs-(dlG#51PsDMOGV-aN`tLUr^S6m4@kY%+wGZ-uq)ixixk*}^3CH3eePbij; zgq0WNM}+cw71_?p0kX0X8#}i+9C~AY0@&a%Pz0@ZbOHpQ1e zZ!va4H6qzRzHXyNs%=CEC$ZLtx(2EeLCatHJd9{3yVuzs_;s)Ogb zQc8h1@8_21qUe5V(~3na$_^Z9Fx5?1Sg!}Qne3AX!H~LV1W7IWx0!i(-P;05mn_1( z2k{+T20bCHbFQ&>bN-`^!bj|BJaS&4P z{IS(8Vm_T4n2orfEN+`s3q|8qph(=Cus24b54_fIz}^^w>UPH3B`!w$AjeHDvFTL@ zO21lO|4_WEC_k&VIhsx3;bSw^qXyaC=JrvYzkSWM&e48M?B%4xpHBJc_RngPIih{8 z^~sMYF^2;O{TA{Y4yhq2NK9de>AOvfFWih1!@*seNbEG>Pi5vGXg2G8k2y@*Fi&)g zdhp4Y8dQdv-e(v3jtH$g3c_#itc#+J%a)FpQu|*Dds6ekCQe&qqmr{_CVxS3gMX2+ z;XHp)gWn@&(wBR%mX!a*wKdC&To5LA=FP4zPP=FD^#v@QoN~xWPP3u8x>lZYl{8x~ z-KX1Ier&&f?`%`FQnSHjTLi69g@@TApbi{80azZ}Gxqtwiw)U6R1Uj+3uoroXUr0R zjvqC3Plu1c5$(b3a2Yh4^%%hYPCl{?Y&7mpI+R18r#{d zGhaY8Vn-~0sB?X1nZgngp};1440%z)7_K^;rr+{{={a_VB5_eAaY)YoA6B{46{qtJ zZ*Q5%mGYZBM6>FeYS1?zPb^|MC%T@!;I3@9{ep8X%i`^7K|%;bUz4{4`2dujyc0H+ zIx#}I`*SF9Ci&?EoB=h1oAo2ld7892a^~wxZtVWo_~92e4!-sF@FXp2p2@)FYt;j8)54GEypFu)s14;_;kNgLPSJxUDo*(Mn4& zzB+I2CbdoQRr-T(Rdjjm7m1xr8%_?mXs}IfacihsrdY0ouvKz<7rLk42NVe_YaKEx zyK%WJtS}VAt#W(bzWx}Z$t$?=Ev!-kBZlLNi#!Xjk}@q3vAoS?7I7xubGp##g5m12 z&m&a1ZY@$i-41Xs=(##@}wug*qojntX+EapzAOx zFcr#=v%^rrb7g~$W>!K9jEDXs-U>WZ+I7ylk9Pw)f8DiUwD+><#@{19@-FNu)^FA2Vp{iNTE7Er;Gp~fqh zOqblzgEq8!Q!&73jt&~%{glK0sxXbWlkA@vvuhuO?`(M*BbgDTV!q@VIoR$shg=)> zNG|6AGn$@ZjC~s`cxZQYOMiS{+H5aoU>FB7?m=oE^r&q6Ppw^$%v8Pe2JpPo-R6Rc zyZ*Y5j*dv@Fpa4%b9Y#UF4sBYB!7Wk4tgYi)Q5X>&%h=ufuH=dyT zDF=^NHct@K8>!~t>g8Wi=Ao&3g+Zt4KDvOoi zQ-61!oJcC>WCQG6z}hm}&birwlL<&cr!#WZ%usCT*-GBIl^At@CY;`Pmrb>JB7n9H z|4c)|$~I0pL{r~!mVnMSEA?|P-?u6WQC^X@Tz5UfMoU>b4GVsFN+Z68w=&Ki^I@Lw zwd9oU>PMtT??HDZl7vfHc_S~kLdN=Iu**0dXN{Xefn)$=V&fPo#xO{=m{QLl!p}=K zNwTLMeD95UL8C*6+Awp~5h5)it)HS2 zGZKw8pfc4yjgAhH> zC(fQa7j-8?lC=8k5~HZF+nb?dPAl{l(N!98BqvN)HVi7z*^DG;wFq^i$ea1)($P%Q z-_{OttonJ)IP;p-vcXJ3*fUflKeyFTT|h8uMj74mD=pcQD7gQ_QkEZI!>L`= znw@c$AB;LtL;SxcyrL$|wfvYXcE7K%n_t;vA;;CDG07M4Tn?(Ftm5KN>-ABwjZMaH zNi~SAUfcZlv7pJGgP|zhm_uDgwPxQK)NTqHO?&DdwPl1fmlMx zarT_?b~WCU&KJJxciqV`huNl+3BeUCxv=Z&fL(J%G|%n4C{3K=9E0%6@#R{OIP&@! ztjC~IuuqU;X{m^bo0`e%2NC)w+gR1!ayz6hI*O5mQl2WT=2*R(CLcz|yY&!rqPKnZ zFce4tR<$VmxxBMk;Nu6wdsB2oFJa)o11f4q^EP|5J&RoIkUW?x)Au?{x@m}&;SJQ) zOIL^BjfM*izL`GWH5r>88ZqanI{C@}JPKaYMB_B+eSl)Dh=c^{|EKwU4E(?o4IQq& zi$C~FEd2p2h!ZlB5e^~yy4n$XM$j)0J}w~0rnZG_m{i?$#0>lrG(M<-rEgs&H9)<( zbq(VDtoxqJwExaQJ7kOmo${29kZtq@DoQO(QMK+i;JPlEXIH$gbNT$4!Hv84LZxfJ zzkGcn(jm_L+~7aPFn68dlKS>q^P?DggA7AB6VG*G+M5dAVtpJ28vx3C>GUj6ME^#N zh0jZ;08o1@y9X|H1JT9`B_@Oc@b({2{?F}~nETh0%*Wu$%pKTcj_td@AqrsdWuSp^ z@}OMP?-);w`4HTrgYo3jhWjo^f+MuY-vN(jH?6$T?A_-BiG!_r9s5;44?qGEIA=h zEfDIpm|p)IL-+-C{ezePJm?){%lEh8x$n*(em3f?}$sWs(4fc{&0Vhr-B@d2AG|=DHfgDJI*=J@J)277(ROXd_5d}=1 zBI%<2t!5wEXxP@=sv&*HQ?+(8Q2cmI=EGICk*g3qsCahY@c#CJ4NHe zN@1hwqpUl*-~7xxR7FO z0qQ!M)pJ>HF?hKB{KFBwp&ko;Q>MW zdsN{II<2W5|2y*DWz#yXF0gUaL`dKugSOnv)Q)z!kwYEp7#jm3DiS)d$p1`Ej20o0 zbn$rMf#gJS*Xrp~Y2SEg_x#iceEAser%P^W?!p?*_d_XpzKGPR-#GH{CSSjsP(XRYfcMa@+1gM>TJBbJ(UTiD=AaCcvZg2g`ETDidp zMGw|7-my40%_*+qn9#8riT>i4Vs;s)-FF0^WSt(p)nii7Q&0k{q!)K0EyC7yr-b&# zZo$LiUZ=YSD%=$d6C*)KCxRDw6r5y*h-g^eksxbkuC_zA!$REnJ>B=4GCv-3 zT8rAKr9%seLpK432b{Q4rRhJ&@!!+gG}`7&h}oyoVB%-wjbA+;wCt4~Z@cu^JgMi& zNQaHQh!D%w3EX^9kZVz;@RM?l zKo{v7Fy}`$eXBGk0y}Ayz_}f%phr-X(Ii~MnPop96J&zfzZ;I6rL2rgRXjw7}$@2_F6?v0<1Ie^F5gRMsDudd?!r=_c2v{ zA#spNucexn4KLpMCmUFxdpPD>)>^JgYr@Y;)xPZ=keaFy+BsEkulI0nS#&MwpEe|J{IJyz` z>8FpA!PC0Zsp+{g@g0bM%o0aNA4a56Is59)G1`Fymr(yEW)be>J(zOnv8?g2eMCX} zu&Fg)cXL-aT3i25c~wbaiNzk%_(J=HDl43-vA6)0xw@L~OYZrScJ`XdEn7p!HSXF% zo4X*G^O09czL1#ga7NP&nEHOr0+QRykS-K9A#bkGo6!NO)%Up?s!?u80S+BcP3A4= zvRsu%PyJR2wTK+f1e`LUjzD2mxrZt@&eJI{ejLNWgSwoK&}01lh$;dYJ%k3s>}S!x z)j%|81xBX8`JmPrb@6E(0zhTB%J{flr05N3>ZKMlr0O-X+_2s|xpmRI?SxHi2 zu75vw;1D-6{Dp0d6~O0`R{#Ku32`hE{_@I_6?shP_ZE0w2_CxYFaO)ClpMv`tjl?w z4%_t$zUwnP#m#0KrJZX8C`uSkclxdkkbfMjA3knX@x(3sq?&?D;XIkAACUfDaQhoJ zD8oZ*JE1KeOl|*=UQeWht%;&Dso$K%Nu0O#148rtXFajBXITb?mRR|Wz(eM- z7dBNtEu!C3_Ln-Y4j{<2vXpB)=#wb*VxUEh+&_o9DqC|;3aj$Y8EgJKkQtIj67niuD&1UtwucYd*44u!g~ zQh#Rf2HQSO&DqF)YHMrZZ7fZq{=qu)Ho+SIQuRnMD&yHT=NEonF8Nl{U@pcYV|v)` zpd@AgeUR^<>|JzK=3BR$GKH&XX4YJ ziJFnjCC?y7C;Ze!*#v_mN-=WS;Y65@3flf_ousH`n3$d_SVBFKy)TU+K{Tx_s@#A|-k%-4xeMC1wiTFvHr1OjgYAp|r%PYPu_Os2fSW_YF+ zEz8T5tkM5gjT$DmL(zPFV~Djw*63hJ!V;0(T@zK%+1#Ty^*ja|wwAZ2aejv66nsVH z&xhRAFZ6`Qs%d#oT=699)c)g?eAFie?qN(4wi1D9w+1~K=Ks+->ma74p!e6d2-Hj~ z{kFywr!|Mb9>Grw=<0Gh?**^gScfb_|0g0QHrVWIX%Ki;{hE!O?CR)!Sl}m5Q?x*5 z9iNbbz%k{|wpNNA1(io718d|+&ZAuqbYU;GD%gd%=bi?odYJH$ap;q84kq}(-s?JW zD)>#e7lkWhLV@Dd*NSL7pE-J-doXc@LJDjFW>@EbNX{gPIU4P{QSH@>ZlMo_HX0iw z6TiqNB`Awlua5N$n#bh!J#D$B7yzM1Ff^7$nFsgoY4u}O1=AHk3*{Cj+J7T=fAs^ zZvA~rzFKqRSAxh`CLw8b-`@UgyYXdYpa+)#`TA>FQ*%1UK#cjI-W{9{T69wVMNk$w z20EANV24*7g`pmqPw3xuGWFfF`B3l%-o3-a^T}gFMCbG={$<8xmB0DLPoh#TGkQ>Z zfl$Mvp)!kMm77)_trQtcWkJETu$QL%DB^hqLC5NaWI)+HPw0Xg{bZBXJOex>HoQ=N z3YG)p;K7H<+g`s+oz-N)rZi`RDYh;3j zO5M4h(YLMjE)!e{4r%bDXKLI%F|4_aARDoCDrSdvsj{CEsCTg=>opSjPdo9=jk(^7 zwBeDIsu>H0h{-rE^xVw}j81~2*eKI}9!6IMx&*_Xgo?enoE?9N*?o{;kzsOvcvGmc zhE3Y$s0*vTbfN{~j=WZYL``#(ezexmN-^c{Hoh^)Nef-vRBkek<3j)9%=P1Y;>;yd zIZK-A4*6MG;VD&lueeH&x}z@R?QEZ_e`Uw;7^kOuxQME3Sb@UO-5_<9qL)!^Fh2z~>SO{za}*7UXk$GUI-qDMzEdzxXZ!L6NWf`QSW~I|YV% zun7Sa#`XU5`HHVhpKksI;}Stp;Lr)KYY9(LxGvd6wgYOTbt4&@+D475&rnBVfkj5( z!{3EBfqt>E=HcxaxP|O`4fSEoQJ>0rHdCLKr|Opa>+|!u%37S87+40Hf*UkZGbLeW zwT1#mQ)#5I!NhdH0AIi*Vf_od_!bOLY+^?J@rhFm_q7hF$&dHZ)x|QNy%H|w3W-jA zoBI<{RJBo%xR%64gv$cV7Ag%scHbWI2Hy*jaU#x-zCEO#ni-p47Y(Cd{ytORQ_XaQ z%>Qg-Ix8#M8b6m=ZgfOYXNa94h7RP~5RYh8)Q7tDsQ3v~J45zx#mW5%-GY7>{>`=# z^TdZ)2Xu|~OC$CRM<%H-t{Qq!JTv`MMZtaGc;7F*Y;q_@F!X9E$xzwjzH>p@VGVsl;hY3fr_z z8XS5ztUoQ5$zZ$)@Nr^5Xtzb1C$yFQ)VBPEB6kDH;n-d8EK`3y#os4u38@$G*<$j! zWg`NU3pUInL9(bWgrrV6`4{&OC>j&0UhK($Eevapg5eVTM|~Ua^YoWniuyDSTFBjl zZxkwPWo+`vYM0PG?o$@w0U?<=?6YNI7P&x6{tJXf%k8NYSnqwi&?~W0<7Q;fLjeRC zuC6+l1|ONEQ6vrT9pcWVnunFP9P2SfNP3VvVERivZmBnle(>O=8wtwu_WqMPd>q5( z7p>z)&W)~MIsb733`aYjuXu0`TZBURa6_O;Zm3eGk|ao8hb_oTW{_pBhVYMsM`xRlwEfe%BP&NI4DMOZ{^Tf^;9r#{H^OSN%lb9eQlp zC(Lj3ctVt1Ad(upF9ESD6*AFLJ2agzjiCKnhDIc_lSSa2fNlAH69#vqWNY2x+y9*PkEaZCo zRMX*6qTdU`)Xc9BzFr~}JwhH)(c)%ZzPf!wGzOkr|Ix2#a|s8C?BmM$56Tbodif^E z>ZyC$M&OwT%);Yl@y8E==>m6$Fgm8G#+*cMNbD**DJnXZnLbX3+ok?tDq=(q=|gM( zdA1QUSYBt?zQkBR7n=3>F>pYR#E#|AdF{^!L)?aPAL+?|Mg!tvaIUq*r%;HM%_CS< z;0DsM7<4HQBGhBxdbZ^sd6hp_44CjHLY!aNXcK4;&fQQ!KMhTQvL=0Y%yPIlEjVU8 z%cg6*UU)Yf4oQ*VV_Pxdcq&*oBc!J_*6k~VUaIkI4PRjdfj&Oo>j7mtYI+!wAUQFI z15JewJJfRo;{`1Y*i?_JJ3Uc`7ixJbgr>Di&w9G1g;Mh?hiZ-zX2A){W{`?^2Y8r- zxy8d1(_p4=92iv4tVN7pf6Vdm#tR9fj%tj}lpRW%JDH~I^OPNsfiY11_pUYU%+sQ7 zrhiHApZFGv{7=7c9&pssikwR8r#<9i5-`IUB83lR85{3&AItw!IWe&cCS1X4uK$=k z9%np|rm82z#&lS?yo{*;aTFSQDU$+_2_*HfH)C|x%Qy^(Sux=k5T7-D!HA@x!889Q zH~z!NOV)AOYcr3r$e0i6TbNN<0<6D`i%JNDrWef^(i{K21H^cMloCYMV1fPh157FslVUU$0pP_DA1g4@gX$I;^4w0HQl5 zHvKHs0tDgM-x6WM(XBB+)OM1x=*9pj5S(JM;WFan5CW#|{37@<0T3T!;#EMt4Fu#{ z%oyndfw)=l|B_74TF$V+DT26d3t+P^z8r6zegZg`$WDjK6buki$B<`T;i?#zy$a(X z6-2j(7HD zXRn4D#Bm2i;vP4mtrHIpz4KD5tR*kQr8m6#uQ+El`cD@hG~Rium!||x(~wp_#w7Xf zBv^JLJ96)~#Yr6jdBb+AU01TH={*T$rKL-oOP=f}M1^ zA$cwmF82|tv>hfV(eSzzOzy7V4UkJs7T-5}7Ss3|oVW;xfJ1{HS|aP6ES2~XD-BZVnNN$a*MMx9Vsm$f z&*`aBvyl>6u~uni&wJqa*nGn(WZA?!xyRzoc7S9j3{Mszr>2U~QEOG}<@QfYpVXxz zq03kfo|op@zoL$j!fhQXn?kPngp8H=%E?YrIGj7KKx5e8FiAbVS%?wmwp zGM-ukanl;uY&VkAbs*|s6F9y$ef=L84Fx-qcds~cxG4J8hE_BtEd3^}UsaFhLMKqE z)}n)5Gai6^!(!X69XxBP`{2dekW@pRbGMSo_H&(NCAW(pJ%XA2gCAMTpQ$hBwv}UI z&FUeD_eK=?EE+>By~^M;;SD8L3oKPbm1Ls&!?H^n1N}J}5WzELiE0sxDrk$eWXXl~ z*}_v^55bWA>;fG>$OksWhZ}s!R#>TXJF8h9)u6MtTJj$CiZ!C)2ZRw1>lL)+(H3pb zkW#}x8ZMv5l71r+evf-7-@=IE%i0z6$lwnyaruLH*NLbc#mAz>+D})74W{nir5F%_ z>}&2+)ji7jDx?;cSvy6Ty3tVO!hO=w^l>6O53db-chvSk~ow;}sC&{VWA_w9UIW`C=-`1r+$+5}S@s9REz(MY(wQHk+GSC5;H-4Xl7xm2^3 zX?e&tuUhw#9N{+F9iNLZkM4I|3a)@VHGyC=klyE|fJ8-9X?*WI4Jy|Q=_xYAO~!di ztE2*Mm8-|tPzh?){k_2b!2QgIKZQcxdH%W4%aV>JI9hS+FrhNEGz4)z6qxC)(*$ag z1qWSF;leni0U_*ahW~D`XCtPRB!~*@LDAX)0kox20H-11#mIT>iYs$QrxQTNlk|+} z_^?T=7^tSobgfaF9q@Er{z;3QHdt|PbrMtS#;TL0bqy#+0E(_$UF@pJm}`N`uvl0O zBuO5XB!?S(evEWX)0WFfPIqT@bkf;tl>xV4Btn3QI1D!1)MW|jsrcM{2V_9!q=8gw z(84s{Fa9sHuOBi>nd8A&)mWa=D$A=DhQEWHs#8TBP@;8OsZ_j6B5`?v1Q`G)JE{3F zKrXAE9D)i@^-Jn$#Iokvx~JM2TJHaI`iB;0UJp;Y^#ObV7a9PS-)tp7&9s0G)!8luM+~The!%6+vKT9_ zUKPUevy{4JeE<8s(x`S|@DwVZ4-jU=IhjQcF+hI35PhgB{w=#fyThLf$jJev8`XXM z8aOHNm&O$4Wi5<1`=-NuLO*ph-(It~ZLLx^2*@qg9h(Ca+n}5@#{Ez;8O%yz;>;DW z|BTcrWhF`svamZqOM2DRxV>$R;Qhb#Gf9qyC-1|2htm@wA?MMn8@0LS)g1o~X#nS( zDgOujf6B2S_7@58tlsR-`R}$ZT|k6(7Xe3LM0eu&ZTri< zr2fwqZ9s3mNV!Pd@7BRxc%b(GQmDT-Ga%HLP({{2^^2#=+&X)^(R9^?2PRq$1j=%L zrOE$(&Gw!ozEX~EZTb^#ZoAvj5dQJwih!{B#>Y zPE-pcsQj+OW4z4NXTv%@;>j<#UW|Lx0tGqARS+N0u*q%8U(N`K54y$SR~v_d+|p)17eRJ;RkZwL8;eqS5FW}x8qIQc9_V0?b_e95jdbU zw=~%ik=!;I(pqFb=5>JO8_wtO?|SwNF@Oy0oUZ|O!$i%v5E6S#j~|ImkdI4Z@9JkYL|b7YwmtSDOr9dpGO6IZPN;qrkdTn*@ELGT@N7amS%r zb_2%&Rx}c2z)EH~HZSi`Luc#b<+F=c=%Wp$%(cg{c`aD`oCO1_?Red*AT6nc$E)XoMfL_Q^)x+Y1Bqmy$}Y*|O(m{MdPGh1 z8R54##md8buJw~We?xMyXr`6%@JW=?r{dVj^TS+)F&(w zk5`8WA6qO&o=EAZx%o=D2HKNLPJ_7}(?6W?&*spj_kBHBsBE((!m)pUPhh%y*3*3b zr3;$@w_TbK8NvGNnn*56&M8}?uTGlOxtleh$o6026MgE4CkO@K)u@QHDlM@_nw&5$XY)BdAF9g4(c z3Ih*ue}IRaD(Ic^=CS8i##C20SUf}r&2|sFT5xwJy3+-9;e*4L7!hNkG-zYj$B+h* zE>x;f86=}+eCB44n++puFne%4;L~?=)A&$s`;8il8Vd*6Q?5fnwwoQRK!qU3WV1iV zDp69i3;#wd^dNC4!~G>cUGFGRUaGh+e7&@u?`&9au!3FWpw2C_JEkM)d!kIt zOMbX^6DEQ@DpI+RFk{<0e4H}mTz$%1Zr^|ImT>{pQYszTbB{R|+^rjtzhclUxmEkS z8`WR<+EwK4i@G#$wvR9dv?xhzPG41&FWD3=mLfpAOii#ASZ*;u2_?X;T1V z^7jLjh(3Zjn?Y-5^u!ovw`xgPomsIR?Ty6zXKe)5#c*Co8D{*Bau$pgxdLG-N_ zO5lT#jOiSuN9mcx90;27_dSr zR)Gnc(;1Kcy`gjhvYY&2!88|j~FzK{4 zB%L>PKaU{aNi63F?Fp(4s?MqIBMw6r;#9|U*0_7o!FN%fzi+iajpeR@LssMwN3|wZ zjuMqHU>k&9h$HGYxWH#}+|RyP*EkHYgq~Nd-4x%{Eo|Url!MFFd+;=h6=`#bbWc*j z9%Y{YW+w@)A>Wiittq({zuE!jziZE4%`l=Q`sFmBjB8C4Op5r#eGK}ga#1)PZ&qy( z*KMbwCCjtUKHyv5BV;@~P6+$hddBVFs?5#ERh$h!C?o?agMe7}*w+Z%UB^52OHf%= zzpa_Y2UoB3{3Rx1X>U_Xp(xtW|6VzpaQ5^+w{BTcmpM=Ze z!}Cf#3^+&P8ioP|N*DmWL~ji4V!#=%nE4XEFI!;X8x{+&kN*>fG1=lveE-J@q=GKt zeFjhwF5w-E&0GJIV2Fe1H>+owcXEqpe7%(%#ek$A z0LF%s?s|7^Cw#pncE6pcj(w5^2!fcQl71R1EEMwm{899AVK~m*%qp2ggJ+*0>Ni(Z*QD|S(qj%_KXEcy6Be@vr9JK|Kx$y6<@Ap8QPJ~< zUUTJ%AYen>5=i^^agQ8FrS(oEkF1O>uK|;UkO3nLSBHsl zmPWPDUMydu!&z~#x5SA(3aQk~9r0{zd@j=NvDcb!C_qKK9CXx_rsh}-u5WC;@Raf? z8-1Rt=9=1c$20BxVK|>d=qzbm98;}#M?->9R?0KMH@_*++Dd5qH__1Li~`=GsLXbL zrbN{@uEt`ITYXOAXw_cv>i4=lU8ruk5|zpKAnsZ!KCY&5u6pmxj;l$diuA*=<(%)M zZA!7l!y@yLa$2dm;VMGOTtDpr zp{a7=!_seb(Mz|g^<=X zGQ2LjgFNEgoP~V~*w$~H@|c2DH|w`1k%pM1xoQBW&ADumH9{2l`C(Pj z`Oms}!e6)Q1;P>EfK_-iCV^l?QE*ZE+&d?#-n%|kH(B_ai}6Cjkhj@+*7|GtZreH;|`U}($mC>i%(rBB`|kOk;+1@YZF0u{N;2 zn5`e#ujCq#ok?u1Y=%_IULDTvnn(8^`uVnsxxoe42b}-7)2_8Ol#Li&xRw`CdZwt! ztsf@D(-r9BsB~ZL1Kd}GGidX+@m~Izht3;&pzFm`+mGn4+5g;^Mcl#!BVL!Gc!TJBm$mVZ*~8#b?FSXTwIm8wG&z z094Y01dO~-4la6}e9?4iu+uJh1KQdby>JQd00l~lZ`cl>mfZTod2DT&TopzHjsTJX z3z?Fzoye0%VYFjT_6OlpK#d$=;dR(Y&fg8q2v1vRWV^}q89qQ00AA36)8pN3y500Y z)z@X-@s%8=fw&HL0c8RsUtkKeFN@(Ku@|vfq047tMm?~MKzJ|y)ba`c*FQxTrSGEA zWxd?r`!9J{nX4#Zs*&gXy?^7o4%7((Nem3>`5b?~NP57vYOV|j8R#aAkWrD^a6X}x z?!Bh^ujEcQ;KN}IwkG@!pu0$otNMDaiFN5t$y^o}{Eh(hY8U95TvyJ5-JW*S zfHn>Y&F4yBE<-m??S!Yw4nqI+UWRv8D|v>vfDIP|+zSwH-a&pc?)IfuUqscO-@wwG zjGpNBj&-;5jbfk8r7pTxOke0O`YE{@UX`I5G@3$8Xyzf%lSPj-I;;V2%l!)MG@1L64ZLZs>I?Jf z61=I;L(u$X?>?x%tv0^*1}s4y^FA4*ah@87iz@Kdh(|PZq_@)0<7kZyJnp`BNH?`x z>UI%$X%{E#%NNrZt_#T^#R*&jpdZZ3Z<3w|c0Q+2qdyWafd@q5R?v&>$Elso^>NwL z0et~4rs)Nwy6;vduJ{2H0E}(oaLnm6aAahyTbS;&v+^SL-=Md;+sqaXk3}1?Ev3OD z@7ByW&wGNQzRB1oz!k=|MRPT@r!mG<>gaZ02$Sfxt7)Tn>myncttw4Ghrh!i4Zi2y zz#wK5!+)Op3>ROVu06p{81RB%C=bPN%-xvR$S&;#QXSZD+7(BDSKUAjCpY`v1YpLP z=DECz9p;;ljKq3zF6_XGA`wcK7fC-oj*l&J^LTtU( zAC=APHZ@~rC4+0*)`SYk;{gIIwp$=C2P`DUod5nZ0_mI+o;vKpyd(daa}Rh$xoW$7 zk;}{7tHYD|k-eaNnIXf6r zftdSoz36C}m;FV_aJFChG3MoaoQwr4$&1e5fxfkf#JDkVe-GLx^LtB zNb^9chdfU1asE+@((|w6HC({zzqt+Ml}~D+Mz$4aR@IHC3!$?l3_-XOyW~c}lY*Iq z*}OJRo~RQaFfWz7@21iu5&y)pUd8HQ9Sq-6mGnDf_tEFpnN}+x{YD}6GF5f-s`(K z+9Btw@d0&PPC}71cXh?Rl9!-a0eD&0>eI>1!PuLkdD1TIs}D583)-o@J|v$)6i82) zOM+B|C#dky6H&)`dbT!s^t3K}Wei6XUW(4$a;=Q!L%Co=hrN`q9itX;1-U7coihKl2e&8~e`uQi zmRpHj9~`w?q}@B(`PH<_A#iNJ7vTe23G5n5(_ef{1g$6j!sq2>9^-nPIO#&V;VPQ6 z731q#Ic`!uzJ7gH6QE;$UHiO?h$2vPT(m8X>U`w@ON@r0f>&vZ%vFs1wNqgzWg~22*jZ zqC@w`2}>QmjR(HH@-BtG*UBtgU>iRpN(0QQ9!J3b&Y%8fD!D9+;A<*}OdKXhS8vDT zCSvBTI^Ba$Rk$5<+&9@UlPL&Hrf<>?v5kG%nKZ-LU49ux)BbSv1M#KUrJGOFZV;l7 z{afrik11~4c!GL9+v1V0m{t-M$`A66eNffnb>}SH>l!qZauI2yyxak`j@9Y5q6FCw z0;Rv+1YT5>6Ec+JH?O(rqRwxvTbePa1<5cKr0~Tk76ylx@*M1 zJ80qihmQLR^oV8m7pyn+!{}kJl!y=q*O4u|zfwvQ+ejrGO=mMR&udZ+Ez7b0;lnp2 zCzGIWj^mp*=$~={{gOynA`vW literal 0 HcmV?d00001 diff --git a/doc/api/libbabeltrace2/images/trace-structure-msg-seq.png b/doc/api/libbabeltrace2/images/trace-structure-msg-seq.png new file mode 100644 index 0000000000000000000000000000000000000000..1529774cd07db932303eca42e0b9025791d07fee GIT binary patch literal 17122 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 F698y4lkxxn literal 0 HcmV?d00001 diff --git a/doc/api/libbabeltrace2/style.css b/doc/api/libbabeltrace2/style.css new file mode 100644 index 00000000..4a42678e --- /dev/null +++ b/doc/api/libbabeltrace2/style.css @@ -0,0 +1,79 @@ +.contents h1, +.contents h2, +.contents h3 { + color: #6A2F43; +} + +.contents h1, +.contents h2 { + border-bottom: 1px solid #ccc; + display: inline-block; +} + +.contents h1 { + font-size: 1.5em; + margin-top: 2em; +} + +.contents h2 { + font-size: 1.2em; + margin-top: 1.5em; +} + +.contents dl { + margin-left: 2em; +} + +.contents dl.params, +.contents dl.section, +.contents dl.retval, +.contents dl.exception, +.contents dl.tparams { + margin-left: 0; +} + +.contents .image { + background-color: rgba(0, 0, 0, .05); + padding-top: 1em; + padding-bottom: 1em; +} + +.contents .image img { + border: 1px solid #ccc; + background-color: white; + padding: 1em; +} + +.contents .image .caption { + font-size: 75%; +} + +.contents .fragment { + padding: 1em; +} + +#projectname { + font-size: 200%; +} + +#projectbrief { + display: none; +} + +span.bt-param, +table.params .paramname { + color: #602020; + font-weight: bold; + font-family: monospace; + font-size: 90%; +} + +.contents dl.attention { + background-color: #fbdfda; + padding-top: 1em; + padding-bottom: 1em; +} + +.contents table.doxtable th { + background-color: #5173b3; +} diff --git a/include/Makefile.am b/include/Makefile.am index dbb6efa5..159482c9 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -2,18 +2,13 @@ babeltrace2includedir = "$(includedir)/babeltrace2" babeltrace2include_HEADERS = \ babeltrace2/babeltrace.h \ - babeltrace2/current-thread.h \ - babeltrace2/error-cause-const.h \ - babeltrace2/error-const.h \ + babeltrace2/error-reporting.h \ babeltrace2/func-status.h \ - babeltrace2/integer-range-set-const.h \ babeltrace2/integer-range-set.h \ - babeltrace2/logging.h \ babeltrace2/logging-defs.h \ - babeltrace2/property.h \ + babeltrace2/logging.h \ babeltrace2/types.h \ babeltrace2/util.h \ - babeltrace2/value-const.h \ babeltrace2/value.h \ babeltrace2/version.h @@ -39,94 +34,42 @@ babeltrace2ctfwriterinclude_HEADERS = \ # Trace IR API babeltrace2traceirincludedir = "$(includedir)/babeltrace2/trace-ir" babeltrace2traceirinclude_HEADERS = \ - babeltrace2/trace-ir/clock-class-const.h \ babeltrace2/trace-ir/clock-class.h \ - babeltrace2/trace-ir/clock-snapshot-const.h \ - babeltrace2/trace-ir/event-class-const.h \ + babeltrace2/trace-ir/clock-snapshot.h \ babeltrace2/trace-ir/event-class.h \ - babeltrace2/trace-ir/event-const.h \ babeltrace2/trace-ir/event.h \ - babeltrace2/trace-ir/field-class-const.h \ babeltrace2/trace-ir/field-class.h \ - babeltrace2/trace-ir/field-path-const.h \ - babeltrace2/trace-ir/field-const.h \ + babeltrace2/trace-ir/field-path.h \ babeltrace2/trace-ir/field.h \ - babeltrace2/trace-ir/packet-const.h \ babeltrace2/trace-ir/packet.h \ - babeltrace2/trace-ir/stream-class-const.h \ babeltrace2/trace-ir/stream-class.h \ - babeltrace2/trace-ir/stream-const.h \ babeltrace2/trace-ir/stream.h \ - babeltrace2/trace-ir/trace-class-const.h \ babeltrace2/trace-ir/trace-class.h \ - babeltrace2/trace-ir/trace-const.h \ babeltrace2/trace-ir/trace.h # Plugin and plugin development API babeltrace2pluginincludedir = "$(includedir)/babeltrace2/plugin" babeltrace2plugininclude_HEADERS = \ babeltrace2/plugin/plugin-dev.h \ - babeltrace2/plugin/plugin-const.h \ - babeltrace2/plugin/plugin-set-const.h + babeltrace2/plugin/plugin-loading.h # Graph, component, and message API babeltrace2graphincludedir = "$(includedir)/babeltrace2/graph" babeltrace2graphinclude_HEADERS = \ - babeltrace2/graph/component-class-const.h \ - babeltrace2/graph/component-class-filter-const.h \ - babeltrace2/graph/component-class-filter.h \ - babeltrace2/graph/component-class-sink-const.h \ - babeltrace2/graph/component-class-sink.h \ - babeltrace2/graph/component-class-source-const.h \ - babeltrace2/graph/component-class-source.h \ + babeltrace2/graph/component-class-dev.h \ babeltrace2/graph/component-class.h \ - babeltrace2/graph/component-const.h \ - babeltrace2/graph/component-descriptor-set-const.h \ babeltrace2/graph/component-descriptor-set.h \ - babeltrace2/graph/component-filter-const.h \ - babeltrace2/graph/component-sink-const.h \ - babeltrace2/graph/component-source-const.h \ - babeltrace2/graph/connection-const.h \ - babeltrace2/graph/graph-const.h \ + babeltrace2/graph/component.h \ + babeltrace2/graph/connection.h \ babeltrace2/graph/graph.h \ - babeltrace2/graph/interrupter-const.h \ babeltrace2/graph/interrupter.h \ - babeltrace2/graph/message-const.h \ - babeltrace2/graph/message-discarded-events-const.h \ - babeltrace2/graph/message-discarded-events.h \ - babeltrace2/graph/message-discarded-packets-const.h \ - babeltrace2/graph/message-discarded-packets.h \ - babeltrace2/graph/message-event-const.h \ - babeltrace2/graph/message-event.h \ - babeltrace2/graph/message-message-iterator-inactivity-const.h \ - babeltrace2/graph/message-message-iterator-inactivity.h \ - babeltrace2/graph/message-iterator.h \ babeltrace2/graph/message-iterator-class.h \ - babeltrace2/graph/message-packet-beginning-const.h \ - babeltrace2/graph/message-packet-beginning.h \ - babeltrace2/graph/message-packet-end-const.h \ - babeltrace2/graph/message-packet-end.h \ - babeltrace2/graph/message-stream-beginning-const.h \ - babeltrace2/graph/message-stream-beginning.h \ - babeltrace2/graph/message-stream-const.h \ - babeltrace2/graph/message-stream-end-const.h \ - babeltrace2/graph/message-stream-end.h \ - babeltrace2/graph/mip.h \ - babeltrace2/graph/port-const.h \ - babeltrace2/graph/port-input-const.h \ - babeltrace2/graph/port-output-const.h \ + babeltrace2/graph/message-iterator.h \ + babeltrace2/graph/message.h \ + babeltrace2/graph/port.h \ babeltrace2/graph/private-query-executor.h \ - babeltrace2/graph/query-executor-const.h \ babeltrace2/graph/query-executor.h \ - babeltrace2/graph/self-component-class-filter.h \ - babeltrace2/graph/self-component-class-sink.h \ - babeltrace2/graph/self-component-class-source.h \ babeltrace2/graph/self-component-class.h \ - babeltrace2/graph/self-component-filter.h \ - babeltrace2/graph/self-component-port-input.h \ - babeltrace2/graph/self-component-port-output.h \ babeltrace2/graph/self-component-port.h \ - babeltrace2/graph/self-component-sink.h \ - babeltrace2/graph/self-component-source.h \ babeltrace2/graph/self-component.h \ babeltrace2/graph/self-message-iterator.h diff --git a/include/babeltrace2/babeltrace.h b/include/babeltrace2/babeltrace.h index ffb8109e..3f919cf3 100644 --- a/include/babeltrace2/babeltrace.h +++ b/include/babeltrace2/babeltrace.h @@ -44,119 +44,43 @@ # define __BT_UPCAST_CONST(_type, _p) ((const _type *) (_p)) #endif -/* Core API */ -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include -#include -#include -#include -#include -#include -#include - -/* Trace IR API */ -#include +#include +#include #include -#include -#include +#include #include -#include #include -#include #include -#include -#include +#include #include -#include #include -#include #include -#include #include -#include #include -#include #include - -/* Component class API */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* Component API */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* Message iterator API */ -#include -#include - -/* Message API */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* Graph API */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* Query executor API */ -#include -#include -#include - -/* Plugin API */ -#include -#include - -/* Plugin development */ -#include +#include +#include +#include +#include /* Cancel private definitions */ #undef __BT_FUNC_STATUS_AGAIN diff --git a/include/babeltrace2/current-thread.h b/include/babeltrace2/current-thread.h deleted file mode 100644 index 39c6ae22..00000000 --- a/include/babeltrace2/current-thread.h +++ /dev/null @@ -1,102 +0,0 @@ -#ifndef BABELTRACE2_CURRENT_THREAD_H -#define BABELTRACE2_CURRENT_THREAD_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern -const bt_error *bt_current_thread_take_error(void); - -extern -void bt_current_thread_clear_error(void); - -extern -void bt_current_thread_move_error(const bt_error *error); - -typedef enum bt_current_thread_error_append_cause_status { - BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, - BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_STATUS_OK = __BT_FUNC_STATUS_OK, -} bt_current_thread_error_append_cause_status; - -extern -bt_current_thread_error_append_cause_status -bt_current_thread_error_append_cause_from_unknown( - const char *module_name, const char *file_name, - uint64_t line_no, const char *msg_fmt, ...); - -extern -bt_current_thread_error_append_cause_status -bt_current_thread_error_append_cause_from_component( - bt_self_component *self_comp, const char *file_name, - uint64_t line_no, const char *msg_fmt, ...); - -extern -bt_current_thread_error_append_cause_status -bt_current_thread_error_append_cause_from_component_class( - bt_self_component_class *self_comp_class, const char *file_name, - uint64_t line_no, const char *msg_fmt, ...); - -extern -bt_current_thread_error_append_cause_status -bt_current_thread_error_append_cause_from_message_iterator( - bt_self_message_iterator *self_iter, const char *file_name, - uint64_t line_no, const char *msg_fmt, ...); - -#define BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_FROM_UNKNOWN(_module_name, _msg_fmt, ...) \ - bt_current_thread_error_append_cause_from_unknown( \ - (_module_name), __FILE__, __LINE__, (_msg_fmt), ##__VA_ARGS__) - -#define BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_FROM_COMPONENT(_self_comp, _msg_fmt, ...) \ - bt_current_thread_error_append_cause_from_component( \ - (_self_comp), __FILE__, __LINE__, (_msg_fmt), ##__VA_ARGS__) - -#define BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_FROM_COMPONENT_CLASS(_self_cc, _msg_fmt, ...) \ - bt_current_thread_error_append_cause_from_component_class( \ - (_self_cc), __FILE__, __LINE__, (_msg_fmt), ##__VA_ARGS__) - -#define BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_FROM_MESSAGE_ITERATOR(_self_iter, _msg_fmt, ...) \ - bt_current_thread_error_append_cause_from_message_iterator( \ - (_self_iter), __FILE__, __LINE__, (_msg_fmt), ##__VA_ARGS__) - -#define BT_CURRENT_THREAD_MOVE_ERROR_AND_RESET(_var) \ - do { \ - bt_current_thread_move_error(_var); \ - (_var) = NULL; \ - } while (0) - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_CURRENT_THREAD_H */ diff --git a/include/babeltrace2/error-cause-const.h b/include/babeltrace2/error-cause-const.h deleted file mode 100644 index 004741fc..00000000 --- a/include/babeltrace2/error-cause-const.h +++ /dev/null @@ -1,117 +0,0 @@ -#ifndef BABELTRACE2_ERROR_CAUSE_CONST_H -#define BABELTRACE2_ERROR_CAUSE_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include -#include - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum bt_error_cause_actor_type { - BT_ERROR_CAUSE_ACTOR_TYPE_UNKNOWN = 1 << 0, - BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT = 1 << 1, - BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT_CLASS = 1 << 2, - BT_ERROR_CAUSE_ACTOR_TYPE_MESSAGE_ITERATOR = 1 << 3, -} bt_error_cause_actor_type; - -extern -bt_error_cause_actor_type bt_error_cause_get_actor_type( - const bt_error_cause *cause); - -extern -const char *bt_error_cause_get_message(const bt_error_cause *cause); - -extern -const char *bt_error_cause_get_module_name(const bt_error_cause *cause); - -extern -const char *bt_error_cause_get_file_name(const bt_error_cause *cause); - -extern -uint64_t bt_error_cause_get_line_number(const bt_error_cause *cause); - -extern -const char *bt_error_cause_component_actor_get_component_name( - const bt_error_cause *cause); - -extern -bt_component_class_type bt_error_cause_component_actor_get_component_class_type( - const bt_error_cause *cause); - -extern -const char *bt_error_cause_component_actor_get_component_class_name( - const bt_error_cause *cause); - -extern -const char *bt_error_cause_component_actor_get_plugin_name( - const bt_error_cause *cause); - -extern -bt_component_class_type -bt_error_cause_component_class_actor_get_component_class_type( - const bt_error_cause *cause); - -extern -const char *bt_error_cause_component_class_actor_get_component_class_name( - const bt_error_cause *cause); - -extern -const char *bt_error_cause_component_class_actor_get_plugin_name( - const bt_error_cause *cause); - -extern -const char *bt_error_cause_message_iterator_actor_get_component_name( - const bt_error_cause *cause); - -extern -const char *bt_error_cause_message_iterator_actor_get_component_output_port_name( - const bt_error_cause *cause); - -extern -bt_component_class_type -bt_error_cause_message_iterator_actor_get_component_class_type( - const bt_error_cause *cause); - -extern -const char *bt_error_cause_message_iterator_actor_get_component_class_name( - const bt_error_cause *cause); - -extern -const char *bt_error_cause_message_iterator_actor_get_plugin_name( - const bt_error_cause *cause); - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_ERROR_CAUSE_CONST_H */ diff --git a/include/babeltrace2/error-const.h b/include/babeltrace2/error-const.h deleted file mode 100644 index 8f09b4b7..00000000 --- a/include/babeltrace2/error-const.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef BABELTRACE2_ERROR_CONST_H -#define BABELTRACE2_ERROR_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern -uint64_t bt_error_get_cause_count(const bt_error *error); - -extern -const bt_error_cause *bt_error_borrow_cause_by_index( - const bt_error *error, uint64_t index); - -extern -void bt_error_release(const bt_error *error); - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_ERROR_CONST_H */ diff --git a/include/babeltrace2/error-reporting.h b/include/babeltrace2/error-reporting.h new file mode 100644 index 00000000..8539ddf8 --- /dev/null +++ b/include/babeltrace2/error-reporting.h @@ -0,0 +1,1471 @@ +#ifndef BABELTRACE2_ERROR_REPORTING_H +#define BABELTRACE2_ERROR_REPORTING_H + +/* + * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef __BT_IN_BABELTRACE_H +# error "Please include instead." +#endif + +#include + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*! +@defgroup api-error Error reporting + +@brief + Error reporting functions and macros. + +This module contains functions and macros to report rich errors from a +user function (a \bt_comp_cls method, a +\ref api-qexec "query operation", or a trace processing \bt_graph +listener, for example) to any function caller. + +Because \bt_name orchestrates pieces written by different authors, +it is important that an error which occurs deep into the function call +stack can percolate up to its callers. + +The very basic mechanism to report an error from a function is to +\ref api-fund-func-status "return an error status" +(a status code enumerator which contains the word +\c ERROR): each function caller can clean its own context and return an +error status code itself until one caller "catches" the status code and +reacts to it. For example, the reaction can be to show an error message +to the end user. + +This error reporting API adds a layer so that each function which +returns an error status code can append a message which describes the +cause of the error within the function's context. + +Functions append error causes to the current thread's error. Having one +error object per thread makes this API thread-safe. + +Here's a visual, step-by-step example: + +@image html error-reporting-steps-1234.png + +-# The trace processing \bt_graph user calls bt_graph_run(). + +-# bt_graph_run() calls the + \ref api-comp-cls-dev-meth-consume "consuming method" of the + \bt_sink_comp. + +-# The sink \bt_comp calls bt_message_iterator_next() on its upstream + source \bt_msg_iter. + +-# bt_message_iterator_next() calls the source message iterator's + \link api-msg-iter-cls-meth-next "next" method\endlink. + +@image html error-reporting-step-5.png + +

      +
    1. + An error occurs within the "next" method of the source message + iterator: the function cannot read a file because permission was + denied. +
    + +@image html error-reporting-step-6.png + +
      +
    1. + The source message iterator's "next" method appends the error + cause "Cannot read file /some/file: permission denied" + and returns + #BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_ERROR. +
    + +@image html error-reporting-step-7.png + +
      +
    1. + bt_message_iterator_next() appends + the error cause "Message iterator's 'next' method failed" + with details about the source component and + returns #BT_MESSAGE_ITERATOR_NEXT_STATUS_ERROR. +
    + +@image html error-reporting-steps-89.png + +
      +
    1. + The sink component's "consume" method appends the error + cause "Cannot consume upstream message iterator's messages" + and returns #BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_ERROR. + +
    2. + bt_graph_run() appends the error cause "Component's 'consume' + method failed" with details about the sink component and + returns #BT_GRAPH_RUN_STATUS_ERROR. +
    + +At this point, the current thread's error contains four causes: + +- "Cannot read file /some/file: permission denied" +- "Message iterator's 'next' method failed" +- "Cannot consume upstream message iterator's messages" +- "Component's 'consume' method failed" + +This list of error causes is much richer for the end user than dealing +only with #BT_GRAPH_RUN_STATUS_ERROR (the last error status code). + +Both error (#bt_error) and error cause (#bt_error_cause) objects are +\ref api-fund-unique-object "unique objects": + +- An error belongs to either + the library or you (see \ref api-error-handle "Handle an error"). + +- An error cause belongs to the error which contains it. + +

    \anchor api-error-append-cause Append an error cause

    + +When your function returns an error status code, use one of the +bt_current_thread_error_append_cause_from_*() +functions or BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_FROM_*() +macros to append an error cause to the +current thread's error. Use the appropriate function or macro +depending on your function's actor amongst: + +
    +
    Component
    +
    + Append an error cause from a \bt_comp method. + + Use bt_current_thread_error_append_cause_from_component() or + BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_FROM_COMPONENT(). +
    + +
    Message iterator
    +
    + Append an error cause from a \bt_msg_iter method. + + Use bt_current_thread_error_append_cause_from_message_iterator() or + BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_FROM_MESSAGE_ITERATOR(). +
    + +
    Component class
    +
    + Append an error cause from a \bt_comp_cls method + ("query" method). + + Use bt_current_thread_error_append_cause_from_component_class() or + BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_FROM_COMPONENT_CLASS(). +
    + +
    Unknown
    +
    + Append an error cause from any other function, for example + a \bt_graph listener or a function of your user application). + + Use bt_current_thread_error_append_cause_from_unknown() or + BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_FROM_UNKNOWN(). +
    +
    + +The BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_FROM_*() macros +uses \c __FILE__ and \c __LINE__ as the file name and line number +parameters of their corresponding +bt_current_thread_error_append_cause_from_*() function. + +

    \anchor api-error-handle Handle an error

    + +If any libbabeltrace2 function you call returns an error status code, do +one of: + +- Return an error status code too. + + In that case, you \em can + \ref api-error-append-cause "append an error cause" to the current + thread's error. + +- \em Take the current thread's error with + bt_current_thread_take_error(). + + This function moves the ownership of the error object from the library + to you. + + At this point, you can inspect its causes with + bt_error_get_cause_count() and bt_error_borrow_cause_by_index(), and + then do one of: + + - Call bt_error_release() to free the error object. + + In
    object-oriented programming + terms, this corresponds to catching an exception and discarding it. + + - Call bt_current_thread_move_error() to move back the error object's + ownership to the library. + + In object-oriented programming terms, this corresponds to catching + an exception and rethrowing it. + +bt_current_thread_clear_error() is a helper which is the equivalent of: + +@code +bt_error_release(bt_current_thread_take_error()); +@endcode + +

    Error cause

    + +All error causes have the type #bt_error_cause. + +There are four types of error cause actors: + +- \bt_c_comp +- \bt_c_msg_iter +- \bt_c_comp_cls +- Unknown + +Get the type enumerator of an error cause's actor with +bt_error_cause_get_actor_type(). + +An error cause has the following common properties: + +
    +
    Message
    +
    + Description of the error cause. + + Use bt_error_cause_get_message(). +
    + +
    Module name
    +
    + Name of the module causing the error. + + For example, libbabeltrace2 uses "libbabeltrace2" and the \bt_cli + CLI tool uses "Babeltrace CLI". + + Use bt_error_cause_get_module_name(). +
    + +
    File name
    +
    + Name of the source file causing the error. + + Use bt_error_cause_get_file_name(). +
    + +
    Line number
    +
    + Line number of the statement causing the error. + + Use bt_error_cause_get_line_number(). +
    +
    + +

    Error cause with a component actor

    + +An error cause with a \bt_comp actor has the following specific +properties: + +
    +
    Component name
    +
    + Name of the component. + + Use bt_error_cause_component_actor_get_component_name(). +
    + +
    Component class name
    +
    + Name of the component's \ref api-comp-cls "class". + + Use bt_error_cause_component_actor_get_component_class_type(). +
    + +
    Component class type
    +
    + Type of the component's class. + + Use bt_error_cause_component_actor_get_component_class_name(). +
    + +
    \bt_dt_opt Plugin name
    +
    + Name of the \bt_plugin which provides the component's class, if any. + + Use bt_error_cause_component_actor_get_plugin_name(). +
    +
    + +

    Error cause with a message iterator actor

    + +An error cause with a \bt_msg_iter actor has the following specific +properties: + +
    +
    Component output port name
    +
    + Name of the \bt_comp \bt_oport from which the message iterator + was created. + + Use bt_error_cause_component_actor_get_component_name(). +
    + +
    Component name
    +
    + Name of the component. + + Use bt_error_cause_component_actor_get_component_name(). +
    + + bt_error_cause_message_iterator_actor_get_component_output_port_name + +
    Component class name
    +
    + Name of the component's \ref api-comp-cls "class". + + Use bt_error_cause_component_actor_get_component_class_type(). +
    + +
    Component class type
    +
    + Type of the component's class. + + Use bt_error_cause_component_actor_get_component_class_name(). +
    + +
    \bt_dt_opt Plugin name
    +
    + Name of the \bt_plugin which provides the component's class, if any. + + Use bt_error_cause_component_actor_get_plugin_name(). +
    +
    + +

    Error cause with a component class actor

    + +An error cause with a \bt_comp_cls actor has the following specific +properties: + +
    +
    Component class name
    +
    + Name of the component class. + + Use bt_error_cause_component_class_actor_get_component_class_type(). +
    + +
    Component class type
    +
    + Type of the component class. + + Use bt_error_cause_component_class_actor_get_component_class_name(). +
    + +
    \bt_dt_opt Plugin name
    +
    + Name of the \bt_plugin which provides the component class, if any. + + Use bt_error_cause_component_class_actor_get_plugin_name(). +
    +
    +*/ + +/*! @{ */ + +/*! +@name Types +@{ + +@typedef struct bt_error bt_error; + +@brief + Error. + + +@typedef struct bt_error_cause bt_error_cause; + +@brief + Error cause. + +@} +*/ + +/*! +@name Current thread's error +@{ +*/ + +/*! +@brief + \em Takes the current thread's error, that is, moves its ownership + from the library to the caller. + +This function can return \c NULL if the current thread has no error. + +Once you are done with the returned error, do one of: + +- Call bt_error_release() to free the error object. + + In object-oriented programming + terms, this corresponds to catching an exception and discarding it. + +- Call bt_current_thread_move_error() to move back the error object's + ownership to the library. + + In object-oriented programming terms, this corresponds to catching + an exception and rethrowing it. + +@returns + Unique reference of the current thread's error, or \c NULL if the + current thread has no error. + +@post + If this function does not return NULL, + the caller owns the returned error. + +@sa bt_error_release() — + Releases (frees) an error. +@sa bt_current_thread_move_error() — + Moves an error's ownership to the library. +*/ +extern +const bt_error *bt_current_thread_take_error(void); + +/*! +@brief + Moves the ownership of the error \bt_p{error} from the caller to + the library. + +After you call this function, you don't own \bt_p{error} anymore. + +In object-oriented programming +terms, calling this function corresponds to catching an +exception and rethrowing it. + +You can instead release (free) the error with bt_error_release(), which, +in object-oriented programming terms, +corresponds to catching an exception and discarding it. + +@param[in] error + Error of which to move the ownership from you to the library. + +@bt_pre_not_null{error} +@pre + The caller owns \bt_p{error}. + +@post + The library owns \bt_p{error}. + +@sa bt_error_release() — + Releases (frees) an error. +@sa BT_CURRENT_THREAD_MOVE_ERROR_AND_RESET() — + Calls this function and assigns \c NULL to the expression. +*/ +extern +void bt_current_thread_move_error(const bt_error *error); + +/*! +@brief + Moves the ownership of the error \bt_p{_error} from the caller to + the library, and then sets \bt_p{_error} to \c NULL. + +@param[in] _error + Error of which to move the ownership from you to the library. + +@bt_pre_not_null{_error} +@bt_pre_assign_expr{_error} +@pre + The caller owns \bt_p{_error}. + +@post + The library owns \bt_p{_error}. + +@sa bt_current_thread_move_error() — + Moves an error's ownership to the library. +*/ +#define BT_CURRENT_THREAD_MOVE_ERROR_AND_RESET(_error) \ + do { \ + bt_current_thread_move_error(_error); \ + (_error) = NULL; \ + } while (0) + +/*! +@brief + Releases the current thread's error, if any. + +This function is equivalent to: + +@code +bt_error_release(bt_current_thread_take_error()); +@endcode + +@post + The current thread has no error. + +@sa bt_error_release() — + Releases (frees) an error. +@sa bt_current_thread_take_error — + Takes the current thread's error, moving its ownership from the + library to the caller. +*/ +extern +void bt_current_thread_clear_error(void); + +/*! @} */ + +/*! +@name Error cause appending +@{ +*/ + +/*! +@brief + Status codes for the + bt_current_thread_error_append_cause_from_*() + functions. +*/ +typedef enum bt_current_thread_error_append_cause_status { + /*! + @brief + Success. + */ + BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, +} bt_current_thread_error_append_cause_status; + +/*! +@brief + Appends an error cause to the current thread's error from a + \bt_comp method. + +This this a printf()-like function starting from the +format string parameter \bt_p{message_format}. + +On success, the appended error cause's module name +(see bt_error_cause_get_module_name()) is: + +@code{.unparsed} +NAME: CC-TYPE.PLUGIN-NAME.CC-NAME +@endcode + +or + +@code{.unparsed} +NAME: CC-TYPE.CC-NAME +@endcode + +if no \bt_plugin provides the class of \bt_p{self_component}, with: + +
    +
    \c NAME
    +
    Name of \bt_p{self_component}.
    + +
    \c CC-TYPE
    +
    + Type of the \ref api-comp-cls "class" of \bt_p{self_component} + (\c src, \c flt, or \c sink). +
    + +
    \c PLUGIN-NAME
    +
    + Name of the plugin which provides the class of + \bt_p{self_component}. +
    + +
    \c CC-NAME
    +
    Name of the class of \bt_p{self_component}.
    +
    + +@param[in] self_component + Self component of the appending method. +@param[in] file_name + Name of the source file containing the method which appends the + error cause. +@param[in] line_number + Line number of the statement which appends the error cause. +@param[in] message_format + Format string which specifies how the function converts the + subsequent arguments (like printf()). + +@retval #BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_STATUS_OK + Success. +@retval #BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{self_component} +@bt_pre_not_null{file_name} +@bt_pre_not_null{message_format} +@bt_pre_valid_fmt{message_format} + +@post + On success, the number of error causes in the + current thread's error is incremented. + +@sa BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_FROM_COMPONENT() — + Calls this function with \c __FILE__ and \c __LINE__ as the + \bt_p{file_name} and \bt_p{line_number} parameters. +*/ +extern +bt_current_thread_error_append_cause_status +bt_current_thread_error_append_cause_from_component( + bt_self_component *self_component, const char *file_name, + uint64_t line_number, const char *message_format, ...); + +/*! +@brief + Appends an error cause to the current thread's error from a + \bt_comp method using \c __FILE__ and \c __LINE__ as the source + file name and line number. + +This macro calls bt_current_thread_error_append_cause_from_component() +with \c __FILE__ and \c __LINE__ as its +\bt_p{file_name} and \bt_p{line_number} parameters. +*/ +#define BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_FROM_COMPONENT(_self_component, _message_format, ...) \ + bt_current_thread_error_append_cause_from_component( \ + (_self_component), __FILE__, __LINE__, (_message_format), ##__VA_ARGS__) + +/*! +@brief + Appends an error cause to the current thread's error from a + \bt_msg_iter method. + +This this a printf()-like function starting from the +format string parameter \bt_p{message_format}. + +On success, the appended error cause's module name +(see bt_error_cause_get_module_name()) is: + +@code{.unparsed} +COMP-NAME (OUT-PORT-NAME): CC-TYPE.PLUGIN-NAME.CC-NAME +@endcode + +or + +@code{.unparsed} +COMP-NAME (OUT-PORT-NAME): CC-TYPE.CC-NAME +@endcode + +if no \bt_plugin provides the component class of +\bt_p{self_message_iterator}, with: + +
    +
    \c COMP-NAME
    +
    Name of the \bt_comp of \bt_p{self_message_iterator}.
    + +
    \c OUT-PORT-NAME
    +
    + Name of the \bt_oport from which \bt_p{self_message_iterator}. + was created. +
    + +
    \c CC-TYPE
    +
    + Type of the \bt_comp_cls of \bt_p{self_message_iterator} + (\c src, \c flt, or \c sink). +
    + +
    \c PLUGIN-NAME
    +
    + Name of the plugin which provides the component class of + \bt_p{self_message_iterator}. +
    + +
    \c CC-NAME
    +
    Name of the component class of \bt_p{self_message_iterator}.
    +
    + +@param[in] self_message_iterator + Self message iterator of the appending method. +@param[in] file_name + Name of the source file containing the method which appends the + error cause. +@param[in] line_number + Line number of the statement which appends the error cause. +@param[in] message_format + Format string which specifies how the function converts the + subsequent arguments (like printf()). + +@retval #BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_STATUS_OK + Success. +@retval #BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{self_message_iterator} +@bt_pre_not_null{file_name} +@bt_pre_not_null{message_format} +@bt_pre_valid_fmt{message_format} + +@post + On success, the number of error causes in the + current thread's error is incremented. + +@sa BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_FROM_MESSAGE_ITERATOR() — + Calls this function with \c __FILE__ and \c __LINE__ as the + \bt_p{file_name} and \bt_p{line_number} parameters. +*/ +extern +bt_current_thread_error_append_cause_status +bt_current_thread_error_append_cause_from_message_iterator( + bt_self_message_iterator *self_message_iterator, + const char *file_name, uint64_t line_number, + const char *message_format, ...); + +/*! +@brief + Appends an error cause to the current thread's error from a + \bt_msg_iter method using \c __FILE__ and \c __LINE__ as the source file + name and line number. + +This macro calls +bt_current_thread_error_append_cause_from_message_iterator() with +\c __FILE__ and \c __LINE__ as its +\bt_p{file_name} and \bt_p{line_number} parameters. +*/ +#define BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_FROM_MESSAGE_ITERATOR(_self_message_iterator, _message_format, ...) \ + bt_current_thread_error_append_cause_from_message_iterator( \ + (_self_message_iterator), __FILE__, __LINE__, (_message_format), ##__VA_ARGS__) + +/*! +@brief + Appends an error cause to the current thread's error from a + \bt_comp_cls method. + +This this a printf()-like function starting from the +format string parameter \bt_p{message_format}. + +As of \bt_name_version_min_maj, the only component class method is the +\ref api-qexec "query" method. + +On success, the appended error cause's module name +(see bt_error_cause_get_module_name()) is: + +@code{.unparsed} +CC-TYPE.PLUGIN-NAME.CC-NAME +@endcode + +or + +@code{.unparsed} +CC-TYPE.CC-NAME +@endcode + +if no \bt_plugin provides \bt_p{self_component_class}, with: + +
    +
    \c CC-TYPE
    +
    + Type of \bt_p{self_component_class} (\c src, \c flt, or \c sink). +
    + +
    \c PLUGIN-NAME
    +
    + Name of the plugin which provides \bt_p{self_component_class}. +
    + +
    \c CC-NAME
    +
    Name of \bt_p{self_component_class}.
    +
    + +@param[in] self_component_class + Self component class of the appending method. +@param[in] file_name + Name of the source file containing the method which appends the + error cause. +@param[in] line_number + Line number of the statement which appends the error cause. +@param[in] message_format + Format string which specifies how the function converts the + subsequent arguments (like printf()). + +@retval #BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_STATUS_OK + Success. +@retval #BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{self_component_class} +@bt_pre_not_null{file_name} +@bt_pre_not_null{message_format} +@bt_pre_valid_fmt{message_format} + +@post + On success, the number of error causes in the + current thread's error is incremented. + +@sa BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_FROM_COMPONENT_CLASS() — + Calls this function with \c __FILE__ and \c __LINE__ as the + \bt_p{file_name} and \bt_p{line_number} parameters. +*/ +extern +bt_current_thread_error_append_cause_status +bt_current_thread_error_append_cause_from_component_class( + bt_self_component_class *self_component_class, + const char *file_name, uint64_t line_number, + const char *message_format, ...); + +/*! +@brief + Appends an error cause to the current thread's error from a + component class method using \c __FILE__ and \c __LINE__ as the + source file name and line number. + +This macro calls +bt_current_thread_error_append_cause_from_component_class() +with \c __FILE__ and \c __LINE__ as its +\bt_p{file_name} and \bt_p{line_number} parameters. +*/ +#define BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_FROM_COMPONENT_CLASS(_self_component_class, _message_format, ...) \ + bt_current_thread_error_append_cause_from_component_class( \ + (_self_component_class), __FILE__, __LINE__, (_message_format), ##__VA_ARGS__) + +/*! +@brief + Appends an error cause to the current thread's error from any + function. + +Use this function when you cannot use +bt_current_thread_error_append_cause_from_component(), +bt_current_thread_error_append_cause_from_message_iterator(), +or bt_current_thread_error_append_cause_from_component_class(). + +This this a printf()-like function starting from the +format string parameter \bt_p{message_format}. + +@param[in] module_name + Module name of the error cause to append. +@param[in] file_name + Name of the source file containing the method which appends the + error cause. +@param[in] line_number + Line number of the statement which appends the error cause. +@param[in] message_format + Format string which specifies how the function converts the + subsequent arguments (like printf()). + +@retval #BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_STATUS_OK + Success. +@retval #BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{module_name} +@bt_pre_not_null{file_name} +@bt_pre_not_null{message_format} +@bt_pre_valid_fmt{message_format} + +@post + On success, the number of error causes in the + current thread's error is incremented. + +@sa BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_FROM_UNKNOWN() — + Calls this function with \c __FILE__ and \c __LINE__ as the + \bt_p{file_name} and \bt_p{line_number} parameters. +*/ +extern +bt_current_thread_error_append_cause_status +bt_current_thread_error_append_cause_from_unknown( + const char *module_name, const char *file_name, + uint64_t line_number, const char *message_format, ...); + +/*! +@brief + Appends an error cause to the current thread's error from any + function using \c __FILE__ and \c __LINE__ as the source + file name and line number. + +Use this function when you cannot use +BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_FROM_COMPONENT(), +BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_FROM_MESSAGE_ITERATOR(), +or BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_FROM_COMPONENT_CLASS(). + +This macro calls bt_current_thread_error_append_cause_from_unknown() +with \c __FILE__ and \c __LINE__ as its +\bt_p{file_name} and \bt_p{line_number} parameters. +*/ +#define BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_FROM_UNKNOWN(_module_name, _message_format, ...) \ + bt_current_thread_error_append_cause_from_unknown( \ + (_module_name), __FILE__, __LINE__, (_message_format), ##__VA_ARGS__) + +/*! @} */ + +/*! +@name Error +@{ +*/ + +/*! +@brief + Returns the number of error causes contained in the error + \bt_p{error}. + +@param[in] error + Error of which to get the number of contained error causes. + +@returns + Number of contained error causes in \bt_p{error}. + +@bt_pre_not_null{error} +*/ +extern +uint64_t bt_error_get_cause_count(const bt_error *error); + +/*! +@brief + Borrows the error cause at index \bt_p{index} from the + error \bt_p{error}. + +@param[in] error + Error from which to borrow the error cause at index \bt_p{index}. +@param[in] index + Index of the error cause to borrow from \bt_p{error}. + +@returns + @parblock + \em Borrowed reference of the error cause of + \bt_p{error} at index \bt_p{index}. + + The returned pointer remains valid until \bt_p{error} is modified. + @endparblock + +@bt_pre_not_null{error} +@pre + \bt_p{index} is less than the number of error causes in + \bt_p{error} (as returned by bt_error_get_cause_count()). +*/ +extern +const bt_error_cause *bt_error_borrow_cause_by_index( + const bt_error *error, uint64_t index); + +/*! +@brief + Releases (frees) the error \bt_p{error}. + +After you call this function, \bt_p{error} does not exist. + +Take the current thread's error with bt_current_thread_take_error(). + +In object-oriented programming +terms, calling this function corresponds to catching an +exception and discarding it. + +You can instead move the ownership of \bt_p{error} to the library with +bt_current_thread_move_error(), which, +in object-oriented programming terms, +corresponds to catching an exception and rethrowing it. + +@param[in] error + Error to release (free). + +@bt_pre_not_null{error} + +@post + \bt_p{error} does not exist. + +@sa bt_current_thread_move_error() — + Moves an error's ownership to the library. +*/ +extern +void bt_error_release(const bt_error *error); + +/*! @} */ + +/*! +@name Error cause: common +@{ +*/ + +/*! +@brief + Error cause actor type enumerators. +*/ +typedef enum bt_error_cause_actor_type { + /*! + @brief + Any function. + */ + BT_ERROR_CAUSE_ACTOR_TYPE_UNKNOWN = 1 << 0, + + /*! + @brief + Component method. + */ + BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT = 1 << 1, + + /*! + @brief + Component class method. + */ + BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT_CLASS = 1 << 2, + + /*! + @brief + Message iterator method. + */ + BT_ERROR_CAUSE_ACTOR_TYPE_MESSAGE_ITERATOR = 1 << 3, +} bt_error_cause_actor_type; + +/*! +@brief + Returns the actor type enumerator of the error cause + \bt_p{error_cause}. + +@param[in] error_cause + Error cause of which to get the actor type enumerator. + +@returns + Actor type enumerator of \bt_p{error_cause}. + +@bt_pre_not_null{error_cause} +*/ +extern +bt_error_cause_actor_type bt_error_cause_get_actor_type( + const bt_error_cause *error_cause); + +/*! +@brief + Returns the message of the error cause \bt_p{error_cause}. + +@param[in] error_cause + Error cause of which to get the message. + +@returns + @parblock + Message of \bt_p{error_cause}. + + The returned pointer remains valid as long as the error which + contains \bt_p{error_cause} exists. + @endparblock + +@bt_pre_not_null{error_cause} +*/ +extern +const char *bt_error_cause_get_message(const bt_error_cause *error_cause); + +/*! +@brief + Returns the module name of the error cause \bt_p{error_cause}. + +@param[in] error_cause + Error cause of which to get the module name. + +@returns + @parblock + Module name of \bt_p{error_cause}. + + The returned pointer remains valid as long as the error which + contains \bt_p{error_cause} exists. + @endparblock + +@bt_pre_not_null{error_cause} +*/ +extern +const char *bt_error_cause_get_module_name(const bt_error_cause *error_cause); + +/*! +@brief + Returns the name of the source file which contains the function + which appended the error cause \bt_p{error_cause} to the + current thread's error. + +@param[in] error_cause + Error cause of which to get the source file name. + +@returns + @parblock + Source file name of \bt_p{error_cause}. + + The returned pointer remains valid as long as the error which + contains \bt_p{error_cause} exists. + @endparblock + +@bt_pre_not_null{error_cause} +*/ +extern +const char *bt_error_cause_get_file_name(const bt_error_cause *error_cause); + +/*! +@brief + Returns the line number of the statement + which appended the error cause \bt_p{error_cause} to the + current thread's error. + +@param[in] error_cause + Error cause of which to get the source statement's line number. + +@returns + Source statement's line number of \bt_p{error_cause}. + +@bt_pre_not_null{error_cause} +*/ +extern +uint64_t bt_error_cause_get_line_number(const bt_error_cause *error_cause); + +/*! @} */ + +/*! +@name Error cause with a component actor +@{ +*/ + +/*! +@brief + Returns the name of the \bt_comp of which a method + appended the error cause \bt_p{error_cause} to the current + thread's error. + +@param[in] error_cause + Error cause of which to get the component name. + +@returns + @parblock + Component name of \bt_p{error_cause}. + + The returned pointer remains valid as long as the error which + contains \bt_p{error_cause} exists. + @endparblock + +@bt_pre_not_null{error_cause} +@pre + The actor type of \bt_p{error_cause} is + #BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT. +*/ +extern +const char *bt_error_cause_component_actor_get_component_name( + const bt_error_cause *error_cause); + +/*! +@brief + Returns the \ref api-comp-cls "class" type of the + \bt_comp of which a method appended the error cause + \bt_p{error_cause} to the current thread's error. + +@param[in] error_cause + Error cause of which to get the component class type. + +@returns + Component class type of \bt_p{error_cause}. + +@bt_pre_not_null{error_cause} +@pre + The actor type of \bt_p{error_cause} is + #BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT. +*/ +extern +bt_component_class_type bt_error_cause_component_actor_get_component_class_type( + const bt_error_cause *error_cause); + +/*! +@brief + Returns the \ref api-comp-cls "class" name of the + \bt_comp of which a method appended the error cause + \bt_p{error_cause} to the current thread's error. + +@param[in] error_cause + Error cause of which to get the component class name. + +@returns + @parblock + Component class name of \bt_p{error_cause}. + + The returned pointer remains valid as long as the error which + contains \bt_p{error_cause} exists. + @endparblock + +@bt_pre_not_null{error_cause} +@pre + The actor type of \bt_p{error_cause} is + #BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT. +*/ +extern +const char *bt_error_cause_component_actor_get_component_class_name( + const bt_error_cause *error_cause); + +/*! +@brief + Returns the name of the \bt_plugin which provides the + \ref api-comp-cls "class" of the \bt_comp of which a method + appended the error cause \bt_p{error_cause} to the + current thread's error. + +This function returns \c NULL if no plugin provides the error cause's +component class. + +@param[in] error_cause + Error cause of which to get the plugin name. + +@returns + @parblock + Plugin name of \bt_p{error_cause}, or \c NULL if no plugin + provides the component class of \bt_p{error_cause}. + + The returned pointer remains valid as long as the error which + contains \bt_p{error_cause} exists. + @endparblock + +@bt_pre_not_null{error_cause} +@pre + The actor type of \bt_p{error_cause} is + #BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT. +*/ +extern +const char *bt_error_cause_component_actor_get_plugin_name( + const bt_error_cause *error_cause); + +/*! @} */ + +/*! +@name Error cause with a message iterator actor +@{ +*/ + +/*! +@brief + Returns the name of the \bt_oport from which was created + the message iterator of which the method + appended the error cause \bt_p{error_cause} to the current + thread's error. + +@param[in] error_cause + Error cause of which to get the output port name. + +@returns + @parblock + Output port name of \bt_p{error_cause}. + + The returned pointer remains valid as long as the error which + contains \bt_p{error_cause} exists. + @endparblock + +@bt_pre_not_null{error_cause} +@pre + The actor type of \bt_p{error_cause} is + #BT_ERROR_CAUSE_ACTOR_TYPE_MESSAGE_ITERATOR. +*/ +extern +const char *bt_error_cause_message_iterator_actor_get_component_output_port_name( + const bt_error_cause *error_cause); + +/*! +@brief + Returns the name of the \bt_comp of which a message iterator method + appended the error cause \bt_p{error_cause} to the current + thread's error. + +@param[in] error_cause + Error cause of which to get the component name. + +@returns + @parblock + Component name of \bt_p{error_cause}. + + The returned pointer remains valid as long as the error which + contains \bt_p{error_cause} exists. + @endparblock + +@bt_pre_not_null{error_cause} +@pre + The actor type of \bt_p{error_cause} is + #BT_ERROR_CAUSE_ACTOR_TYPE_MESSAGE_ITERATOR. +*/ +extern +const char *bt_error_cause_message_iterator_actor_get_component_name( + const bt_error_cause *error_cause); + +/*! +@brief + Returns the \ref api-comp-cls "class" type of the + \bt_comp of which a message iterator method appended the error cause + \bt_p{error_cause} to the current thread's error. + +@param[in] error_cause + Error cause of which to get the component class type. + +@returns + Component class type of \bt_p{error_cause}. + +@bt_pre_not_null{error_cause} +@pre + The actor type of \bt_p{error_cause} is + #BT_ERROR_CAUSE_ACTOR_TYPE_MESSAGE_ITERATOR. +*/ +extern +bt_component_class_type +bt_error_cause_message_iterator_actor_get_component_class_type( + const bt_error_cause *error_cause); + +/*! +@brief + Returns the \ref api-comp-cls "class" name of the + \bt_comp of which a message iterator method appended the error cause + \bt_p{error_cause} to the current thread's error. + +@param[in] error_cause + Error cause of which to get the component class name. + +@returns + @parblock + Component class name of \bt_p{error_cause}. + + The returned pointer remains valid as long as the error which + contains \bt_p{error_cause} exists. + @endparblock + +@bt_pre_not_null{error_cause} +@pre + The actor type of \bt_p{error_cause} is + #BT_ERROR_CAUSE_ACTOR_TYPE_MESSAGE_ITERATOR. +*/ +extern +const char *bt_error_cause_message_iterator_actor_get_component_class_name( + const bt_error_cause *error_cause); + +/*! +@brief + Returns the name of the \bt_plugin which provides the + \ref api-comp-cls "class" of the \bt_comp of which a + message iterator method + appended the error cause \bt_p{error_cause} to the + current thread's error. + +This function returns \c NULL if no plugin provides the error cause's +component class. + +@param[in] error_cause + Error cause of which to get the plugin name. + +@returns + @parblock + Plugin name of \bt_p{error_cause}, or \c NULL if no plugin + provides the component class of \bt_p{error_cause}. + + The returned pointer remains valid as long as the error which + contains \bt_p{error_cause} exists. + @endparblock + +@bt_pre_not_null{error_cause} +@pre + The actor type of \bt_p{error_cause} is + #BT_ERROR_CAUSE_ACTOR_TYPE_MESSAGE_ITERATOR. +*/ +extern +const char *bt_error_cause_message_iterator_actor_get_plugin_name( + const bt_error_cause *error_cause); + +/*! @} */ + +/*! +@name Error cause with a component class actor +@{ +*/ + +/*! +@brief + Returns the name of the \bt_comp_cls + of which a method appended the error cause + \bt_p{error_cause} to the current thread's error. + +@param[in] error_cause + Error cause of which to get the component class name. + +@returns + Component class name of \bt_p{error_cause}. + +@bt_pre_not_null{error_cause} +@pre + The actor type of \bt_p{error_cause} is + #BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT_CLASS. +*/ +extern +bt_component_class_type +bt_error_cause_component_class_actor_get_component_class_type( + const bt_error_cause *error_cause); + +/*! +@brief + Returns the name of the \bt_comp_cls + of which a method appended the error cause + \bt_p{error_cause} to the current thread's error. + +@param[in] error_cause + Error cause of which to get the component class name. + +@returns + @parblock + Component class name of \bt_p{error_cause}. + + The returned pointer remains valid as long as the error which + contains \bt_p{error_cause} exists. + @endparblock + +@bt_pre_not_null{error_cause} +@pre + The actor type of \bt_p{error_cause} is + #BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT_CLASS. +*/ +extern +const char *bt_error_cause_component_class_actor_get_component_class_name( + const bt_error_cause *error_cause); + +/*! +@brief + Returns the name of the \bt_plugin which provides the + \bt_comp_cls of which a method + appended the error cause \bt_p{error_cause} to the + current thread's error. + +This function returns \c NULL if no plugin provides the error cause's +component class. + +@param[in] error_cause + Error cause of which to get the plugin name. + +@returns + @parblock + Plugin name of \bt_p{error_cause}, or \c NULL if no plugin + provides the component class of \bt_p{error_cause}. + + The returned pointer remains valid as long as the error which + contains \bt_p{error_cause} exists. + @endparblock + +@bt_pre_not_null{error_cause} +@pre + The actor type of \bt_p{error_cause} is + #BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT_CLASS. +*/ +extern +const char *bt_error_cause_component_class_actor_get_plugin_name( + const bt_error_cause *error_cause); + +/*! @} */ + +/*! @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* BABELTRACE2_ERROR_REPORTING_H */ diff --git a/include/babeltrace2/graph/component-class-const.h b/include/babeltrace2/graph/component-class-const.h deleted file mode 100644 index da46d290..00000000 --- a/include/babeltrace2/graph/component-class-const.h +++ /dev/null @@ -1,101 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_COMPONENT_CLASS_CONST_H -#define BABELTRACE2_GRAPH_COMPONENT_CLASS_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum bt_component_class_type { - BT_COMPONENT_CLASS_TYPE_SOURCE = 1 << 0, - BT_COMPONENT_CLASS_TYPE_FILTER = 1 << 1, - BT_COMPONENT_CLASS_TYPE_SINK = 1 << 2, -} bt_component_class_type; - -extern const char *bt_component_class_get_name( - const bt_component_class *component_class); - -extern const char *bt_component_class_get_description( - const bt_component_class *component_class); - -extern const char *bt_component_class_get_help( - const bt_component_class *component_class); - -extern bt_component_class_type bt_component_class_get_type( - const bt_component_class *component_class); - -static inline -bt_bool bt_component_class_is_source( - const bt_component_class *component_class) -{ - return bt_component_class_get_type(component_class) == - BT_COMPONENT_CLASS_TYPE_SOURCE; -} - -static inline -bt_bool bt_component_class_is_filter( - const bt_component_class *component_class) -{ - return bt_component_class_get_type(component_class) == - BT_COMPONENT_CLASS_TYPE_FILTER; -} - -static inline -bt_bool bt_component_class_is_sink( - const bt_component_class *component_class) -{ - return bt_component_class_get_type(component_class) == - BT_COMPONENT_CLASS_TYPE_SINK; -} - -extern void bt_component_class_get_ref( - const bt_component_class *component_class); - -extern void bt_component_class_put_ref( - const bt_component_class *component_class); - -#define BT_COMPONENT_CLASS_PUT_REF_AND_RESET(_var) \ - do { \ - bt_component_class_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_COMPONENT_CLASS_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_component_class_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_COMPONENT_CLASS_CONST_H */ diff --git a/include/babeltrace2/graph/component-class-dev.h b/include/babeltrace2/graph/component-class-dev.h new file mode 100644 index 00000000..1fa60162 --- /dev/null +++ b/include/babeltrace2/graph/component-class-dev.h @@ -0,0 +1,2225 @@ +#ifndef BABELTRACE2_GRAPH_COMPONENT_CLASS_DEV_H +#define BABELTRACE2_GRAPH_COMPONENT_CLASS_DEV_H + +/* + * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef __BT_IN_BABELTRACE_H +# error "Please include instead." +#endif + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*! +@defgroup api-comp-cls-dev Component class development +@ingroup api-graph + +@brief + Component class development (creation). + +A component class is the class of a \bt_comp: + +@image html component.png + +@attention + This module (component class development API) offers functions to + programatically create component classes. To get the properties of + an existing component class, see \ref api-comp-cls. + +A component class has methods. This module essentially +offers: + +- Component class method type definitions. + +- Component class creation functions, to which you pass a mandatory + \bt_msg_iter_cls or method. + +- Functions to set optional component class methods. + +- Functions to set optional component class properties. + +A component class method is a user function. There are two types of +methods: + +
    +
    \anchor api-comp-cls-dev-instance-meth Instance method
    +
    + Operates on an instance (a \bt_comp). + + The type of the method's first parameter is + #bt_self_component_source, #bt_self_component_filter, or + bt_self_component_sink, depending on the component class's type. + + This is similar to an instance method in Python (where the instance + object name is generally self) or a member function + in C++ (where the instance pointer is named this), + for example. +
    + +
    \anchor api-comp-cls-dev-class-meth Class method
    +
    + Operates on a component class. + + The type of the method's first parameter is + #bt_self_component_class_source, #bt_self_component_class_filter, or + bt_self_component_class_sink, depending on the component class's + type. + + This is similar to a class method in Python or a static member + function in C++, for example. +
    +
    + +See \ref api-comp-cls-dev-methods "Methods" to learn more about the +different types of component class methods. + +A component class is a \ref api-fund-shared-object "shared object": see +the \ref api-comp-cls module for the reference count functions. + +Some library functions \ref api-fund-freezing "freeze" component classes +on success. The documentation of those functions indicate this +postcondition. + +Create a component class with bt_component_class_source_create(), +bt_component_class_filter_create(), and +bt_component_class_sink_create(). You must give the component class a +name (not unique in any way) at creation time. + +When you create a \bt_src_comp_cls or a \bt_flt_comp_cls, you must pass +a \bt_msg_iter_cls. This is the class of any \bt_msg_iter created for +one of the component class's instance's \bt_oport. + +When you create a \bt_sink_comp_cls, you must pass a +\ref api-comp-cls-dev-meth-consume "consuming method". + +\ref api-fund-c-typing "Upcast" the #bt_component_class_source, +#bt_component_class_filter, and bt_component_class_sink types returned +by the creation functions to the #bt_component_class type with +bt_component_class_source_as_component_class(), +bt_component_class_filter_as_component_class(), and +bt_component_class_sink_as_component_class(). + +Set the \ref api-comp-cls-prop-descr "description" and the +\ref api-comp-cls-prop-help "help text" of a component class with +bt_component_class_set_description() and +bt_component_class_set_help(). + +

    \anchor api-comp-cls-dev-methods Methods

    + +To learn when exactly the methods below are called, see +\ref api-graph-lc "Trace processing graph life cycle". + +The available component class methods to implement are: + + + + + + + + + + + +
    Name + Method type + Component class types + Requirement + Graph is \ref api-graph-lc "configured"? + C types +
    Consume + \ref api-comp-cls-dev-instance-meth "Instance" + Sink + Mandatory + Yes + #bt_component_class_sink_consume_method +
    Finalize + Instance + All + Optional + Yes + + #bt_component_class_source_finalize_method
    + #bt_component_class_filter_finalize_method
    + #bt_component_class_sink_finalize_method +
    Get supported \bt_mip (MIP) versions + \ref api-comp-cls-dev-class-meth "Class" + All + Optional + N/A + + #bt_component_class_source_get_supported_mip_versions_method
    + #bt_component_class_filter_get_supported_mip_versions_method
    + #bt_component_class_sink_get_supported_mip_versions_method +
    Graph is \ref api-graph-lc "configured" + Instance + Sink + Mandatory + Yes + #bt_component_class_sink_graph_is_configured_method +
    Initialize + Instance + All + Optional + No + + #bt_component_class_source_initialize_method
    + #bt_component_class_filter_initialize_method
    + #bt_component_class_sink_initialize_method +
    \bt_c_iport connected + Instance + Filter and sink + Optional + No + + #bt_component_class_filter_input_port_connected_method
    + #bt_component_class_sink_input_port_connected_method +
    \bt_c_oport connected + Instance + Source and filter + Optional + No + + #bt_component_class_source_output_port_connected_method
    + #bt_component_class_filter_output_port_connected_method +
    Query + Class + All + Optional + N/A + + #bt_component_class_source_query_method
    + #bt_component_class_filter_query_method
    + #bt_component_class_sink_query_method +
    + +
    +
    + \anchor api-comp-cls-dev-meth-consume + Consume +
    +
    + Called within bt_graph_run() or bt_graph_run_once() to make your + \bt_sink_comp consume and process \bt_p_msg. + + This method typically gets \em one message batch from one (or more) + upstream \bt_msg_iter. You are free to get more than one batch of + messages if needed; however, keep in mind that the \bt_name project + recommends that this method executes fast enough so as not to block + an interactive application running on the same thread. + + During what you consider to be a long, blocking operation, the + project recommends that you periodically check whether or not you + are interrupted with bt_self_component_sink_is_interrupted(). When + you are, you can return either + #BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_AGAIN or + #BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_ERROR, depending on + your capability to continue the current operation later. + + If you need to block the thread, you can instead report to + try again later to the bt_graph_run() or bt_graph_run_once() caller + by returning #BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_AGAIN. + + If your sink component is done consuming and processing, return + #BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_END from this method. + The trace processing \bt_graph can continue to run afterwards if + other sink components are still consuming. + + Within this method, you \em cannot add an \bt_iport with + bt_self_component_sink_add_input_port(). + + Set this mandatory method at sink component class creation time with + bt_component_class_sink_create(). +
    + +
    + \anchor api-comp-cls-dev-meth-fini + Finalize +
    +
    + Called to finalize your \bt_comp, that is, to let you + destroy/free/finalize any user data you have (retrieved with + bt_self_component_get_data()). + + The \bt_name library does not specify exactly when this method is + called, but guarantees that it's called before the component is + destroyed. + + For \bt_p_src_comp and \bt_p_flt_comp, the library guarantees that + this method is called \em after all the component's \bt_p_msg_iter + are finalized. + + This method is \em not called if the component's + \ref api-comp-cls-dev-meth-init "initialization method" + previously returned an error status code. + + Within this method, you cannot: + + - Add a \bt_port. + - Use any \bt_msg_iter. + + Set this optional method with + bt_component_class_source_set_finalize_method(), + bt_component_class_filter_set_finalize_method(), and + bt_component_class_sink_set_finalize_method(). +
    + +
    + \anchor api-comp-cls-dev-meth-mip + Get supported \bt_mip (MIP) versions +
    +
    + Called within bt_get_greatest_operative_mip_version() to get the + set of MIP versions that an eventual \bt_comp supports. + + This is a \ref api-comp-cls-dev-class-meth "class method" because + you can call bt_get_greatest_operative_mip_version() before you even + create a trace processing \bt_graph. + + In this method, you receive initialization parameters as the + \bt_p{params} parameter and initialization method data as the + \bt_p{initialize_method_data}. Those parameters are set + when bt_component_descriptor_set_add_descriptor() is called, before + bt_get_greatest_operative_mip_version() is called. + + Considering those initialization parameters, you need to fill the + received \bt_uint_rs \bt_p{supported_versions} with the rangs of + MIP versions you support. + + As of \bt_name_version_min_maj, you can only support MIP version 0. + + Not having this method is equivalent to having one which adds the + [0, 0] range to the \bt_p{supported_versions} set. + + Set this optional method with + bt_component_class_source_set_get_supported_mip_versions_method(), + bt_component_class_filter_set_get_supported_mip_versions_method(), + and bt_component_class_sink_set_get_supported_mip_versions_method(). +
    + +
    + \anchor api-comp-cls-dev-meth-graph-configured + Graph is \ref api-graph-lc "configured" +
    +
    + For a given trace processing \bt_graph, called the first time + bt_graph_run() or bt_graph_run_once() is called to notify your + \bt_sink_comp that the graph is now configured. + + Within this method, you can create \bt_p_msg_iter on your sink + component's \bt_p_iport. You can also manipulate those message + iterators, for example get and process initial messages or make + them. + + This method is called \em after the component's + \ref api-comp-cls-dev-meth-init "initialization method" + is called. You cannot create a message iterator in the + initialization method. + + Within this method, you \em cannot add an \bt_iport with + bt_self_component_sink_add_input_port(). + + Set this optional method with + bt_component_class_sink_set_graph_is_configured_method(). +
    + +
    + \anchor api-comp-cls-dev-meth-init + Initialize +
    +
    + Called within a bt_graph_add_*_component*() function + (see \ref api-graph) to initialize your \bt_comp. + + Within this method, you receive the initialization parameters and + initialization method data passed to the + bt_graph_add_*_component*() function. + + This method is where you can add initial \bt_p_port to your + component with bt_self_component_source_add_output_port(), + bt_self_component_filter_add_input_port(), + bt_self_component_filter_add_output_port(), or + bt_self_component_sink_add_input_port(). + You can also add ports in the + \ref api-comp-cls-dev-meth-iport-connected "input port connected" + and + \ref api-comp-cls-dev-meth-oport-connected "output port connected" + methods. + + You can create user data and set it as the \bt_self_comp's user data + with bt_self_component_set_data(). + + If you return #BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_OK from + this method, then your component's + \ref api-comp-cls-dev-meth-fini "finalization method" will be + called, if it exists, when your component is finalized. + + Set this optional method with + bt_component_class_source_set_initialize_method(), + bt_component_class_filter_set_initialize_method(), + and bt_component_class_sink_set_initialize_method(). +
    + +
    + \anchor api-comp-cls-dev-meth-iport-connected + \bt_c_iport connected +
    +
    + Called within bt_graph_connect_ports() to notify your \bt_comp that + one of its input ports has been connected. + + Within this method, you can add more \bt_p_port to your + component with bt_self_component_source_add_output_port(), + bt_self_component_filter_add_input_port(), + bt_self_component_filter_add_output_port(), or + bt_self_component_sink_add_input_port(). + + Set this optional method with + bt_component_class_filter_set_input_port_connected_method() and + bt_component_class_sink_set_input_port_connected_method(). +
    + +
    + \anchor api-comp-cls-dev-meth-oport-connected + \bt_c_oport connected +
    +
    + Called within bt_graph_connect_ports() to notify your \bt_comp that + one of its output ports has been connected. + + Within this method, you can add more \bt_p_port to your + component with bt_self_component_source_add_output_port(), + bt_self_component_filter_add_input_port(), + bt_self_component_filter_add_output_port(), or + bt_self_component_sink_add_input_port(). + + Set this optional method with + bt_component_class_source_set_output_port_connected_method() and + bt_component_class_filter_set_output_port_connected_method(). +
    + +
    + \anchor api-comp-cls-dev-meth-query + Query +
    +
    + Called within bt_query_executor_query() to make your \bt_comp_cls + perform a query operation. + + Within this method, you receive the query object name, the + query parameters, and the method data passed when the + \bt_qexec was created with bt_query_executor_create() or + bt_query_executor_create_with_method_data(). + + You also receive a private view of the query executor which you can + cast to a \c const query executor with + bt_private_query_executor_as_query_executor_const() to access the + executor's logging level with bt_query_executor_get_logging_level(). + + On success, set \bt_p{*result} to the query operation's result: a + \em new \bt_val reference. + + If the queried object's name (\bt_p{object_name} parameter) is + unknown, return + #BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_UNKNOWN_OBJECT. + + If you need to block the thread, you can instead report to + try again later to the bt_query_executor_query() caller + by returning #BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_AGAIN. + + Set this optional method with + bt_component_class_source_set_query_method(), + bt_component_class_filter_set_query_method(), and + bt_component_class_sink_set_query_method(). +
    +
    + +@attention + @parblock + In any of the methods above: + + - \em Never call bt_component_get_ref(), + bt_component_source_get_ref(), bt_component_filter_get_ref(), or + bt_component_sink_get_ref() on your own (upcasted) \bt_self_comp + to avoid reference cycles. + + You can keep a borrowed (weak) \bt_self_comp reference in your + component's user data (see bt_self_component_set_data()). + + - \em Never call bt_port_get_ref(), bt_port_input_get_ref(), or + bt_port_output_get_ref() on one of your own (upcasted) + \bt_p_self_comp_port to avoid reference cycles. + + - \em Never call bt_component_class_get_ref(), + bt_component_class_source_get_ref(), + bt_component_class_filter_get_ref(), or + bt_component_class_sink_get_ref() on your own (upcasted) + \bt_comp_cls to avoid reference cycles. + @endparblock + +Within any \ref api-comp-cls-dev-instance-meth "instance method", you +can access the \bt_comp's configured +\ref #bt_logging_level "logging level" by first upcasting the +\bt_self_comp to the #bt_component type with +bt_self_component_as_component(), and then with +bt_component_get_logging_level(). +*/ + +/*! @{ */ + +/*! +@name Method types +@{ +*/ + +/*! +@brief + Status codes for #bt_component_class_sink_consume_method. +*/ +typedef enum bt_component_class_sink_consume_method_status { + /*! + @brief + Success. + */ + BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Sink component is finished processing. + */ + BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_END = __BT_FUNC_STATUS_END, + + /*! + @brief + Try again. + */ + BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_AGAIN = __BT_FUNC_STATUS_AGAIN, + + /*! + @brief + Out of memory. + */ + BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + User error. + */ + BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, +} bt_component_class_sink_consume_method_status; + +/*! +@brief + \bt_c_sink_comp consuming method. + +See the \ref api-comp-cls-dev-meth-consume "consume" method. + +@param[in] self_component + \bt_c_sink_comp instance. + +@retval #BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_OK + Success. +@retval #BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_END + Finished processing. +@retval #BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_AGAIN + Try again. +@retval #BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_ERROR + User error. + +@bt_pre_not_null{self_component} + +@sa bt_component_class_sink_create() — + Creates a \bt_sink_comp. +*/ +typedef bt_component_class_sink_consume_method_status +(*bt_component_class_sink_consume_method)( + bt_self_component_sink *self_component); + +/*! +@brief + \bt_c_src_comp finalization method. + +See the \ref api-comp-cls-dev-meth-fini "finalize" method. + +@param[in] self_component + Source component instance. + +@bt_pre_not_null{self_component} + +@bt_post_no_error + +@sa bt_component_class_source_set_finalize_method() — + Sets the finalization method of a source component class. +*/ +typedef void (*bt_component_class_source_finalize_method)( + bt_self_component_source *self_component); + +/*! +@brief + \bt_c_flt_comp finalization method. + +See the \ref api-comp-cls-dev-meth-fini "finalize" method. + +@param[in] self_component + Filter component instance. + +@bt_pre_not_null{self_component} + +@bt_post_no_error + +@sa bt_component_class_filter_set_finalize_method() — + Sets the finalization method of a filter component class. +*/ +typedef void (*bt_component_class_filter_finalize_method)( + bt_self_component_filter *self_component); + +/*! +@brief + \bt_c_sink_comp finalization method. + +See the \ref api-comp-cls-dev-meth-fini "finalize" method. + +@param[in] self_component + Sink component instance. + +@bt_pre_not_null{self_component} + +@bt_post_no_error + +@sa bt_component_class_sink_set_finalize_method() — + Sets the finalization method of a sink component class. +*/ +typedef void (*bt_component_class_sink_finalize_method)( + bt_self_component_sink *self_component); + +/*! +@brief + Status codes for + #bt_component_class_source_get_supported_mip_versions_method, + #bt_component_class_filter_get_supported_mip_versions_method, and + #bt_component_class_sink_get_supported_mip_versions_method. +*/ +typedef enum bt_component_class_get_supported_mip_versions_method_status { + /*! + @brief + Success. + */ + BT_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + User error. + */ + BT_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, +} bt_component_class_get_supported_mip_versions_method_status; + +/*! +@brief + \bt_c_src_comp_cls \"get supported \bt_mip versions\" method. + +See the \ref api-comp-cls-dev-meth-mip "get supported MIP versions" +method. + +As of \bt_name_version_min_maj, you can only add the range [0, 0] +to \bt_p{supported_versions}. + +@param[in] self_component_class + Source component class. +@param[in] params + @parblock + Initialization parameters, as passed as the \bt_p{params} parameter + of bt_component_descriptor_set_add_descriptor() or + bt_component_descriptor_set_add_descriptor_with_initialize_method_data(). + + \bt_p{params} is frozen. + @endparblock +@param[in] initialize_method_data + User data for this method, as passed as the + \bt_p{init_method_data} parameter of + bt_component_descriptor_set_add_descriptor_with_initialize_method_data(). +@param[in] logging_level + Logging level to use during this method's execution, as passed + as the \bt_p{logging_level} parameter of + bt_get_greatest_operative_mip_version(). +@param[in] supported_versions + \bt_c_uint_rs to which to add the ranges of supported MIP versions + of an eventual instance of \bt_p{self_component_class} considering + \bt_p{params} and \bt_p{initialize_method_data}. + +@retval #BT_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD_STATUS_OK + Success. +@retval #BT_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD_STATUS_ERROR + User error. + +@bt_pre_not_null{self_component_class} +@bt_pre_not_null{params} +@bt_pre_is_map_val{params} +@bt_pre_not_null{supported_versions} +@pre + \bt_p{supported_versions} is empty. + +@sa bt_component_class_source_set_get_supported_mip_versions_method() — + Sets the "get supported MIP versions" method of a source + component class. +*/ +typedef bt_component_class_get_supported_mip_versions_method_status +(*bt_component_class_source_get_supported_mip_versions_method)( + bt_self_component_class_source *self_component_class, + const bt_value *params, void *initialize_method_data, + bt_logging_level logging_level, + bt_integer_range_set_unsigned *supported_versions); + + +/*! +@brief + \bt_c_flt_comp_cls \"get supported \bt_mip versions\" method. + +See the \ref api-comp-cls-dev-meth-mip "get supported MIP versions" +method. + +As of \bt_name_version_min_maj, you can only add the range [0, 0] +to \bt_p{supported_versions}. + +@param[in] self_component_class + Filter component class. +@param[in] params + @parblock + Initialization parameters, as passed as the \bt_p{params} parameter + of bt_component_descriptor_set_add_descriptor() or + bt_component_descriptor_set_add_descriptor_with_initialize_method_data(). + + \bt_p{params} is frozen. + @endparblock +@param[in] initialize_method_data + User data for this method, as passed as the + \bt_p{init_method_data} parameter of + bt_component_descriptor_set_add_descriptor_with_initialize_method_data(). +@param[in] logging_level + Logging level to use during this method's execution, as passed + as the \bt_p{logging_level} parameter of + bt_get_greatest_operative_mip_version(). +@param[in] supported_versions + \bt_c_uint_rs to which to add the ranges of supported MIP versions + of an eventual instance of \bt_p{self_component_class} considering + \bt_p{params} and \bt_p{initialize_method_data}. + +@retval #BT_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD_STATUS_OK + Success. +@retval #BT_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD_STATUS_ERROR + User error. + +@bt_pre_not_null{self_component_class} +@bt_pre_not_null{params} +@bt_pre_is_map_val{params} +@bt_pre_not_null{supported_versions} +@pre + \bt_p{supported_versions} is empty. + +@sa bt_component_class_filter_set_get_supported_mip_versions_method() — + Sets the "get supported MIP versions" method of a filter + component class. +*/ +typedef bt_component_class_get_supported_mip_versions_method_status +(*bt_component_class_filter_get_supported_mip_versions_method)( + bt_self_component_class_filter *source_component_class, + const bt_value *params, void *initialize_method_data, + bt_logging_level logging_level, + bt_integer_range_set_unsigned *supported_versions); + +/*! +@brief + \bt_c_sink_comp_cls \"get supported \bt_mip versions\" method. + +See the \ref api-comp-cls-dev-meth-mip "get supported MIP versions" +method. + +As of \bt_name_version_min_maj, you can only add the range [0, 0] +to \bt_p{supported_versions}. + +@param[in] self_component_class + Sink component class. +@param[in] params + @parblock + Initialization parameters, as passed as the \bt_p{params} parameter + of bt_component_descriptor_set_add_descriptor() or + bt_component_descriptor_set_add_descriptor_with_initialize_method_data(). + + \bt_p{params} is frozen. + @endparblock +@param[in] initialize_method_data + User data for this method, as passed as the + \bt_p{init_method_data} parameter of + bt_component_descriptor_set_add_descriptor_with_initialize_method_data(). +@param[in] logging_level + Logging level to use during this method's execution, as passed + as the \bt_p{logging_level} parameter of + bt_get_greatest_operative_mip_version(). +@param[in] supported_versions + \bt_c_uint_rs to which to add the ranges of supported MIP versions + of an eventual instance of \bt_p{self_component_class} considering + \bt_p{params} and \bt_p{initialize_method_data}. + +@retval #BT_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD_STATUS_OK + Success. +@retval #BT_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD_STATUS_ERROR + User error. + +@bt_pre_not_null{self_component_class} +@bt_pre_not_null{params} +@bt_pre_is_map_val{params} +@bt_pre_not_null{supported_versions} +@pre + \bt_p{supported_versions} is empty. + +@sa bt_component_class_sink_set_get_supported_mip_versions_method() — + Sets the "get supported MIP versions" method of a sink + component class. +*/ +typedef bt_component_class_get_supported_mip_versions_method_status +(*bt_component_class_sink_get_supported_mip_versions_method)( + bt_self_component_class_sink *source_component_class, + const bt_value *params, void *initialize_method_data, + bt_logging_level logging_level, + bt_integer_range_set_unsigned *supported_versions); + +/*! +@brief + Status codes for + #bt_component_class_sink_graph_is_configured_method. +*/ +typedef enum bt_component_class_sink_graph_is_configured_method_status { + /*! + @brief + Success. + */ + BT_COMPONENT_CLASS_SINK_GRAPH_IS_CONFIGURED_METHOD_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_COMPONENT_CLASS_SINK_GRAPH_IS_CONFIGURED_METHOD_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + User error. + */ + BT_COMPONENT_CLASS_SINK_GRAPH_IS_CONFIGURED_METHOD_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, +} bt_component_class_sink_graph_is_configured_method_status; + +/*! +@brief + \bt_c_sink_comp "graph is configured" method. + +See the \ref api-comp-cls-dev-meth-graph-configured +"graph is configured" method. + +@param[in] self_component + Sink component instance. + +@retval #BT_COMPONENT_CLASS_SINK_GRAPH_IS_CONFIGURED_METHOD_STATUS_OK + Success. +@retval #BT_COMPONENT_CLASS_SINK_GRAPH_IS_CONFIGURED_METHOD_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_COMPONENT_CLASS_SINK_GRAPH_IS_CONFIGURED_METHOD_STATUS_ERROR + User error. + +@bt_pre_not_null{self_component} + +@sa bt_component_class_sink_set_graph_is_configured_method() — + Sets the "graph is configured" method of a sink component class. +*/ +typedef bt_component_class_sink_graph_is_configured_method_status +(*bt_component_class_sink_graph_is_configured_method)( + bt_self_component_sink *self_component); + +/*! +@brief + Status codes for + #bt_component_class_source_initialize_method, + #bt_component_class_filter_initialize_method, and + #bt_component_class_sink_initialize_method. +*/ +typedef enum bt_component_class_initialize_method_status { + /*! + @brief + Success. + */ + BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + User error. + */ + BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, +} bt_component_class_initialize_method_status; + +/*! +@brief + \bt_c_src_comp initialization method. + +See the \ref api-comp-cls-dev-meth-init "initialize" method. + +As of \bt_name_version_min_maj, the \bt_p{configuration} parameter +is not used. + +@param[in] self_component + Source component instance. +@param[in] configuration + Initial component configuration (unused). +@param[in] params + @parblock + Initialization parameters, as passed as the \bt_p{params} parameter + of bt_graph_add_source_component() or + bt_graph_add_source_component_with_initialize_method_data(). + + \bt_p{params} is frozen. + @endparblock +@param[in] initialize_method_data + User data for this method, as passed as the + \bt_p{initialize_method_data} parameter of + bt_graph_add_source_component_with_initialize_method_data(). + +@retval #BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_OK + Success. +@retval #BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_ERROR + User error. + +@bt_pre_not_null{self_component} +@bt_pre_not_null{configuration} +@bt_pre_not_null{params} +@bt_pre_is_map_val{params} + +@sa bt_component_class_source_set_initialize_method() — + Sets the initialization method of a source component class. +*/ +typedef bt_component_class_initialize_method_status +(*bt_component_class_source_initialize_method)( + bt_self_component_source *self_component, + bt_self_component_source_configuration *configuration, + const bt_value *params, void *initialize_method_data); + +/*! +@brief + \bt_c_flt_comp initialization method. + +See the \ref api-comp-cls-dev-meth-init "initialize" method. + +As of \bt_name_version_min_maj, the \bt_p{configuration} parameter +is not used. + +@param[in] self_component + Filter component instance. +@param[in] configuration + Initial component configuration (unused). +@param[in] params + @parblock + Initialization parameters, as passed as the \bt_p{params} parameter + of bt_graph_add_filter_component() or + bt_graph_add_filter_component_with_initialize_method_data(). + + \bt_p{params} is frozen. + @endparblock +@param[in] initialize_method_data + User data for this method, as passed as the + \bt_p{initialize_method_data} parameter of + bt_graph_add_filter_component_with_initialize_method_data(). + +@retval #BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_OK + Success. +@retval #BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_ERROR + User error. + +@bt_pre_not_null{self_component} +@bt_pre_not_null{configuration} +@bt_pre_not_null{params} +@bt_pre_is_map_val{params} + +@sa bt_component_class_filter_set_initialize_method() — + Sets the initialization method of a filter component class. +*/ +typedef bt_component_class_initialize_method_status +(*bt_component_class_filter_initialize_method)( + bt_self_component_filter *self_component, + bt_self_component_filter_configuration *configuration, + const bt_value *params, void *initialize_method_data); + +/*! +@brief + \bt_c_sink_comp initialization method. + +See the \ref api-comp-cls-dev-meth-init "initialize" method. + +As of \bt_name_version_min_maj, the \bt_p{configuration} parameter +is not used. + +@param[in] self_component + Sink component instance. +@param[in] configuration + Initial component configuration (unused). +@param[in] params + @parblock + Initialization parameters, as passed as the \bt_p{params} parameter + of bt_graph_add_sink_component(), + bt_graph_add_sink_component_with_initialize_method_data(), or + bt_graph_add_simple_sink_component(). + + \bt_p{params} is frozen. + @endparblock +@param[in] initialize_method_data + User data for this method, as passed as the + \bt_p{initialize_method_data} parameter of + bt_graph_add_sink_component_with_initialize_method_data(). + +@retval #BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_OK + Success. +@retval #BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_ERROR + User error. + +@bt_pre_not_null{self_component} +@bt_pre_not_null{configuration} +@bt_pre_not_null{params} +@bt_pre_is_map_val{params} + +@sa bt_component_class_sink_set_initialize_method() — + Sets the initialization method of a sink component class. +*/ +typedef bt_component_class_initialize_method_status +(*bt_component_class_sink_initialize_method)( + bt_self_component_sink *self_component, + bt_self_component_sink_configuration *configuration, + const bt_value *params, void *initialize_method_data); + +/*! +@brief + Status codes for + #bt_component_class_source_output_port_connected_method, + #bt_component_class_filter_input_port_connected_method, + #bt_component_class_filter_output_port_connected_method, and + #bt_component_class_sink_input_port_connected_method. +*/ +typedef enum bt_component_class_port_connected_method_status { + /*! + @brief + Success. + */ + BT_COMPONENT_CLASS_PORT_CONNECTED_METHOD_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_COMPONENT_CLASS_PORT_CONNECTED_METHOD_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + User error. + */ + BT_COMPONENT_CLASS_PORT_CONNECTED_METHOD_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, +} bt_component_class_port_connected_method_status; + +/*! +@brief + \bt_c_src_comp "output port connected" method. + +See the +\ref api-comp-cls-dev-meth-oport-connected "output port connected" +method. + +@param[in] self_component + Source component instance. +@param[in] self_port + Connected \bt_oport of \bt_p{self_component}. +@param[in] other_port + \bt_c_conn's other (input) port. + +@retval #BT_COMPONENT_CLASS_PORT_CONNECTED_METHOD_STATUS_OK + Success. +@retval #BT_COMPONENT_CLASS_PORT_CONNECTED_METHOD_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_COMPONENT_CLASS_PORT_CONNECTED_METHOD_STATUS_ERROR + User error. + +@bt_pre_not_null{self_component} +@bt_pre_not_null{self_port} +@bt_pre_not_null{other_port} + +@sa bt_component_class_source_set_output_port_connected_method() — + Sets the "output port connected" method of a source component class. +*/ +typedef bt_component_class_port_connected_method_status +(*bt_component_class_source_output_port_connected_method)( + bt_self_component_source *self_component, + bt_self_component_port_output *self_port, + const bt_port_input *other_port); + +/*! +@brief + \bt_c_flt_comp "input port connected" method. + +See the +\ref api-comp-cls-dev-meth-iport-connected "input port connected" +method. + +@param[in] self_component + Filter component instance. +@param[in] self_port + Connected \bt_iport of \bt_p{self_component}. +@param[in] other_port + \bt_c_conn's other (output) port. + +@retval #BT_COMPONENT_CLASS_PORT_CONNECTED_METHOD_STATUS_OK + Success. +@retval #BT_COMPONENT_CLASS_PORT_CONNECTED_METHOD_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_COMPONENT_CLASS_PORT_CONNECTED_METHOD_STATUS_ERROR + User error. + +@bt_pre_not_null{self_component} +@bt_pre_not_null{self_port} +@bt_pre_not_null{other_port} + +@sa bt_component_class_filter_set_input_port_connected_method() — + Sets the "input port connected" method of a filter component class. +*/ +typedef bt_component_class_port_connected_method_status +(*bt_component_class_filter_input_port_connected_method)( + bt_self_component_filter *self_component, + bt_self_component_port_input *self_port, + const bt_port_output *other_port); + +/*! +@brief + \bt_c_flt_comp "output port connected" method. + +See the +\ref api-comp-cls-dev-meth-oport-connected "output port connected" +method. + +@param[in] self_component + Filter component instance. +@param[in] self_port + Connected \bt_oport of \bt_p{self_component}. +@param[in] other_port + \bt_c_conn's other (input) port. + +@retval #BT_COMPONENT_CLASS_PORT_CONNECTED_METHOD_STATUS_OK + Success. +@retval #BT_COMPONENT_CLASS_PORT_CONNECTED_METHOD_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_COMPONENT_CLASS_PORT_CONNECTED_METHOD_STATUS_ERROR + User error. + +@bt_pre_not_null{self_component} +@bt_pre_not_null{self_port} +@bt_pre_not_null{other_port} + +@sa bt_component_class_filter_set_output_port_connected_method() — + Sets the "output port connected" method of a filter component class. +*/ +typedef bt_component_class_port_connected_method_status +(*bt_component_class_filter_output_port_connected_method)( + bt_self_component_filter *self_component, + bt_self_component_port_output *self_port, + const bt_port_input *other_port); + +/*! +@brief + \bt_c_sink_comp "input port connected" method. + +See the +\ref api-comp-cls-dev-meth-iport-connected "input port connected" +method. + +@param[in] self_component + Sink component instance. +@param[in] self_port + Connected \bt_iport of \bt_p{self_component}. +@param[in] other_port + \bt_c_conn's other (output) port. + +@retval #BT_COMPONENT_CLASS_PORT_CONNECTED_METHOD_STATUS_OK + Success. +@retval #BT_COMPONENT_CLASS_PORT_CONNECTED_METHOD_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_COMPONENT_CLASS_PORT_CONNECTED_METHOD_STATUS_ERROR + User error. + +@bt_pre_not_null{self_component} +@bt_pre_not_null{self_port} +@bt_pre_not_null{other_port} + +@sa bt_component_class_sink_set_input_port_connected_method() — + Sets the "input port connected" method of a sink component class. +*/ +typedef bt_component_class_port_connected_method_status +(*bt_component_class_sink_input_port_connected_method)( + bt_self_component_sink *self_component, + bt_self_component_port_input *self_port, + const bt_port_output *other_port); + +/*! +@brief + Status codes for + #bt_component_class_source_query_method, + #bt_component_class_filter_query_method, and + #bt_component_class_sink_query_method. +*/ +typedef enum bt_component_class_query_method_status { + /*! + @brief + Success. + */ + BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Unknown object to query. + */ + BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_UNKNOWN_OBJECT = __BT_FUNC_STATUS_UNKNOWN_OBJECT, + + /*! + @brief + Try again. + */ + BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_AGAIN = __BT_FUNC_STATUS_AGAIN, + + /*! + @brief + Out of memory. + */ + BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + User error. + */ + BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, +} bt_component_class_query_method_status; + +/*! +@brief + \bt_c_src_comp_cls query method. + +See the \ref api-comp-cls-dev-meth-query "query" method. + +@param[in] self_component_class + Source component class, as passed as the \bt_p{component_class} + parameter of bt_query_executor_create() or + bt_query_executor_create_with_method_data() when creating this query + operation's \ref api-qexec "executor". +@param[in] query_executor + Private view of this query operation's executor. +@param[in] object_name + Name of the object to query, as passed as the \bt_p{object_name} + parameter of bt_query_executor_create() or + bt_query_executor_create_with_method_data() when creating this query + operation's executor. +@param[in] params + @parblock + Query parameters, as passed as the \bt_p{params} + parameter of bt_query_executor_create() or + bt_query_executor_create_with_method_data() when creating this query + operation's executor. + + \bt_p{params} is frozen. + @endparblock +@param[in] method_data + User data for this method, as passed as the \bt_p{method_data} + parameter of bt_query_executor_create_with_method_data() when + creating this query operation's executor. +@param[out] result + On success, \bt_p{*result} is + a \em new reference of this query operation's result. + +@retval #BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_OK + Success. +@retval #BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_UNKNOWN_OBJECT + \bt_p{object_name} is unknown. +@retval #BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_AGAIN + Try again. +@retval #BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR + User error. + +@bt_pre_not_null{self_component_class} +@bt_pre_not_null{query_executor} +@bt_pre_not_null{object_name} +@bt_pre_not_null{params} +@bt_pre_not_null{result} + +@post + On success, \bt_p{*result} is set. + +@sa bt_component_class_source_set_query_method() — + Sets the query method of a source component class. +*/ +typedef bt_component_class_query_method_status +(*bt_component_class_source_query_method)( + bt_self_component_class_source *self_component_class, + bt_private_query_executor *query_executor, + const char *object_name, const bt_value *params, + void *method_data, const bt_value **result); + +/*! +@brief + \bt_c_flt_comp_cls query method. + +See the \ref api-comp-cls-dev-meth-query "query" method. + +@param[in] self_component_class + Filter component class, as passed as the \bt_p{component_class} + parameter of bt_query_executor_create() or + bt_query_executor_create_with_method_data() when creating this query + operation's \ref api-qexec "executor". +@param[in] query_executor + Private view of this query operation's executor. +@param[in] object_name + Name of the object to query, as passed as the \bt_p{object_name} + parameter of bt_query_executor_create() or + bt_query_executor_create_with_method_data() when creating this query + operation's executor. +@param[in] params + @parblock + Query parameters, as passed as the \bt_p{params} + parameter of bt_query_executor_create() or + bt_query_executor_create_with_method_data() when creating this query + operation's executor. + + \bt_p{params} is frozen. + @endparblock +@param[in] method_data + User data for this method, as passed as the \bt_p{method_data} + parameter of bt_query_executor_create_with_method_data() when + creating this query operation's executor. +@param[out] result + On success, \bt_p{*result} is + a \em new reference of this query operation's result. + +@retval #BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_OK + Success. +@retval #BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_UNKNOWN_OBJECT + \bt_p{object_name} is unknown. +@retval #BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_AGAIN + Try again. +@retval #BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR + User error. + +@bt_pre_not_null{self_component_class} +@bt_pre_not_null{query_executor} +@bt_pre_not_null{object_name} +@bt_pre_not_null{params} +@bt_pre_not_null{result} + +@post + On success, \bt_p{*result} is set. + +@sa bt_component_class_filter_set_query_method() — + Sets the query method of a filter component class. +*/ +typedef bt_component_class_query_method_status +(*bt_component_class_filter_query_method)( + bt_self_component_class_filter *self_component_class, + bt_private_query_executor *query_executor, + const char *object_name, const bt_value *params, + void *method_data, const bt_value **result); + +/*! +@brief + \bt_c_sink_comp_cls query method. + +See the \ref api-comp-cls-dev-meth-query "query" method. + +@param[in] self_component_class + Sink component class, as passed as the \bt_p{component_class} + parameter of bt_query_executor_create() or + bt_query_executor_create_with_method_data() when creating this query + operation's \ref api-qexec "executor". +@param[in] query_executor + Private view of this query operation's executor. +@param[in] object_name + Name of the object to query, as passed as the \bt_p{object_name} + parameter of bt_query_executor_create() or + bt_query_executor_create_with_method_data() when creating this query + operation's executor. +@param[in] params + @parblock + Query parameters, as passed as the \bt_p{params} + parameter of bt_query_executor_create() or + bt_query_executor_create_with_method_data() when creating this query + operation's executor. + + \bt_p{params} is frozen. + @endparblock +@param[in] method_data + User data for this method, as passed as the \bt_p{method_data} + parameter of bt_query_executor_create_with_method_data() when + creating this query operation's executor. +@param[out] result + On success, \bt_p{*result} is + a \em new reference of this query operation's result. + +@retval #BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_OK + Success. +@retval #BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_UNKNOWN_OBJECT + \bt_p{object_name} is unknown. +@retval #BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_AGAIN + Try again. +@retval #BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR + User error. + +@bt_pre_not_null{self_component_class} +@bt_pre_not_null{query_executor} +@bt_pre_not_null{object_name} +@bt_pre_not_null{params} +@bt_pre_not_null{result} + +@post + On success, \bt_p{*result} is set. + +@sa bt_component_class_sink_set_query_method() — + Sets the query method of a sink component class. +*/ +typedef bt_component_class_query_method_status +(*bt_component_class_sink_query_method)( + bt_self_component_class_sink *self_component_class, + bt_private_query_executor *query_executor, + const char *object_name, const bt_value *params, + void *method_data, const bt_value **result); + +/*! @} */ + +/*! +@name Creation +@{ +*/ + +/*! +@brief + Creates a \bt_src_comp_cls named \bt_p{name} and having the + \bt_msg_iter_cls \bt_p{message_iterator_class}. + +On success, the returned source component class has the following +property values: + + + + + + +
    Property + Value +
    \ref api-comp-cls-prop-name "Name" + \bt_p{name} +
    \ref api-comp-cls-prop-descr "Description" + \em None +
    \ref api-comp-cls-prop-help "Help text" + \em None +
    + +@param[in] name + Name of the source component class to create (copied). +@param[in] message_iterator_class + Message iterator class of the source component class to create. + +@returns + New source component class reference, or \c NULL on memory error. + +@bt_pre_not_null{name} +@bt_pre_not_null{message_iterator_class} + +@bt_post_success_frozen{message_iterator_class} + +@sa bt_message_iterator_class_create() — + Creates a message iterator class. +*/ +extern +bt_component_class_source *bt_component_class_source_create( + const char *name, + bt_message_iterator_class *message_iterator_class); + +/*! +@brief + Creates a \bt_flt_comp_cls named \bt_p{name} and having the + \bt_msg_iter_cls \bt_p{message_iterator_class}. + +On success, the returned filter component class has the following +property values: + + + + + + +
    Property + Value +
    \ref api-comp-cls-prop-name "Name" + \bt_p{name} +
    \ref api-comp-cls-prop-descr "Description" + \em None +
    \ref api-comp-cls-prop-help "Help text" + \em None +
    + +@param[in] name + Name of the filter component class to create (copied). +@param[in] message_iterator_class + Message iterator class of the filter component class to create. + +@returns + New filter component class reference, or \c NULL on memory error. + +@bt_pre_not_null{name} +@bt_pre_not_null{message_iterator_class} + +@bt_post_success_frozen{message_iterator_class} + +@sa bt_message_iterator_class_create() — + Creates a message iterator class. +*/ +extern +bt_component_class_filter *bt_component_class_filter_create( + const char *name, + bt_message_iterator_class *message_iterator_class); + +/*! +@brief + Creates a \bt_sink_comp_cls named \bt_p{name} and having the + \ref api-comp-cls-dev-meth-consume "consuming method" + \bt_p{consume_method}. + +On success, the returned sink component class has the following +property values: + + + + + + +
    Property + Value +
    \ref api-comp-cls-prop-name "Name" + \bt_p{name} +
    \ref api-comp-cls-prop-descr "Description" + \em None +
    \ref api-comp-cls-prop-help "Help text" + \em None +
    + +@param[in] name + Name of the sink component class to create (copied). +@param[in] consume_method + Consuming method of the sink component class to create. + +@returns + New sink component class reference, or \c NULL on memory error. + +@bt_pre_not_null{name} +@bt_pre_not_null{consume_method} +*/ +extern +bt_component_class_sink *bt_component_class_sink_create( + const char *name, + bt_component_class_sink_consume_method consume_method); + +/*! @} */ + +/*! +@name Common properties +@{ +*/ + +/*! +@brief + Status codes for bt_component_class_set_description(). +*/ +typedef enum bt_component_class_set_description_status { + /*! + @brief + Success. + */ + BT_COMPONENT_CLASS_SET_DESCRIPTION_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_COMPONENT_CLASS_SET_DESCRIPTION_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, +} bt_component_class_set_description_status; + +/*! +@brief + Sets the description of the component class \bt_p{component_class} + to a copy of \bt_p{description}. + +See the \ref api-comp-cls-prop-descr "description" property. + +@param[in] component_class + Component class of which to set the description to + \bt_p{description}. +@param[in] description + New description of \bt_p{component_class} (copied). + +@retval #BT_COMPONENT_CLASS_SET_DESCRIPTION_STATUS_OK + Success. +@retval #BT_COMPONENT_CLASS_SET_DESCRIPTION_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{component_class} +@bt_pre_hot{component_class} +@bt_pre_not_null{description} + +@sa bt_component_class_get_description() — + Returns the description of a component class. +*/ +extern bt_component_class_set_description_status +bt_component_class_set_description(bt_component_class *component_class, + const char *description); + +/*! +@brief + Status codes for bt_component_class_set_help(). +*/ +typedef enum bt_component_class_set_help_status { + /*! + @brief + Success. + */ + BT_COMPONENT_CLASS_SET_HELP_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_COMPONENT_CLASS_SET_HELP_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, +} bt_component_class_set_help_status; + +/*! +@brief + Sets the help text of the component class \bt_p{component_class} + to a copy of \bt_p{help_text}. + +See the \ref api-comp-cls-prop-help "help text" property. + +@param[in] component_class + Component class of which to set the help text to + \bt_p{help_text}. +@param[in] help_text + New help text of \bt_p{component_class} (copied). + +@retval #BT_COMPONENT_CLASS_SET_HELP_STATUS_OK + Success. +@retval #BT_COMPONENT_CLASS_SET_HELP_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{component_class} +@bt_pre_hot{component_class} +@bt_pre_not_null{help_text} + +@sa bt_component_class_get_help() — + Returns the help text of a component class. +*/ +extern bt_component_class_set_help_status bt_component_class_set_help( + bt_component_class *component_class, + const char *help_text); + +/*! @} */ + +/*! +@name Method setting +@{ +*/ + +/*! +@brief + Status code for the + bt_component_class_*_set_*_method() functions. +*/ +typedef enum bt_component_class_set_method_status { + /*! + @brief + Success. + */ + BT_COMPONENT_CLASS_SET_METHOD_STATUS_OK = __BT_FUNC_STATUS_OK, +} bt_component_class_set_method_status; + +/*! +@brief + Sets the optional finalization method of the \bt_src_comp_cls + \bt_p{component_class} to \bt_p{method}. + +See the \ref api-comp-cls-dev-meth-fini "finalize" method. + +@param[in] component_class + Source component class of which to set the finalization method to + \bt_p{method}. +@param[in] method + New finalization method of \bt_p{component_class}. + +@retval #BT_COMPONENT_CLASS_SET_METHOD_STATUS_OK + Success. + +@bt_pre_not_null{component_class} +@bt_pre_hot{component_class} +@bt_pre_not_null{method} +*/ +extern bt_component_class_set_method_status +bt_component_class_source_set_finalize_method( + bt_component_class_source *component_class, + bt_component_class_source_finalize_method method); + +/*! +@brief + Sets the optional finalization method of the \bt_flt_comp_cls + \bt_p{component_class} to \bt_p{method}. + +See the \ref api-comp-cls-dev-meth-fini "finalize" method. + +@param[in] component_class + Filter component class of which to set the finalization method to + \bt_p{method}. +@param[in] method + New finalization method of \bt_p{component_class}. + +@retval #BT_COMPONENT_CLASS_SET_METHOD_STATUS_OK + Success. + +@bt_pre_not_null{component_class} +@bt_pre_hot{component_class} +@bt_pre_not_null{method} +*/ +extern bt_component_class_set_method_status +bt_component_class_filter_set_finalize_method( + bt_component_class_filter *component_class, + bt_component_class_filter_finalize_method method); + +/*! +@brief + Sets the optional finalization method of the \bt_sink_comp_cls + \bt_p{component_class} to \bt_p{method}. + +See the \ref api-comp-cls-dev-meth-fini "finalize" method. + +@param[in] component_class + Sink component class of which to set the finalization method to + \bt_p{method}. +@param[in] method + New finalization method of \bt_p{component_class}. + +@retval #BT_COMPONENT_CLASS_SET_METHOD_STATUS_OK + Success. + +@bt_pre_not_null{component_class} +@bt_pre_hot{component_class} +@bt_pre_not_null{method} +*/ +extern +bt_component_class_set_method_status +bt_component_class_sink_set_finalize_method( + bt_component_class_sink *component_class, + bt_component_class_sink_finalize_method method); + +/*! +@brief + Sets the \"get supported \bt_mip versions\" method of the + \bt_src_comp_cls \bt_p{component_class} to \bt_p{method}. + +See the \ref api-comp-cls-dev-meth-mip "get supported MIP versions" +method. + +@param[in] component_class + Source component class of which to set the "get supported MIP + versions" method to \bt_p{method}. +@param[in] method + New "get supported MIP versions" method of \bt_p{component_class}. + +@retval #BT_COMPONENT_CLASS_SET_METHOD_STATUS_OK + Success. + +@bt_pre_not_null{component_class} +@bt_pre_hot{component_class} +@bt_pre_not_null{method} +*/ +extern bt_component_class_set_method_status +bt_component_class_source_set_get_supported_mip_versions_method( + bt_component_class_source *component_class, + bt_component_class_source_get_supported_mip_versions_method method); + +/*! +@brief + Sets the \"get supported \bt_mip versions\" method of the + \bt_flt_comp_cls \bt_p{component_class} to \bt_p{method}. + +See the \ref api-comp-cls-dev-meth-mip "get supported MIP versions" +method. + +@param[in] component_class + Filter component class of which to set the "get supported MIP + versions" method to \bt_p{method}. +@param[in] method + New "get supported MIP versions" method of \bt_p{component_class}. + +@retval #BT_COMPONENT_CLASS_SET_METHOD_STATUS_OK + Success. + +@bt_pre_not_null{component_class} +@bt_pre_hot{component_class} +@bt_pre_not_null{method} +*/ +extern bt_component_class_set_method_status +bt_component_class_filter_set_get_supported_mip_versions_method( + bt_component_class_filter *component_class, + bt_component_class_filter_get_supported_mip_versions_method method); + +/*! +@brief + Sets the \"get supported \bt_mip versions\" method of the + \bt_sink_comp_cls \bt_p{component_class} to \bt_p{method}. + +See the \ref api-comp-cls-dev-meth-mip "get supported MIP versions" +method. + +@param[in] component_class + Sink component class of which to set the "get supported MIP + versions" method to \bt_p{method}. +@param[in] method + New "get supported MIP versions" method of \bt_p{component_class}. + +@retval #BT_COMPONENT_CLASS_SET_METHOD_STATUS_OK + Success. + +@bt_pre_not_null{component_class} +@bt_pre_hot{component_class} +@bt_pre_not_null{method} +*/ +extern bt_component_class_set_method_status +bt_component_class_sink_set_get_supported_mip_versions_method( + bt_component_class_sink *component_class, + bt_component_class_sink_get_supported_mip_versions_method method); + +/*! +@brief + Sets the "graph is configured" method of the + \bt_sink_comp_cls \bt_p{component_class} to \bt_p{method}. + +See the +\ref api-comp-cls-dev-meth-graph-configured "graph is configured" +method. + +@param[in] component_class + Sink component class of which to set the "graph is configured" + method to \bt_p{method}. +@param[in] method + New "graph is configured" method of \bt_p{component_class}. + +@retval #BT_COMPONENT_CLASS_SET_METHOD_STATUS_OK + Success. + +@bt_pre_not_null{component_class} +@bt_pre_hot{component_class} +@bt_pre_not_null{method} +*/ +extern +bt_component_class_set_method_status +bt_component_class_sink_set_graph_is_configured_method( + bt_component_class_sink *component_class, + bt_component_class_sink_graph_is_configured_method method); + +/*! +@brief + Sets the optional initialization method of the \bt_src_comp_cls + \bt_p{component_class} to \bt_p{method}. + +See the \ref api-comp-cls-dev-meth-init "initialize" method. + +@param[in] component_class + Source component class of which to set the initialization method to + \bt_p{method}. +@param[in] method + New initialization method of \bt_p{component_class}. + +@retval #BT_COMPONENT_CLASS_SET_METHOD_STATUS_OK + Success. + +@bt_pre_not_null{component_class} +@bt_pre_hot{component_class} +@bt_pre_not_null{method} +*/ +extern bt_component_class_set_method_status +bt_component_class_source_set_initialize_method( + bt_component_class_source *component_class, + bt_component_class_source_initialize_method method); + +/*! +@brief + Sets the optional initialization method of the \bt_flt_comp_cls + \bt_p{component_class} to \bt_p{method}. + +See the \ref api-comp-cls-dev-meth-init "initialize" method. + +@param[in] component_class + Filter component class of which to set the initialization method to + \bt_p{method}. +@param[in] method + New initialization method of \bt_p{component_class}. + +@retval #BT_COMPONENT_CLASS_SET_METHOD_STATUS_OK + Success. + +@bt_pre_not_null{component_class} +@bt_pre_hot{component_class} +@bt_pre_not_null{method} +*/ +extern bt_component_class_set_method_status +bt_component_class_filter_set_initialize_method( + bt_component_class_filter *component_class, + bt_component_class_filter_initialize_method method); + +/*! +@brief + Sets the optional initialization method of the \bt_sink_comp_cls + \bt_p{component_class} to \bt_p{method}. + +See the \ref api-comp-cls-dev-meth-init "initialize" method. + +@param[in] component_class + Sink component class of which to set the initialization method to + \bt_p{method}. +@param[in] method + New initialization method of \bt_p{component_class}. + +@retval #BT_COMPONENT_CLASS_SET_METHOD_STATUS_OK + Success. + +@bt_pre_not_null{component_class} +@bt_pre_hot{component_class} +@bt_pre_not_null{method} +*/ +extern +bt_component_class_set_method_status +bt_component_class_sink_set_initialize_method( + bt_component_class_sink *component_class, + bt_component_class_sink_initialize_method method); + +/*! +@brief + Sets the optional "output port connected" method of the + \bt_src_comp_cls \bt_p{component_class} to \bt_p{method}. + +See the +\ref api-comp-cls-dev-meth-oport-connected "output port connected" +method. + +@param[in] component_class + Source component class of which to set the "output port connected" + method to \bt_p{method}. +@param[in] method + New "output port connected" method of \bt_p{component_class}. + +@retval #BT_COMPONENT_CLASS_SET_METHOD_STATUS_OK + Success. + +@bt_pre_not_null{component_class} +@bt_pre_hot{component_class} +@bt_pre_not_null{method} +*/ +extern bt_component_class_set_method_status +bt_component_class_source_set_output_port_connected_method( + bt_component_class_source *component_class, + bt_component_class_source_output_port_connected_method method); + +/*! +@brief + Sets the optional "input port connected" method of the + \bt_flt_comp_cls \bt_p{component_class} to \bt_p{method}. + +See the +\ref api-comp-cls-dev-meth-iport-connected "input port connected" +method. + +@param[in] component_class + Filter component class of which to set the "input port connected" + method to \bt_p{method}. +@param[in] method + New "input port connected" method of \bt_p{component_class}. + +@retval #BT_COMPONENT_CLASS_SET_METHOD_STATUS_OK + Success. + +@bt_pre_not_null{component_class} +@bt_pre_hot{component_class} +@bt_pre_not_null{method} +*/ +extern bt_component_class_set_method_status +bt_component_class_filter_set_input_port_connected_method( + bt_component_class_filter *component_class, + bt_component_class_filter_input_port_connected_method method); + +/*! +@brief + Sets the optional "output port connected" method of the + \bt_flt_comp_cls \bt_p{component_class} to \bt_p{method}. + +See the +\ref api-comp-cls-dev-meth-oport-connected "output port connected" +method. + +@param[in] component_class + Filter component class of which to set the "output port connected" + method to \bt_p{method}. +@param[in] method + New "output port connected" method of \bt_p{component_class}. + +@retval #BT_COMPONENT_CLASS_SET_METHOD_STATUS_OK + Success. + +@bt_pre_not_null{component_class} +@bt_pre_hot{component_class} +@bt_pre_not_null{method} +*/ +extern bt_component_class_set_method_status +bt_component_class_filter_set_output_port_connected_method( + bt_component_class_filter *component_class, + bt_component_class_filter_output_port_connected_method method); + +/*! +@brief + Sets the optional "input port connected" method of the + \bt_sink_comp_cls \bt_p{component_class} to \bt_p{method}. + +See the +\ref api-comp-cls-dev-meth-iport-connected "input port connected" +method. + +@param[in] component_class + Sink component class of which to set the "input port connected" + method to \bt_p{method}. +@param[in] method + New "input port connected" method of \bt_p{component_class}. + +@retval #BT_COMPONENT_CLASS_SET_METHOD_STATUS_OK + Success. + +@bt_pre_not_null{component_class} +@bt_pre_hot{component_class} +@bt_pre_not_null{method} +*/ +extern +bt_component_class_set_method_status +bt_component_class_sink_set_input_port_connected_method( + bt_component_class_sink *component_class, + bt_component_class_sink_input_port_connected_method method); + +/*! +@brief + Sets the optional query method of the \bt_src_comp_cls + \bt_p{component_class} to \bt_p{method}. + +See the \ref api-comp-cls-dev-meth-query "query" method. + +@param[in] component_class + Source component class of which to set the query method to + \bt_p{method}. +@param[in] method + New query method of \bt_p{component_class}. + +@retval #BT_COMPONENT_CLASS_SET_METHOD_STATUS_OK + Success. + +@bt_pre_not_null{component_class} +@bt_pre_hot{component_class} +@bt_pre_not_null{method} +*/ +extern bt_component_class_set_method_status +bt_component_class_source_set_query_method( + bt_component_class_source *component_class, + bt_component_class_source_query_method method); + +/*! +@brief + Sets the optional query method of the \bt_flt_comp_cls + \bt_p{component_class} to \bt_p{method}. + +See the \ref api-comp-cls-dev-meth-query "query" method. + +@param[in] component_class + Filter component class of which to set the query method to + \bt_p{method}. +@param[in] method + New query method of \bt_p{component_class}. + +@retval #BT_COMPONENT_CLASS_SET_METHOD_STATUS_OK + Success. + +@bt_pre_not_null{component_class} +@bt_pre_hot{component_class} +@bt_pre_not_null{method} +*/ +extern bt_component_class_set_method_status +bt_component_class_filter_set_query_method( + bt_component_class_filter *component_class, + bt_component_class_filter_query_method method); + +/*! +@brief + Sets the optional query method of the \bt_sink_comp_cls + \bt_p{component_class} to \bt_p{method}. + +See the \ref api-comp-cls-dev-meth-query "query" method. + +@param[in] component_class + Sink component class of which to set the query method to + \bt_p{method}. +@param[in] method + New query method of \bt_p{component_class}. + +@retval #BT_COMPONENT_CLASS_SET_METHOD_STATUS_OK + Success. + +@bt_pre_not_null{component_class} +@bt_pre_hot{component_class} +@bt_pre_not_null{method} +*/ +extern +bt_component_class_set_method_status +bt_component_class_sink_set_query_method( + bt_component_class_sink *component_class, + bt_component_class_sink_query_method method); + +/*! @} */ + +/*! +@name Upcast +@{ +*/ + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the \bt_src_comp_cls + \bt_p{component_class} to the common #bt_component_class type. + +@param[in] component_class + @parblock + Source component class to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{component_class} as a common component class. +*/ +static inline +bt_component_class *bt_component_class_source_as_component_class( + bt_component_class_source *component_class) +{ + return __BT_UPCAST(bt_component_class, component_class); +} + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the \bt_flt_comp_cls + \bt_p{component_class} to the common #bt_component_class type. + +@param[in] component_class + @parblock + Filter component class to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{component_class} as a common component class. +*/ +static inline +bt_component_class *bt_component_class_filter_as_component_class( + bt_component_class_filter *component_class) +{ + return __BT_UPCAST(bt_component_class, component_class); +} + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the \bt_sink_comp_cls + \bt_p{component_class} to the common #bt_component_class type. + +@param[in] component_class + @parblock + Sink component class to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{component_class} as a common component class. +*/ +static inline +bt_component_class *bt_component_class_sink_as_component_class( + bt_component_class_sink *component_class) +{ + return __BT_UPCAST(bt_component_class, component_class); +} + +/*! @} */ + +/*! @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* BABELTRACE2_GRAPH_COMPONENT_CLASS_DEV_H */ diff --git a/include/babeltrace2/graph/component-class-filter-const.h b/include/babeltrace2/graph/component-class-filter-const.h deleted file mode 100644 index f620e032..00000000 --- a/include/babeltrace2/graph/component-class-filter-const.h +++ /dev/null @@ -1,67 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_COMPONENT_CLASS_FILTER_CONST_H -#define BABELTRACE2_GRAPH_COMPONENT_CLASS_FILTER_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -static inline -const bt_component_class * -bt_component_class_filter_as_component_class_const( - const bt_component_class_filter *comp_cls_filter) -{ - return __BT_UPCAST_CONST(bt_component_class, comp_cls_filter); -} - -extern void bt_component_class_filter_get_ref( - const bt_component_class_filter *component_class_filter); - -extern void bt_component_class_filter_put_ref( - const bt_component_class_filter *component_class_filter); - -#define BT_COMPONENT_CLASS_FILTER_PUT_REF_AND_RESET(_var) \ - do { \ - bt_component_class_filter_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_COMPONENT_CLASS_FILTER_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_component_class_filter_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_COMPONENT_CLASS_FILTER_CONST_H */ diff --git a/include/babeltrace2/graph/component-class-filter.h b/include/babeltrace2/graph/component-class-filter.h deleted file mode 100644 index 9aa7a9c5..00000000 --- a/include/babeltrace2/graph/component-class-filter.h +++ /dev/null @@ -1,121 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_COMPONENT_CLASS_FILTER_H -#define BABELTRACE2_GRAPH_COMPONENT_CLASS_FILTER_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef bt_component_class_get_supported_mip_versions_method_status -(*bt_component_class_filter_get_supported_mip_versions_method)( - bt_self_component_class_filter *comp_class, - const bt_value *params, void *init_method_data, - bt_logging_level log_level, - bt_integer_range_set_unsigned *supported_versions); - -typedef bt_component_class_initialize_method_status -(*bt_component_class_filter_initialize_method)( - bt_self_component_filter *self_component, - bt_self_component_filter_configuration *config, - const bt_value *params, void *init_method_data); - -typedef void (*bt_component_class_filter_finalize_method)( - bt_self_component_filter *self_component); - -typedef bt_component_class_query_method_status -(*bt_component_class_filter_query_method)( - bt_self_component_class_filter *comp_class, - bt_private_query_executor *query_executor, - const char *object, const bt_value *params, - void *method_data, const bt_value **result); - -typedef bt_component_class_port_connected_method_status -(*bt_component_class_filter_input_port_connected_method)( - bt_self_component_filter *self_component, - bt_self_component_port_input *self_port, - const bt_port_output *other_port); - -typedef bt_component_class_port_connected_method_status -(*bt_component_class_filter_output_port_connected_method)( - bt_self_component_filter *self_component, - bt_self_component_port_output *self_port, - const bt_port_input *other_port); - -static inline -bt_component_class *bt_component_class_filter_as_component_class( - bt_component_class_filter *comp_cls_filter) -{ - return __BT_UPCAST(bt_component_class, comp_cls_filter); -} - -extern -bt_component_class_filter *bt_component_class_filter_create( - const char *name, - bt_message_iterator_class *message_iterator_class); - -extern bt_component_class_set_method_status -bt_component_class_filter_set_get_supported_mip_versions_method( - bt_component_class_filter *comp_class, - bt_component_class_filter_get_supported_mip_versions_method method); - -extern bt_component_class_set_method_status -bt_component_class_filter_set_initialize_method( - bt_component_class_filter *comp_class, - bt_component_class_filter_initialize_method method); - -extern bt_component_class_set_method_status -bt_component_class_filter_set_finalize_method( - bt_component_class_filter *comp_class, - bt_component_class_filter_finalize_method method); - -extern bt_component_class_set_method_status -bt_component_class_filter_set_input_port_connected_method( - bt_component_class_filter *comp_class, - bt_component_class_filter_input_port_connected_method method); - -extern bt_component_class_set_method_status -bt_component_class_filter_set_output_port_connected_method( - bt_component_class_filter *comp_class, - bt_component_class_filter_output_port_connected_method method); - -extern bt_component_class_set_method_status -bt_component_class_filter_set_query_method( - bt_component_class_filter *comp_class, - bt_component_class_filter_query_method method); - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_COMPONENT_CLASS_FILTER_H */ diff --git a/include/babeltrace2/graph/component-class-sink-const.h b/include/babeltrace2/graph/component-class-sink-const.h deleted file mode 100644 index c4879d07..00000000 --- a/include/babeltrace2/graph/component-class-sink-const.h +++ /dev/null @@ -1,67 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_COMPONENT_CLASS_SINK_CONST_H -#define BABELTRACE2_GRAPH_COMPONENT_CLASS_SINK_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -static inline -const bt_component_class * -bt_component_class_sink_as_component_class_const( - const bt_component_class_sink *comp_cls_sink) -{ - return __BT_UPCAST_CONST(bt_component_class, comp_cls_sink); -} - -extern void bt_component_class_sink_get_ref( - const bt_component_class_sink *component_class_sink); - -extern void bt_component_class_sink_put_ref( - const bt_component_class_sink *component_class_sink); - -#define BT_COMPONENT_CLASS_SINK_PUT_REF_AND_RESET(_var) \ - do { \ - bt_component_class_sink_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_COMPONENT_CLASS_SINK_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_component_class_sink_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_COMPONENT_CLASS_SINK_CONST_H */ diff --git a/include/babeltrace2/graph/component-class-sink.h b/include/babeltrace2/graph/component-class-sink.h deleted file mode 100644 index aa56d266..00000000 --- a/include/babeltrace2/graph/component-class-sink.h +++ /dev/null @@ -1,142 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_COMPONENT_CLASS_SINK_H -#define BABELTRACE2_GRAPH_COMPONENT_CLASS_SINK_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef bt_component_class_get_supported_mip_versions_method_status -(*bt_component_class_sink_get_supported_mip_versions_method)( - bt_self_component_class_sink *comp_class, - const bt_value *params, void *init_method_data, - bt_logging_level log_level, - bt_integer_range_set_unsigned *supported_versions); - -typedef bt_component_class_initialize_method_status -(*bt_component_class_sink_initialize_method)( - bt_self_component_sink *self_component, - bt_self_component_sink_configuration *config, - const bt_value *params, void *init_method_data); - -typedef void (*bt_component_class_sink_finalize_method)( - bt_self_component_sink *self_component); - -typedef bt_component_class_query_method_status -(*bt_component_class_sink_query_method)( - bt_self_component_class_sink *comp_class, - bt_private_query_executor *query_executor, - const char *object, const bt_value *params, - void *method_data, const bt_value **result); - -typedef bt_component_class_port_connected_method_status -(*bt_component_class_sink_input_port_connected_method)( - bt_self_component_sink *self_component, - bt_self_component_port_input *self_port, - const bt_port_output *other_port); - -typedef enum bt_component_class_sink_graph_is_configured_method_status { - BT_COMPONENT_CLASS_SINK_GRAPH_IS_CONFIGURED_METHOD_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_COMPONENT_CLASS_SINK_GRAPH_IS_CONFIGURED_METHOD_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, - BT_COMPONENT_CLASS_SINK_GRAPH_IS_CONFIGURED_METHOD_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, -} bt_component_class_sink_graph_is_configured_method_status; - -typedef bt_component_class_sink_graph_is_configured_method_status -(*bt_component_class_sink_graph_is_configured_method)( - bt_self_component_sink *self_component); - -typedef enum bt_component_class_sink_consume_method_status { - BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, - BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, - BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_AGAIN = __BT_FUNC_STATUS_AGAIN, - BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_END = __BT_FUNC_STATUS_END, -} bt_component_class_sink_consume_method_status; - -typedef bt_component_class_sink_consume_method_status -(*bt_component_class_sink_consume_method)( - bt_self_component_sink *self_component); - -static inline -bt_component_class *bt_component_class_sink_as_component_class( - bt_component_class_sink *comp_cls_sink) -{ - return __BT_UPCAST(bt_component_class, comp_cls_sink); -} - -extern bt_component_class_set_method_status -bt_component_class_sink_set_get_supported_mip_versions_method( - bt_component_class_sink *comp_class, - bt_component_class_sink_get_supported_mip_versions_method method); - -extern -bt_component_class_sink *bt_component_class_sink_create( - const char *name, - bt_component_class_sink_consume_method method); - -extern -bt_component_class_set_method_status -bt_component_class_sink_set_initialize_method( - bt_component_class_sink *comp_class, - bt_component_class_sink_initialize_method method); - -extern -bt_component_class_set_method_status -bt_component_class_sink_set_finalize_method( - bt_component_class_sink *comp_class, - bt_component_class_sink_finalize_method method); - -extern -bt_component_class_set_method_status -bt_component_class_sink_set_input_port_connected_method( - bt_component_class_sink *comp_class, - bt_component_class_sink_input_port_connected_method method); - -extern -bt_component_class_set_method_status -bt_component_class_sink_set_graph_is_configured_method( - bt_component_class_sink *comp_class, - bt_component_class_sink_graph_is_configured_method method); - -extern -bt_component_class_set_method_status -bt_component_class_sink_set_query_method( - bt_component_class_sink *comp_class, - bt_component_class_sink_query_method method); - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_COMPONENT_CLASS_SINK_H */ diff --git a/include/babeltrace2/graph/component-class-source-const.h b/include/babeltrace2/graph/component-class-source-const.h deleted file mode 100644 index 163eb31c..00000000 --- a/include/babeltrace2/graph/component-class-source-const.h +++ /dev/null @@ -1,67 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_COMPONENT_CLASS_SOURCE_CONST_H -#define BABELTRACE2_GRAPH_COMPONENT_CLASS_SOURCE_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -static inline -const bt_component_class * -bt_component_class_source_as_component_class_const( - const bt_component_class_source *comp_cls_source) -{ - return __BT_UPCAST_CONST(bt_component_class, comp_cls_source); -} - -extern void bt_component_class_source_get_ref( - const bt_component_class_source *component_class_source); - -extern void bt_component_class_source_put_ref( - const bt_component_class_source *component_class_source); - -#define BT_COMPONENT_CLASS_SOURCE_PUT_REF_AND_RESET(_var) \ - do { \ - bt_component_class_source_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_COMPONENT_CLASS_SOURCE_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_component_class_source_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_COMPONENT_CLASS_SOURCE_CONST_H */ diff --git a/include/babeltrace2/graph/component-class-source.h b/include/babeltrace2/graph/component-class-source.h deleted file mode 100644 index 10942f88..00000000 --- a/include/babeltrace2/graph/component-class-source.h +++ /dev/null @@ -1,110 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_COMPONENT_CLASS_SOURCE_H -#define BABELTRACE2_GRAPH_COMPONENT_CLASS_SOURCE_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef bt_component_class_get_supported_mip_versions_method_status -(*bt_component_class_source_get_supported_mip_versions_method)( - bt_self_component_class_source *comp_class, - const bt_value *params, void *init_method_data, - bt_logging_level log_level, - bt_integer_range_set_unsigned *supported_versions); - -typedef bt_component_class_initialize_method_status -(*bt_component_class_source_initialize_method)( - bt_self_component_source *self_component, - bt_self_component_source_configuration *config, - const bt_value *params, void *init_method_data); - -typedef void (*bt_component_class_source_finalize_method)( - bt_self_component_source *self_component); - -typedef bt_component_class_query_method_status -(*bt_component_class_source_query_method)( - bt_self_component_class_source *comp_class, - bt_private_query_executor *query_executor, - const char *object, const bt_value *params, - void *method_data, const bt_value **result); - -typedef bt_component_class_port_connected_method_status -(*bt_component_class_source_output_port_connected_method)( - bt_self_component_source *self_component, - bt_self_component_port_output *self_port, - const bt_port_input *other_port); - -static inline -bt_component_class *bt_component_class_source_as_component_class( - bt_component_class_source *comp_cls_source) -{ - return __BT_UPCAST(bt_component_class, comp_cls_source); -} - -extern -bt_component_class_source *bt_component_class_source_create( - const char *name, - bt_message_iterator_class *message_iterator_class); - -extern bt_component_class_set_method_status -bt_component_class_source_set_get_supported_mip_versions_method( - bt_component_class_source *comp_class, - bt_component_class_source_get_supported_mip_versions_method method); - -extern bt_component_class_set_method_status -bt_component_class_source_set_initialize_method( - bt_component_class_source *comp_class, - bt_component_class_source_initialize_method method); - -extern bt_component_class_set_method_status -bt_component_class_source_set_finalize_method( - bt_component_class_source *comp_class, - bt_component_class_source_finalize_method method); - -extern bt_component_class_set_method_status -bt_component_class_source_set_output_port_connected_method( - bt_component_class_source *comp_class, - bt_component_class_source_output_port_connected_method method); - -extern bt_component_class_set_method_status -bt_component_class_source_set_query_method( - bt_component_class_source *comp_class, - bt_component_class_source_query_method method); - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_COMPONENT_CLASS_SOURCE_H */ diff --git a/include/babeltrace2/graph/component-class.h b/include/babeltrace2/graph/component-class.h index b8495d45..98f66fbb 100644 --- a/include/babeltrace2/graph/component-class.h +++ b/include/babeltrace2/graph/component-class.h @@ -33,53 +33,855 @@ extern "C" { #endif -typedef enum bt_component_class_get_supported_mip_versions_method_status { - BT_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, - BT_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, -} bt_component_class_get_supported_mip_versions_method_status; - -typedef enum bt_component_class_initialize_method_status { - BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, - BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, -} bt_component_class_initialize_method_status; - -typedef enum bt_component_class_port_connected_method_status { - BT_COMPONENT_CLASS_PORT_CONNECTED_METHOD_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_COMPONENT_CLASS_PORT_CONNECTED_METHOD_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, - BT_COMPONENT_CLASS_PORT_CONNECTED_METHOD_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, -} bt_component_class_port_connected_method_status; - -typedef enum bt_component_class_query_method_status { - BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_AGAIN = __BT_FUNC_STATUS_AGAIN, - BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, - BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, - BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_UNKNOWN_OBJECT = __BT_FUNC_STATUS_UNKNOWN_OBJECT, -} bt_component_class_query_method_status; - -typedef enum bt_component_class_set_method_status { - BT_COMPONENT_CLASS_SET_METHOD_STATUS_OK = __BT_FUNC_STATUS_OK, -} bt_component_class_set_method_status; - -typedef enum bt_component_class_set_description_status { - BT_COMPONENT_CLASS_SET_DESCRIPTION_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_COMPONENT_CLASS_SET_DESCRIPTION_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, -} bt_component_class_set_description_status; - -extern bt_component_class_set_description_status -bt_component_class_set_description(bt_component_class *component_class, - const char *description); - -typedef enum bt_component_class_set_help_status { - BT_COMPONENT_CLASS_SET_HELP_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_COMPONENT_CLASS_SET_HELP_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, -} bt_component_class_set_help_status; - -extern bt_component_class_set_help_status bt_component_class_set_help( - bt_component_class *component_class, - const char *help); +/*! +@defgroup api-comp-cls Component classes +@ingroup api-graph + +@brief + Source, filter, and sink component classes (non-development). + +A component class is the class of a \bt_comp: + +@image html component.png + +@attention + This module (component class API) offers basic, read-only functions + to get component class properties. To \em create a component class, + see \ref api-comp-cls-dev or \ref api-plugin-dev. + +You can instantiate a given component class many times, with different +initialization parameters, to create many components with the +bt_graph_add_*_component*() functions (see \ref api-graph). + +There are two ways to obtain a component class: + +- Create one programatically: see \ref api-comp-cls-dev. + +- Borrow one from a \bt_plugin. + + Note that, as of \bt_name_version_min_maj, you cannot access a + component class's plugin, if any. + +A component class is a \ref api-fund-shared-object "shared object": get +a new reference with bt_component_class_get_ref() and put an existing +reference with bt_component_class_put_ref(). + +The common C type of a component class is #bt_component_class. + +There are three types of component classes: + +
    +
    \anchor api-comp-cls-src Source component class
    +
    + A source component class instance (a \bt_src_comp) \bt_msg_iter + emits fresh \bt_p_msg. + + A source component class's specific type is + #bt_component_class_source and its type enumerator is + #BT_COMPONENT_CLASS_TYPE_SOURCE. + + \ref api-fund-c-typing "Upcast" the #bt_component_class_source type + to the #bt_component_class type with + bt_component_class_source_as_component_class_const(). + + Get a new source component class reference with Use + bt_component_class_source_get_ref() and put an existing one with + bt_component_class_source_put_ref(). +
    + +
    \anchor api-comp-cls-flt Filter component class
    +
    + A filter component class instance (a \bt_flt_comp) message iterator + emits fresh and transformed messages. It can also discard + existing messages. + + A filter component class's specific type is + #bt_component_class_filter and its type enumerator is + #BT_COMPONENT_CLASS_TYPE_FILTER. + + \ref api-fund-c-typing "Upcast" the #bt_component_class_filter type + to the #bt_component_class type with + bt_component_class_filter_as_component_class_const(). + + Get a new filter component class reference with + bt_component_class_filter_get_ref() and put an existing one with + bt_component_class_filter_put_ref(). +
    + +
    \anchor api-comp-cls-sink Sink component class
    +
    + A sink component class instance (a \bt_sink_comp) consumes messages + from a source or filter message iterator. + + A filter component class's specific type is #bt_component_class_sink + and its type enumerator is #BT_COMPONENT_CLASS_TYPE_SINK. + + \ref api-fund-c-typing "Upcast" the #bt_component_class_sink type to + the #bt_component_class type with + bt_component_class_sink_as_component_class_const(). + + Get a new sink component class reference with + bt_component_class_sink_get_ref() and put an existing one with + bt_component_class_sink_put_ref(). +
    +
    + +Get a component's class type enumerator with +bt_component_class_get_type(). You can also use the +bt_component_class_is_source(), bt_component_class_is_filter(), and +bt_component_class_is_sink() helper functions. + +

    Properties

    + +A component class has the following common properties: + +
    +
    + \anchor api-comp-cls-prop-name + Name +
    +
    + Name of the component class. + + Within a \bt_plugin, for a given component class type, each + component class has a unique name. + + Get a component class's name with bt_component_class_get_name(). +
    + +
    + \anchor api-comp-cls-prop-descr + \bt_dt_opt Description +
    +
    + Textual description of the component class. + + Get a component class's description with + bt_component_class_get_description(). +
    + +
    + \anchor api-comp-cls-prop-help + \bt_dt_opt Help text +
    +
    + Help text of the component class. + + Get a component class's help text with + bt_component_class_get_help(). +
    +
    +*/ + +/*! @{ */ + +/*! +@name Types +@{ + +@typedef struct bt_component_class bt_component_class; + +@brief + Component class. + +@typedef struct bt_component_class_source bt_component_class_source; + +@brief + \bt_c_src_comp_cls. + +@typedef struct bt_component_class_filter bt_component_class_filter; + +@brief + \bt_c_flt_comp_cls. + +@typedef struct bt_component_class_sink bt_component_class_sink; + +@brief + \bt_c_sink_comp_cls. + +@} +*/ + +/*! +@name Type query +@{ +*/ + +/*! +@brief + Component class type enumerators. +*/ +typedef enum bt_component_class_type { + /*! + @brief + \bt_c_src_comp_cls. + */ + BT_COMPONENT_CLASS_TYPE_SOURCE = 1 << 0, + + /*! + @brief + \bt_c_flt_comp_cls. + */ + BT_COMPONENT_CLASS_TYPE_FILTER = 1 << 1, + + /*! + @brief + \bt_c_sink_comp_cls. + */ + BT_COMPONENT_CLASS_TYPE_SINK = 1 << 2, +} bt_component_class_type; + +/*! +@brief + Returns the type enumerator of the component class + \bt_p{component_class}. + +@param[in] component_class + Component class of which to get the type enumerator. + +@returns + Type enumerator of \bt_p{component_class}. + +@bt_pre_not_null{component_class} + +@sa bt_component_class_is_source() — + Returns whether or not a component class is a \bt_src_comp_cls. +@sa bt_component_class_is_filter() — + Returns whether or not a component class is a \bt_flt_comp_cls. +@sa bt_component_class_is_sink() — + Returns whether or not a component class is a \bt_sink_comp_cls. +*/ +extern bt_component_class_type bt_component_class_get_type( + const bt_component_class *component_class); + +/*! +@brief + Returns whether or not the component class \bt_p{component_class} + is a \bt_src_comp_cls. + +@param[in] component_class + Component class to check. + +@returns + #BT_TRUE if \bt_p{component_class} is a source component class. + +@bt_pre_not_null{component_class} + +@sa bt_component_class_get_type() — + Returns the type enumerator of a component class. +*/ +static inline +bt_bool bt_component_class_is_source( + const bt_component_class *component_class) +{ + return bt_component_class_get_type(component_class) == + BT_COMPONENT_CLASS_TYPE_SOURCE; +} + +/*! +@brief + Returns whether or not the component class \bt_p{component_class} + is a \bt_flt_comp_cls. + +@param[in] component_class + Component class to check. + +@returns + #BT_TRUE if \bt_p{component_class} is a filter component class. + +@bt_pre_not_null{component_class} + +@sa bt_component_class_get_type() — + Returns the type enumerator of a component class. +*/ +static inline +bt_bool bt_component_class_is_filter( + const bt_component_class *component_class) +{ + return bt_component_class_get_type(component_class) == + BT_COMPONENT_CLASS_TYPE_FILTER; +} + +/*! +@brief + Returns whether or not the component class \bt_p{component_class} + is a \bt_sink_comp_cls. + +@param[in] component_class + Component class to check. + +@returns + #BT_TRUE if \bt_p{component_class} is a sink component class. + +@bt_pre_not_null{component_class} + +@sa bt_component_class_get_type() — + Returns the type enumerator of a component class. +*/ +static inline +bt_bool bt_component_class_is_sink( + const bt_component_class *component_class) +{ + return bt_component_class_get_type(component_class) == + BT_COMPONENT_CLASS_TYPE_SINK; +} + +/*! @} */ + +/*! +@name Properties +@{ +*/ + +/*! +@brief + Returns the name of the component class \bt_p{component_class}. + +See the \ref api-comp-cls-prop-name "name" property. + +@param[in] component_class + Component class of which to get the name. + +@returns + @parblock + Name of \bt_p{component_class}. + + The returned pointer remains valid as long as \bt_p{component_class} + exists. + @endparblock + +@bt_pre_not_null{component_class} +*/ +extern const char *bt_component_class_get_name( + const bt_component_class *component_class); + +/*! +@brief + Returns the description of the component class + \bt_p{component_class}. + +See the \ref api-comp-cls-prop-descr "description" property. + +@param[in] component_class + Component class of which to get the description. + +@returns + @parblock + Description of \bt_p{component_class}, or \c NULL if none. + + The returned pointer remains valid as long as \bt_p{component_class} + exists. + @endparblock + +@bt_pre_not_null{component_class} +*/ +extern const char *bt_component_class_get_description( + const bt_component_class *component_class); + +/*! +@brief + Returns the help text of the component class \bt_p{component_class}. + +See the \ref api-comp-cls-prop-help "help text" property. + +@param[in] component_class + Component class of which to get the help text. + +@returns + @parblock + Help text of \bt_p{component_class}, or \c NULL if none. + + The returned pointer remains valid as long as \bt_p{component_class} + exists. + @endparblock + +@bt_pre_not_null{component_class} +*/ +extern const char *bt_component_class_get_help( + const bt_component_class *component_class); + +/*! @} */ + +/*! +@name Common reference count +@{ +*/ + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the component class \bt_p{component_class}. + +@param[in] component_class + @parblock + Component class of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_component_put_ref() — + Decrements the reference count of a component class. +*/ +extern void bt_component_class_get_ref( + const bt_component_class *component_class); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the component class \bt_p{component_class}. + +@param[in] component_class + @parblock + Component class of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_component_get_ref() — + Increments the reference count of a component class. +*/ +extern void bt_component_class_put_ref( + const bt_component_class *component_class); + +/*! +@brief + Decrements the reference count of the component class + \bt_p{_component_class}, and then sets \bt_p{_component_class} + to \c NULL. + +@param _component_class + @parblock + Component class of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_component_class} +*/ +#define BT_COMPONENT_CLASS_PUT_REF_AND_RESET(_component_class) \ + do { \ + bt_component_class_put_ref(_component_class); \ + (_component_class) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the component class \bt_p{_dst}, + sets \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} + to \c NULL. + +This macro effectively moves a component class reference from the +expression +\bt_p{_src} to the expression \bt_p{_dst}, putting the existing +\bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_COMPONENT_CLASS_MOVE_REF(_dst, _src) \ + do { \ + bt_component_class_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! +@name Source component class upcast +@{ +*/ + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the \bt_src_comp_cls + \bt_p{component_class} to the common #bt_component_class type. + +@param[in] component_class + @parblock + Source component class to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{component_class} as a common component class. +*/ +static inline +const bt_component_class * +bt_component_class_source_as_component_class_const( + const bt_component_class_source *component_class) +{ + return __BT_UPCAST_CONST(bt_component_class, component_class); +} + +/*! @} */ + +/*! +@name Source component class reference count +@{ +*/ + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the \bt_src_comp_cls \bt_p{component_class}. + +@param[in] component_class + @parblock + Source component class of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_component_class_source_put_ref() — + Decrements the reference count of a source component class. +*/ +extern void bt_component_class_source_get_ref( + const bt_component_class_source *component_class); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the \bt_src_comp_cls \bt_p{component_class}. + +@param[in] component_class + @parblock + Source component class of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_component_class_source_get_ref() — + Increments the reference count of a source component class. +*/ +extern void bt_component_class_source_put_ref( + const bt_component_class_source *component_class); + +/*! +@brief + Decrements the reference count of the \bt_src_comp_cls + \bt_p{_component_class}, and then sets \bt_p{_component_class} to + \c NULL. + +@param _component_class + @parblock + Source component class of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_component_class} +*/ +#define BT_COMPONENT_CLASS_SOURCE_PUT_REF_AND_RESET(_component_class) \ + do { \ + bt_component_class_source_put_ref(_component_class); \ + (_component_class) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the \bt_src_comp_cls \bt_p{_dst}, + sets \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} to + \c NULL. + +This macro effectively moves a source component class reference from the +expression \bt_p{_src} to the expression \bt_p{_dst}, putting the +existing \bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_COMPONENT_CLASS_SOURCE_MOVE_REF(_dst, _src) \ + do { \ + bt_component_class_source_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! +@name Filter component class upcast +@{ +*/ + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the \bt_flt_comp_cls + \bt_p{component_class} to the common #bt_component_class type. + +@param[in] component_class + @parblock + Filter component class to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{component_class} as a common component class. +*/ +static inline +const bt_component_class * +bt_component_class_filter_as_component_class_const( + const bt_component_class_filter *component_class) +{ + return __BT_UPCAST_CONST(bt_component_class, component_class); +} + +/*! @} */ + +/*! +@name Filter component class reference count +@{ +*/ + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the \bt_flt_comp_cls \bt_p{component_class}. + +@param[in] component_class + @parblock + Filter component class of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_component_class_filter_put_ref() — + Decrements the reference count of a filter component class. +*/ +extern void bt_component_class_filter_get_ref( + const bt_component_class_filter *component_class); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the \bt_flt_comp_cls \bt_p{component_class}. + +@param[in] component_class + @parblock + Filter component class of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_component_class_filter_get_ref() — + Increments the reference count of a filter component class. +*/ +extern void bt_component_class_filter_put_ref( + const bt_component_class_filter *component_class); + +/*! +@brief + Decrements the reference count of the \bt_flt_comp_cls + \bt_p{_component_class}, and then sets \bt_p{_component_class} to + \c NULL. + +@param _component_class + @parblock + Filter component class of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_component_class} +*/ +#define BT_COMPONENT_CLASS_FILTER_PUT_REF_AND_RESET(_component_class) \ + do { \ + bt_component_class_filter_put_ref(_component_class); \ + (_component_class) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the \bt_flt_comp_cls \bt_p{_dst}, + setsc \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} to + \c NULL. + +This macro effectively moves a filter component class reference from the +expression \bt_p{_src} to the expression \bt_p{_dst}, putting the +existing \bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_COMPONENT_CLASS_FILTER_MOVE_REF(_dst, _src) \ + do { \ + bt_component_class_filter_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! +@name Sink component class upcast +@{ +*/ + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the \bt_sink_comp_cls + \bt_p{component_class} to the common #bt_component_class type. + +@param[in] component_class + @parblock + Sink component class to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{component_class} as a common component class. +*/ +static inline +const bt_component_class * +bt_component_class_sink_as_component_class_const( + const bt_component_class_sink *component_class) +{ + return __BT_UPCAST_CONST(bt_component_class, component_class); +} + +/*! @} */ + +/*! +@name Sink component class reference count +@{ +*/ + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the \bt_sink_comp_cls \bt_p{component_class}. + +@param[in] component_class + @parblock + Sink component class of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_component_class_sink_put_ref() — + Decrements the reference count of a sink component class. +*/ +extern void bt_component_class_sink_get_ref( + const bt_component_class_sink *component_class); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the \bt_sink_comp_cls \bt_p{component_class}. + +@param[in] component_class + @parblock + Sink component class of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_component_class_sink_get_ref() — + Increments the reference count of a sink component class. +*/ +extern void bt_component_class_sink_put_ref( + const bt_component_class_sink *component_class); + +/*! +@brief + Decrements the reference count of the \bt_sink_comp_cls + \bt_p{_component_class}, and then sets \bt_p{_component_class} to + \c NULL. + +@param _component_class + @parblock + Sink component class of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_component_class} +*/ +#define BT_COMPONENT_CLASS_SINK_PUT_REF_AND_RESET(_component_class) \ + do { \ + bt_component_class_sink_put_ref(_component_class); \ + (_component_class) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the \bt_sink_comp_cls \bt_p{_dst}, + sets \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} to + \c NULL. + +This macro effectively moves a sink component class reference from the +expression \bt_p{_src} to the expression \bt_p{_dst}, putting the +existing \bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_COMPONENT_CLASS_SINK_MOVE_REF(_dst, _src) \ + do { \ + bt_component_class_sink_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! @} */ #ifdef __cplusplus } diff --git a/include/babeltrace2/graph/component-const.h b/include/babeltrace2/graph/component-const.h deleted file mode 100644 index 11554b5e..00000000 --- a/include/babeltrace2/graph/component-const.h +++ /dev/null @@ -1,103 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_COMPONENT_CONST_H -#define BABELTRACE2_GRAPH_COMPONENT_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Get component's name. - * - * @param component Component instance of which to get the name - * @returns Returns a pointer to the component's name - */ -extern const char *bt_component_get_name(const bt_component *component); - -extern bt_logging_level bt_component_get_logging_level( - const bt_component *component); - -/** - * Get component's class. - * - * @param component Component instance of which to get the class - * @returns The component's class - */ -extern const bt_component_class *bt_component_borrow_class_const( - const bt_component *component); - -extern bt_component_class_type bt_component_get_class_type( - const bt_component *component); - -static inline -bt_bool bt_component_is_source(const bt_component *component) -{ - return bt_component_get_class_type(component) == - BT_COMPONENT_CLASS_TYPE_SOURCE; -} - -static inline -bt_bool bt_component_is_filter(const bt_component *component) -{ - return bt_component_get_class_type(component) == - BT_COMPONENT_CLASS_TYPE_FILTER; -} - -static inline -bt_bool bt_component_is_sink(const bt_component *component) -{ - return bt_component_get_class_type(component) == - BT_COMPONENT_CLASS_TYPE_SINK; -} - -extern void bt_component_get_ref(const bt_component *component); - -extern void bt_component_put_ref(const bt_component *component); - -#define BT_COMPONENT_PUT_REF_AND_RESET(_var) \ - do { \ - bt_component_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_COMPONENT_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_component_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_COMPONENT_CONST_H */ diff --git a/include/babeltrace2/graph/component-descriptor-set-const.h b/include/babeltrace2/graph/component-descriptor-set-const.h deleted file mode 100644 index 4fdf49a1..00000000 --- a/include/babeltrace2/graph/component-descriptor-set-const.h +++ /dev/null @@ -1,59 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_COMPONENT_DESCRIPTOR_SET_CONST_H -#define BABELTRACE2_GRAPH_COMPONENT_DESCRIPTOR_SET_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern void bt_component_descriptor_set_get_ref( - const bt_component_descriptor_set *comp_descriptor_set); - -extern void bt_component_descriptor_set_put_ref( - const bt_component_descriptor_set *comp_descriptor_set); - -#define BT_COMPONENT_DESCRIPTOR_SET_PUT_REF_AND_RESET(_var) \ - do { \ - bt_component_descriptor_set_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_COMPONENT_DESCRIPTOR_SET_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_component_descriptor_set_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_COMPONENT_DESCRIPTOR_SET_CONST_H */ diff --git a/include/babeltrace2/graph/component-descriptor-set.h b/include/babeltrace2/graph/component-descriptor-set.h index e551a70b..b9057209 100644 --- a/include/babeltrace2/graph/component-descriptor-set.h +++ b/include/babeltrace2/graph/component-descriptor-set.h @@ -34,24 +34,269 @@ extern "C" { #endif +/*! +@defgroup api-comp-descr-set Component descriptor set +@ingroup api-graph + +@brief + Set of descriptors of prospective \bt_p_comp to use with + bt_get_greatest_operative_mip_version(). + +A component descriptor set +is an \em unordered set of component descriptors. + +A component descriptor describes a +prospective \bt_comp, that is, everything that is needed to +\ref api-graph-lc-add "instantiate a component class" within a +trace processing \bt_graph without actually doing it: + +- The component class to instantiate, which you would + pass as the \bt_p{component_class} parameter of one of the + bt_graph_add_*_component*() functions. + +- The initialization parameters, which you + would pass as the \bt_p{params} parameter of one of the + bt_graph_add_*_component*() functions. + +- The initialization method data, which you would pass + as the \bt_p{initialize_method_data} parameter of one of the + bt_graph_add_*_component_with_initialize_method_data() + functions. + +As of \bt_name_version_min_maj, the only use case of a component +descriptor set is bt_get_greatest_operative_mip_version(). This +function computes the greatest \bt_mip version which +you can use to create a trace processing graph to which you intend +to \ref api-graph-lc-add "add components" described by a set of +component descriptors. + +A component descriptor set is a +\ref api-fund-shared-object "shared object": get a new reference with +bt_component_descriptor_set_get_ref() and put an existing reference with +bt_component_descriptor_set_put_ref(). + +Create an empty component descriptor set with +bt_component_descriptor_set_create(). + +Add a component descriptor to a component descriptor set with +bt_component_descriptor_set_add_descriptor() and +bt_component_descriptor_set_add_descriptor_with_initialize_method_data(). +*/ + +/*! @{ */ + +/*! +@name Type +@{ + +@typedef struct bt_component_descriptor_set bt_component_descriptor_set; + +@brief + Component descriptor set. + +@} +*/ + +/*! +@name Creation +@{ +*/ + + +/*! +@brief + Creates an empty component descriptor set. + +@returns + New component descriptor set reference, or \c NULL on memory error. +*/ extern bt_component_descriptor_set *bt_component_descriptor_set_create(void); +/*! +@brief + Status codes for bt_component_descriptor_set_add_descriptor() + and + bt_component_descriptor_set_add_descriptor_with_initialize_method_data(). +*/ typedef enum bt_component_descriptor_set_add_descriptor_status { + /*! + @brief + Success. + */ BT_COMPONENT_DESCRIPTOR_SET_ADD_DESCRIPTOR_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ BT_COMPONENT_DESCRIPTOR_SET_ADD_DESCRIPTOR_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, } bt_component_descriptor_set_add_descriptor_status; +/*! @} */ + +/*! +@name Component descriptor adding +@{ +*/ + +/*! +@brief + Alias of + bt_component_descriptor_set_add_descriptor_with_initialize_method_data() + with the \bt_p{initialize_method_data} parameter set to \c NULL. +*/ extern bt_component_descriptor_set_add_descriptor_status bt_component_descriptor_set_add_descriptor( - bt_component_descriptor_set *comp_descriptor_set, + bt_component_descriptor_set *component_descriptor_set, const bt_component_class *component_class, const bt_value *params); +/*! +@brief + Adds a descriptor of a \bt_comp which would be an instance of the + \bt_comp_cls \bt_p{component_class}, would receive the parameters + \bt_p{params} and the method data \bt_p{initialize_method_data} at + initialization time, to the component descriptor set + \bt_p{component_descriptor_set}. + +@param[in] component_descriptor_set + Component descriptor set to which to add a component descriptor. +@param[in] component_class + \bt_c_comp_cls which would be instantiated to create the + described component. +@param[in] params + @parblock + Parameters which would be passed to the initialization method of + the described component as the \bt_p{params} parameter. + + Can be \c NULL, in which case it is equivalent to passing an empty + \bt_map_val. + @endparblock +@param[in] initialize_method_data + User data which would be passed to the initialization method of + the described component as the \bt_p{initialize_method_data} + parameter. + +@retval #BT_COMPONENT_DESCRIPTOR_SET_ADD_DESCRIPTOR_STATUS_OK + Success. +@retval #BT_COMPONENT_DESCRIPTOR_SET_ADD_DESCRIPTOR_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{component_descriptor_set} +@bt_pre_not_null{component_class} +@pre + \bt_p{params} is a \bt_map_val (bt_value_is_map() returns #BT_TRUE) + or is \c NULL. + +@bt_post_success_frozen{component_class} +@bt_post_success_frozen{params} +*/ extern bt_component_descriptor_set_add_descriptor_status bt_component_descriptor_set_add_descriptor_with_initialize_method_data( - bt_component_descriptor_set *comp_descriptor_set, + bt_component_descriptor_set *component_descriptor_set, const bt_component_class *component_class, - const bt_value *params, void *init_method_data); + const bt_value *params, void *initialize_method_data); + +/*! @} */ + +/*! +@name Reference count +@{ +*/ + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the component descriptor set \bt_p{component_descriptor_set}. + +@param[in] component_descriptor_set + @parblock + Component descriptor set of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_component_descriptor_set_put_ref() — + Decrements the reference count of a component descriptor set. +*/ +extern void bt_component_descriptor_set_get_ref( + const bt_component_descriptor_set *component_descriptor_set); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the component descriptor set \bt_p{component_descriptor_set}. + +@param[in] component_descriptor_set + @parblock + Component descriptor set of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_component_descriptor_set_get_ref() — + Increments the reference count of a component descriptor set. +*/ +extern void bt_component_descriptor_set_put_ref( + const bt_component_descriptor_set *component_descriptor_set); + +/*! +@brief + Decrements the reference count of the component descriptor set + \bt_p{_component_descriptor_set}, and then sets + \bt_p{_component_descriptor_set} to \c NULL. + +@param _component_descriptor_set + @parblock + Component descriptor set of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_component_descriptor_set} +*/ +#define BT_COMPONENT_DESCRIPTOR_SET_PUT_REF_AND_RESET(_component_descriptor_set) \ + do { \ + bt_component_descriptor_set_put_ref(_component_descriptor_set); \ + (_component_descriptor_set) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the component descriptor set + \bt_p{_dst}, sets \bt_p{_dst} to \bt_p{_src}, and then sets + \bt_p{_src} to \c NULL. + +This macro effectively moves a component descriptor set reference from +the expression \bt_p{_src} to the expression \bt_p{_dst}, putting the +existing \bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_COMPONENT_DESCRIPTOR_SET_MOVE_REF(_dst, _src) \ + do { \ + bt_component_descriptor_set_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! @} */ #ifdef __cplusplus } diff --git a/include/babeltrace2/graph/component-filter-const.h b/include/babeltrace2/graph/component-filter-const.h deleted file mode 100644 index 55ddbd75..00000000 --- a/include/babeltrace2/graph/component-filter-const.h +++ /dev/null @@ -1,94 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_COMPONENT_FILTER_CONST_H -#define BABELTRACE2_GRAPH_COMPONENT_FILTER_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -static inline -const bt_component *bt_component_filter_as_component_const( - const bt_component_filter *component) -{ - return __BT_UPCAST_CONST(bt_component, component); -} - -extern const bt_component_class_filter * -bt_component_filter_borrow_class_const( - const bt_component_filter *component); - -extern uint64_t bt_component_filter_get_input_port_count( - const bt_component_filter *component); - -extern const bt_port_input * -bt_component_filter_borrow_input_port_by_name_const( - const bt_component_filter *component, const char *name); - -extern const bt_port_input * -bt_component_filter_borrow_input_port_by_index_const( - const bt_component_filter *component, uint64_t index); - -extern uint64_t bt_component_filter_get_output_port_count( - const bt_component_filter *component); - -extern const bt_port_output * -bt_component_filter_borrow_output_port_by_name_const( - const bt_component_filter *component, const char *name); - -extern const bt_port_output * -bt_component_filter_borrow_output_port_by_index_const( - const bt_component_filter *component, uint64_t index); - -extern void bt_component_filter_get_ref( - const bt_component_filter *component_filter); - -extern void bt_component_filter_put_ref( - const bt_component_filter *component_filter); - -#define BT_COMPONENT_FILTER_PUT_REF_AND_RESET(_var) \ - do { \ - bt_component_filter_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_COMPONENT_FILTER_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_component_filter_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_COMPONENT_FILTER_CONST_H */ diff --git a/include/babeltrace2/graph/component-sink-const.h b/include/babeltrace2/graph/component-sink-const.h deleted file mode 100644 index 64e8b050..00000000 --- a/include/babeltrace2/graph/component-sink-const.h +++ /dev/null @@ -1,83 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_COMPONENT_SINK_CONST_H -#define BABELTRACE2_GRAPH_COMPONENT_SINK_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -static inline -const bt_component *bt_component_sink_as_component_const( - const bt_component_sink *component) -{ - return __BT_UPCAST_CONST(bt_component, component); -} - -extern const bt_component_class_sink * -bt_component_sink_borrow_class_const( - const bt_component_sink *component); - -extern uint64_t bt_component_sink_get_input_port_count( - const bt_component_sink *component); - -extern const bt_port_input * -bt_component_sink_borrow_input_port_by_name_const( - const bt_component_sink *component, const char *name); - -extern const bt_port_input * -bt_component_sink_borrow_input_port_by_index_const( - const bt_component_sink *component, uint64_t index); - -extern void bt_component_sink_get_ref( - const bt_component_sink *component_sink); - -extern void bt_component_sink_put_ref( - const bt_component_sink *component_sink); - -#define BT_COMPONENT_SINK_PUT_REF_AND_RESET(_var) \ - do { \ - bt_component_sink_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_COMPONENT_SINK_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_component_sink_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_COMPONENT_SINK_CONST_H */ diff --git a/include/babeltrace2/graph/component-source-const.h b/include/babeltrace2/graph/component-source-const.h deleted file mode 100644 index 85f89236..00000000 --- a/include/babeltrace2/graph/component-source-const.h +++ /dev/null @@ -1,83 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_COMPONENT_SOURCE_CONST_H -#define BABELTRACE2_GRAPH_COMPONENT_SOURCE_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -static inline -const bt_component *bt_component_source_as_component_const( - const bt_component_source *component) -{ - return __BT_UPCAST_CONST(bt_component, component); -} - -extern const bt_component_class_source * -bt_component_source_borrow_class_const( - const bt_component_source *component); - -extern uint64_t bt_component_source_get_output_port_count( - const bt_component_source *component); - -extern const bt_port_output * -bt_component_source_borrow_output_port_by_name_const( - const bt_component_source *component, const char *name); - -extern const bt_port_output * -bt_component_source_borrow_output_port_by_index_const( - const bt_component_source *component, uint64_t index); - -extern void bt_component_source_get_ref( - const bt_component_source *component_source); - -extern void bt_component_source_put_ref( - const bt_component_source *component_source); - -#define BT_COMPONENT_SOURCE_PUT_REF_AND_RESET(_var) \ - do { \ - bt_component_source_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_COMPONENT_SOURCE_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_component_source_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_COMPONENT_SOURCE_CONST_H */ diff --git a/include/babeltrace2/graph/component.h b/include/babeltrace2/graph/component.h new file mode 100644 index 00000000..82aee896 --- /dev/null +++ b/include/babeltrace2/graph/component.h @@ -0,0 +1,1280 @@ +#ifndef BABELTRACE2_GRAPH_COMPONENT_H +#define BABELTRACE2_GRAPH_COMPONENT_H + +/* + * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef __BT_IN_BABELTRACE_H +# error "Please include instead." +#endif + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*! +@defgroup api-comp Components +@ingroup api-graph + +@brief + Source, filter, and sink components: nodes in a trace processing + \bt_graph. + +A component is a node within a trace +processing \bt_graph: + +@image html component.png + +A component is \bt_comp_cls instance. Borrow the class of a +component with bt_component_borrow_class_const(), +bt_component_source_borrow_class_const(), +bt_component_filter_borrow_class_const(), and +bt_component_sink_borrow_class_const(). + +A component is a \ref api-fund-shared-object "shared object": get a new +reference with bt_component_get_ref() and put an existing reference with +bt_component_put_ref(). + +The common C type of a port is #bt_component. + +There are three types of components, which come from the three types +of component classes: + +
    +
    \anchor api-comp-src Source component
    +
    + A source component's \bt_msg_iter emits fresh \bt_p_msg. + + A source component's specific type is #bt_component_source and its + class's type enumerator is #BT_COMPONENT_CLASS_TYPE_SOURCE. + + \ref api-fund-c-typing "Upcast" the #bt_component_source type to the + #bt_component type with bt_component_source_as_component_const(). + + Get a new source component reference with + bt_component_source_get_ref() and put an existing one with + bt_component_source_put_ref(). + + A source component has \bt_p_oport only. + + Get the number of output ports a source component has with + bt_component_source_get_output_port_count(). + + Borrow a source component's output port by index with + bt_component_source_borrow_output_port_by_index_const() or by name + with bt_component_source_borrow_output_port_by_name_const(). +
    + +
    \anchor api-comp-flt Filter component
    +
    + A filter component's message iterator emits fresh and transformed + messages. It can also discard existing messages. + + A filter component's specific type is #bt_component_filter and its + class's type enumerator is #BT_COMPONENT_CLASS_TYPE_FILTER. + + \ref api-fund-c-typing "Upcast" the #bt_component_filter type to the + #bt_component type with bt_component_filter_as_component_const(). + + Get a new filter component reference with + bt_component_filter_get_ref() and put an existing one with + bt_component_filter_put_ref(). + + A filter component has \bt_p_iport and \bt_p_oport. + + Get the number of output ports a filter component has with + bt_component_filter_get_output_port_count(). + + Borrow a filter component's output port by index with + bt_component_filter_borrow_output_port_by_index_const() or by name + with bt_component_filter_borrow_output_port_by_name_const(). + + Get the number of input ports a filter component has with + bt_component_filter_get_input_port_count(). + + Borrow a filter component's input port by index with + bt_component_filter_borrow_input_port_by_index_const() or by name + with bt_component_filter_borrow_input_port_by_name_const(). +
    + +
    \anchor api-comp-sink Sink component
    +
    + A sink component consumes messages from a source or filter message + iterator. + + A filter component's specific type is #bt_component_sink and its + class's type enumerator is #BT_COMPONENT_CLASS_TYPE_SINK. + + \ref api-fund-c-typing "Upcast" the #bt_component_sink type to the + #bt_component type with bt_component_sink_as_component_const(). + + Get a new sink component reference with bt_component_sink_get_ref() + and put an existing one with bt_component_sink_put_ref(). + + A sink component has \bt_p_iport only. + + Get the number of input ports a sink component has with + bt_component_sink_get_input_port_count(). + + Borrow a sink component's input port by index with + bt_component_sink_borrow_input_port_by_index_const() or by name + with bt_component_sink_borrow_input_port_by_name_const(). +
    +
    + +Get a component's class type enumerator with +bt_component_get_class_type(). You can also use the +bt_component_is_source(), bt_component_is_filter(), and +bt_component_is_sink() helper functions. + +You cannot directly create a component: there are no +bt_component_*_create() functions. A trace processing +\bt_graph creates a component from a \bt_comp_cls when you call one of +the bt_graph_add_*_component*() functions. Those functions +also return a borrowed reference of the created component through their +\bt_p{component} parameter. + +

    Properties

    + +A component has the following common properties: + +
    +
    + \anchor api-comp-prop-name + Name +
    +
    + Name of the component. + + Each component has a unique name within a given trace processing + \bt_graph. + + A component's name is set when you + \ref api-graph-lc-add "add it to a graph" with one of the + bt_graph_add_*_component*() functions (\bt_p{name} + parameter); you cannot change it afterwards. + + Get a component's name with bt_component_get_name(). +
    + +
    + \anchor api-comp-prop-log-lvl + Logging level +
    +
    + Logging level of the component (and its message iterators, if any). + + A component's logging level is set when you + \ref api-graph-lc-add "add it to a trace processing graph" with one + of the bt_graph_add_*_component*() functions + (\bt_p{logging_level} parameter); as of + \bt_name_version_min_maj, you cannot change it afterwards. + + Get a component's logging level with + bt_component_get_logging_level(). +
    +
    +*/ + +/*! @{ */ + +/*! +@name Types +@{ + +@typedef struct bt_component bt_component; + +@brief + Component. + +@typedef struct bt_component_source bt_component_source; + +@brief + \bt_c_src_comp. + +@typedef struct bt_component_filter bt_component_filter; + +@brief + \bt_c_flt_comp. + +@typedef struct bt_component_sink bt_component_sink; + +@brief + \bt_c_sink_comp. + +@} +*/ + +/*! +@name Class type query +@{ +*/ + +/*! +@brief + Returns the type enumerator of the \ref api-comp-cls "class" of + the component \bt_p{component}. + +@param[in] component + Component of which to get the class's type enumerator. + +@returns + Type enumerator of the class of \bt_p{component}. + +@bt_pre_not_null{component} + +@sa bt_component_is_source() — + Returns whether or not a component is a \bt_src_comp. +@sa bt_component_is_filter() — + Returns whether or not a component is a \bt_flt_comp. +@sa bt_component_is_sink() — + Returns whether or not a component is a \bt_sink_comp. +*/ +extern bt_component_class_type bt_component_get_class_type( + const bt_component *component); + +/*! +@brief + Returns whether or not the component \bt_p{component} is a + \bt_src_comp. + +@param[in] component + Component to check. + +@returns + #BT_TRUE if \bt_p{component} is a source component. + +@bt_pre_not_null{component} + +@sa bt_component_get_class_type() — + Returns the type enumerator of a component's class. +*/ +static inline +bt_bool bt_component_is_source(const bt_component *component) +{ + return bt_component_get_class_type(component) == + BT_COMPONENT_CLASS_TYPE_SOURCE; +} + +/*! +@brief + Returns whether or not the component \bt_p{component} is a + \bt_flt_comp. + +@param[in] component + Component to check. + +@returns + #BT_TRUE if \bt_p{component} is a filter component. + +@bt_pre_not_null{component} + +@sa bt_component_get_class_type() — + Returns the type enumerator of a component's class. +*/ +static inline +bt_bool bt_component_is_filter(const bt_component *component) +{ + return bt_component_get_class_type(component) == + BT_COMPONENT_CLASS_TYPE_FILTER; +} + +/*! +@brief + Returns whether or not the component \bt_p{component} is a + \bt_sink_comp. + +@param[in] component + Component to check. + +@returns + #BT_TRUE if \bt_p{component} is a sink component. + +@bt_pre_not_null{component} + +@sa bt_component_get_class_type() — + Returns the type enumerator of a component's class. +*/ +static inline +bt_bool bt_component_is_sink(const bt_component *component) +{ + return bt_component_get_class_type(component) == + BT_COMPONENT_CLASS_TYPE_SINK; +} + +/*! @} */ + +/*! +@name Common class access +@{ +*/ + +/*! +@brief + Borrows the \ref api-comp-cls "class" of the component + \bt_p{component}. + +@param[in] component + Component of which to borrow the class. + +@returns + \em Borrowed reference of the class of \bt_p{component}. + +@bt_pre_not_null{component} +*/ +extern const bt_component_class *bt_component_borrow_class_const( + const bt_component *component); + +/*! @} */ + +/*! +@name Common properties +@{ +*/ + +/*! +@brief + Returns the name of the component \bt_p{component}. + +See the \ref api-comp-prop-name "name" property. + +@param[in] component + Component of which to get the name. + +@returns + @parblock + Name of \bt_p{component}. + + The returned pointer remains valid as long as \bt_p{component} + exists. + @endparblock + +@bt_pre_not_null{component} +*/ +extern const char *bt_component_get_name(const bt_component *component); + +/*! +@brief + Returns the logging level of the component \bt_p{component} and its + \bt_p_msg_iter, if any. + +See the \ref api-comp-prop-log-lvl "logging level" property. + +@param[in] component + Component of which to get the logging level. + +@returns + Logging level of \bt_p{component}. + +@bt_pre_not_null{component} +*/ +extern bt_logging_level bt_component_get_logging_level( + const bt_component *component); + +/*! @} */ + +/*! +@name Common reference count +@{ +*/ + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the component \bt_p{component}. + +@param[in] component + @parblock + Component of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_component_put_ref() — + Decrements the reference count of a component. +*/ +extern void bt_component_get_ref(const bt_component *component); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the component \bt_p{component}. + +@param[in] component + @parblock + Component of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_component_get_ref() — + Increments the reference count of a component. +*/ +extern void bt_component_put_ref(const bt_component *component); + +/*! +@brief + Decrements the reference count of the component + \bt_p{_component}, and then sets \bt_p{_component} to \c NULL. + +@param _component + @parblock + Component of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_component} +*/ +#define BT_COMPONENT_PUT_REF_AND_RESET(_component) \ + do { \ + bt_component_put_ref(_component); \ + (_component) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the component \bt_p{_dst}, sets + \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} to \c NULL. + +This macro effectively moves a component reference from the expression +\bt_p{_src} to the expression \bt_p{_dst}, putting the existing +\bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_COMPONENT_MOVE_REF(_dst, _src) \ + do { \ + bt_component_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! +@name Source component class access +@{ +*/ + +/*! +@brief + Borrows the \ref api-comp-cls "class" of the \bt_src_comp + \bt_p{component}. + +@param[in] component + Source component of which to borrow the class. + +@returns + \em Borrowed reference of the class of \bt_p{component}. + +@bt_pre_not_null{component} +*/ +extern const bt_component_class_source * +bt_component_source_borrow_class_const( + const bt_component_source *component); + +/*! @} */ + +/*! +@name Source component upcast +@{ +*/ + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the \bt_src_comp \bt_p{component} + to the common #bt_component type. + +@param[in] component + @parblock + Source component to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{component} as a common component. +*/ +static inline +const bt_component *bt_component_source_as_component_const( + const bt_component_source *component) +{ + return __BT_UPCAST_CONST(bt_component, component); +} + +/*! @} */ + +/*! +@name Source component port access +@{ +*/ + +/*! +@brief + Returns the number of \bt_p_oport that the \bt_src_comp + \bt_p{component} has. + +@param[in] component + Source component of which to get the number of output ports. + +@returns + Number of output ports that \bt_p{component} has. + +@bt_pre_not_null{component} +*/ +extern uint64_t bt_component_source_get_output_port_count( + const bt_component_source *component); + +/*! +@brief + Borrows the \bt_oport at index \bt_p{index} from the + \bt_src_comp \bt_p{component}. + +@param[in] component + Source component from which to borrow the output port at index + \bt_p{index}. +@param[in] index + Index of the output port to borrow from \bt_p{component}. + +@returns + @parblock + \em Borrowed reference of the output port of + \bt_p{component} at index \bt_p{index}. + + The returned pointer remains valid as long as \bt_p{component} + exists. + @endparblock + +@bt_pre_not_null{component} +@pre + \bt_p{index} is less than the number of output ports + \bt_p{component} has (as returned by + bt_component_source_get_output_port_count()). + +@sa bt_component_source_get_output_port_count() — + Returns the number of output ports that a source component has. +*/ +extern const bt_port_output * +bt_component_source_borrow_output_port_by_index_const( + const bt_component_source *component, uint64_t index); + +/*! +@brief + Borrows the \bt_oport named \bt_p{name} from the \bt_src_comp + \bt_p{component}. + +If \bt_p{component} has no output port named \bt_p{name}, this function +returns \c NULL. + +@param[in] component + Source component from which to borrow the output port + named \bt_p{name}. +@param[in] name + Name of the output port to borrow from \bt_p{component}. + +@returns + @parblock + \em Borrowed reference of the output port of + \bt_p{component} named \bt_p{name}, or \c NULL if none. + + The returned pointer remains valid as long as \bt_p{component} + exists. + @endparblock + +@bt_pre_not_null{component} +@bt_pre_not_null{name} +*/ +extern const bt_port_output * +bt_component_source_borrow_output_port_by_name_const( + const bt_component_source *component, const char *name); + +/*! @} */ + +/*! +@name Source component reference count +@{ +*/ + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the \bt_src_comp \bt_p{component}. + +@param[in] component + @parblock + Source component of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_component_source_put_ref() — + Decrements the reference count of a source component. +*/ +extern void bt_component_source_get_ref( + const bt_component_source *component); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the \bt_src_comp \bt_p{component}. + +@param[in] component + @parblock + Source component of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_component_source_get_ref() — + Increments the reference count of a source component. +*/ +extern void bt_component_source_put_ref( + const bt_component_source *component); + +/*! +@brief + Decrements the reference count of the \bt_src_comp + \bt_p{_component}, and then sets \bt_p{_component} to \c NULL. + +@param _component + @parblock + Source component of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_component} +*/ +#define BT_COMPONENT_SOURCE_PUT_REF_AND_RESET(_component) \ + do { \ + bt_component_source_put_ref(_component); \ + (_component) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the \bt_src_comp \bt_p{_dst}, sets + \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} to \c NULL. + +This macro effectively moves a source component reference from the +expression \bt_p{_src} to the expression \bt_p{_dst}, putting the +existing \bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_COMPONENT_SOURCE_MOVE_REF(_dst, _src) \ + do { \ + bt_component_source_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! +@name Filter component class access +@{ +*/ + +/*! +@brief + Borrows the \ref api-comp-cls "class" of the \bt_flt_comp + \bt_p{component}. + +@param[in] component + Filter component of which to borrow the class. + +@returns + \em Borrowed reference of the class of \bt_p{component}. + +@bt_pre_not_null{component} +*/ +extern const bt_component_class_filter * +bt_component_filter_borrow_class_const( + const bt_component_filter *component); + +/*! @} */ + +/*! +@name Filter component upcast +@{ +*/ + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the \bt_flt_comp \bt_p{component} + to the common #bt_component type. + +@param[in] component + @parblock + Filter component to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{component} as a common component. +*/ +static inline +const bt_component *bt_component_filter_as_component_const( + const bt_component_filter *component) +{ + return __BT_UPCAST_CONST(bt_component, component); +} + +/*! @} */ + +/*! +@name Filter component port access +@{ +*/ + +/*! +@brief + Returns the number of \bt_p_iport that the \bt_flt_comp + \bt_p{component} has. + +@param[in] component + Filter component of which to get the number of input ports. + +@returns + Number of input ports that \bt_p{component} has. + +@bt_pre_not_null{component} +*/ +extern uint64_t bt_component_filter_get_input_port_count( + const bt_component_filter *component); + +/*! +@brief + Borrows the \bt_iport at index \bt_p{index} from the + \bt_flt_comp \bt_p{component}. + +@param[in] component + Filter component from which to borrow the input port at index + \bt_p{index}. +@param[in] index + Index of the input port to borrow from \bt_p{component}. + +@returns + @parblock + \em Borrowed reference of the input port of + \bt_p{component} at index \bt_p{index}. + + The returned pointer remains valid as long as \bt_p{component} + exists. + @endparblock + +@bt_pre_not_null{component} +@pre + \bt_p{index} is less than the number of input ports + \bt_p{component} has (as returned by + bt_component_filter_get_input_port_count()). + +@sa bt_component_filter_get_input_port_count() — + Returns the number of input ports that a filter component has. +*/ +extern const bt_port_input * +bt_component_filter_borrow_input_port_by_index_const( + const bt_component_filter *component, uint64_t index); + +/*! +@brief + Borrows the \bt_iport named \bt_p{name} from the \bt_flt_comp + \bt_p{component}. + +If \bt_p{component} has no input port named \bt_p{name}, this function +returns \c NULL. + +@param[in] component + Filter component from which to borrow the input port + named \bt_p{name}. +@param[in] name + Name of the input port to borrow from \bt_p{component}. + +@returns + @parblock + \em Borrowed reference of the input port of + \bt_p{component} named \bt_p{name}, or \c NULL if none. + + The returned pointer remains valid as long as \bt_p{component} + exists. + @endparblock + +@bt_pre_not_null{component} +@bt_pre_not_null{name} +*/ +extern const bt_port_input * +bt_component_filter_borrow_input_port_by_name_const( + const bt_component_filter *component, const char *name); + +/*! +@brief + Returns the number of \bt_p_oport that the \bt_flt_comp + \bt_p{component} has. + +@param[in] component + Filter component of which to get the number of output ports. + +@returns + Number of output ports that \bt_p{component} has. + +@bt_pre_not_null{component} +*/ +extern uint64_t bt_component_filter_get_output_port_count( + const bt_component_filter *component); + +/*! +@brief + Borrows the \bt_oport at index \bt_p{index} from the + \bt_flt_comp \bt_p{component}. + +@param[in] component + Filter component from which to borrow the output port at index + \bt_p{index}. +@param[in] index + Index of the output port to borrow from \bt_p{component}. + +@returns + @parblock + \em Borrowed reference of the output port of + \bt_p{component} at index \bt_p{index}. + + The returned pointer remains valid as long as \bt_p{component} + exists. + @endparblock + +@bt_pre_not_null{component} +@pre + \bt_p{index} is less than the number of output ports + \bt_p{component} has (as returned by + bt_component_filter_get_output_port_count()). + +@sa bt_component_filter_get_output_port_count() — + Returns the number of output ports that a filter component has. +*/ +extern const bt_port_output * +bt_component_filter_borrow_output_port_by_index_const( + const bt_component_filter *component, uint64_t index); + +/*! +@brief + Borrows the \bt_oport named \bt_p{name} from the \bt_flt_comp + \bt_p{component}. + +If \bt_p{component} has no output port named \bt_p{name}, this function +returns \c NULL. + +@param[in] component + Filter component from which to borrow the output port + named \bt_p{name}. +@param[in] name + Name of the output port to borrow from \bt_p{component}. + +@returns + @parblock + \em Borrowed reference of the output port of + \bt_p{component} named \bt_p{name}, or \c NULL if none. + + The returned pointer remains valid as long as \bt_p{component} + exists. + @endparblock + +@bt_pre_not_null{component} +@bt_pre_not_null{name} +*/ +extern const bt_port_output * +bt_component_filter_borrow_output_port_by_name_const( + const bt_component_filter *component, const char *name); + +/*! @} */ + +/*! +@name Filter component reference count +@{ +*/ + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the \bt_flt_comp \bt_p{component}. + +@param[in] component + @parblock + Filter component of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_component_filter_put_ref() — + Decrements the reference count of a filter component. +*/ +extern void bt_component_filter_get_ref( + const bt_component_filter *component); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the \bt_flt_comp \bt_p{component}. + +@param[in] component + @parblock + Filter component of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_component_filter_get_ref() — + Increments the reference count of a filter component. +*/ +extern void bt_component_filter_put_ref( + const bt_component_filter *component); + +/*! +@brief + Decrements the reference count of the \bt_flt_comp + \bt_p{_component}, and then sets \bt_p{_component} to \c NULL. + +@param _component + @parblock + Filter component of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_component} +*/ +#define BT_COMPONENT_FILTER_PUT_REF_AND_RESET(_component) \ + do { \ + bt_component_filter_put_ref(_component); \ + (_component) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the \bt_flt_comp \bt_p{_dst}, sets + \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} to \c NULL. + +This macro effectively moves a filter component reference from the +expression \bt_p{_src} to the expression \bt_p{_dst}, putting the +existing \bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_COMPONENT_FILTER_MOVE_REF(_dst, _src) \ + do { \ + bt_component_filter_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! +@name Sink component class access +@{ +*/ + +/*! +@brief + Borrows the \ref api-comp-cls "class" of the \bt_sink_comp + \bt_p{component}. + +@param[in] component + Sink component of which to borrow the class. + +@returns + \em Borrowed reference of the class of \bt_p{component}. + +@bt_pre_not_null{component} +*/ +extern const bt_component_class_sink * +bt_component_sink_borrow_class_const( + const bt_component_sink *component); + +/*! @} */ + +/*! +@name Sink component upcast +@{ +*/ + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the \bt_sink_comp \bt_p{component} + to the common #bt_component type. + +@param[in] component + @parblock + Sink component to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{component} as a common component. +*/ +static inline +const bt_component *bt_component_sink_as_component_const( + const bt_component_sink *component) +{ + return __BT_UPCAST_CONST(bt_component, component); +} + +/*! @} */ + +/*! +@name Sink component port access +@{ +*/ + +/*! +@brief + Returns the number of \bt_p_iport that the \bt_sink_comp + \bt_p{component} has. + +@param[in] component + Sink component of which to get the number of input ports. + +@returns + Number of input ports that \bt_p{component} has. + +@bt_pre_not_null{component} +*/ +extern uint64_t bt_component_sink_get_input_port_count( + const bt_component_sink *component); + +/*! +@brief + Borrows the \bt_iport at index \bt_p{index} from the + \bt_sink_comp \bt_p{component}. + +@param[in] component + Sink component from which to borrow the input port at index + \bt_p{index}. +@param[in] index + Index of the input port to borrow from \bt_p{component}. + +@returns + @parblock + \em Borrowed reference of the input port of + \bt_p{component} at index \bt_p{index}. + + The returned pointer remains valid as long as \bt_p{component} + exists. + @endparblock + +@bt_pre_not_null{component} +@pre + \bt_p{index} is less than the number of input ports + \bt_p{component} has (as returned by + bt_component_sink_get_input_port_count()). + +@sa bt_component_sink_get_input_port_count() — + Returns the number of input ports that a sink component has. +*/ +extern const bt_port_input * +bt_component_sink_borrow_input_port_by_index_const( + const bt_component_sink *component, uint64_t index); + +/*! +@brief + Borrows the \bt_oport named \bt_p{name} from the \bt_sink_comp + \bt_p{component}. + +If \bt_p{component} has no output port named \bt_p{name}, this function +returns \c NULL. + +@param[in] component + Sink component from which to borrow the output port + named \bt_p{name}. +@param[in] name + Name of the output port to borrow from \bt_p{component}. + +@returns + @parblock + \em Borrowed reference of the output port of + \bt_p{component} named \bt_p{name}, or \c NULL if none. + + The returned pointer remains valid as long as \bt_p{component} + exists. + @endparblock + +@bt_pre_not_null{component} +@bt_pre_not_null{name} +*/ +extern const bt_port_input * +bt_component_sink_borrow_input_port_by_name_const( + const bt_component_sink *component, const char *name); + +/*! @} */ + +/*! +@name Sink component reference count +@{ +*/ + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the \bt_sink_comp \bt_p{component}. + +@param[in] component + @parblock + Sink component of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_component_sink_put_ref() — + Decrements the reference count of a sink component. +*/ +extern void bt_component_sink_get_ref( + const bt_component_sink *component); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the \bt_sink_comp \bt_p{component}. + +@param[in] component + @parblock + Sink component of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_component_sink_get_ref() — + Increments the reference count of a sink component. +*/ +extern void bt_component_sink_put_ref( + const bt_component_sink *component); + +/*! +@brief + Decrements the reference count of the \bt_sink_comp + \bt_p{_component}, and then sets \bt_p{_component} to \c NULL. + +@param _component + @parblock + Sink component of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_component} +*/ +#define BT_COMPONENT_SINK_PUT_REF_AND_RESET(_component) \ + do { \ + bt_component_sink_put_ref(_component); \ + (_component) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the \bt_sink_comp \bt_p{_dst}, + sets \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} to + \c NULL. + +This macro effectively moves a sink component reference from the +expression \bt_p{_src} to the expression \bt_p{_dst}, putting the +existing \bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_COMPONENT_SINK_MOVE_REF(_dst, _src) \ + do { \ + bt_component_sink_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* BABELTRACE2_GRAPH_COMPONENT_H */ diff --git a/include/babeltrace2/graph/connection-const.h b/include/babeltrace2/graph/connection-const.h deleted file mode 100644 index 9282c17d..00000000 --- a/include/babeltrace2/graph/connection-const.h +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_CONNECTION_CONST_H -#define BABELTRACE2_GRAPH_CONNECTION_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern const bt_port_input *bt_connection_borrow_downstream_port_const( - const bt_connection *connection); - -extern const bt_port_output *bt_connection_borrow_upstream_port_const( - const bt_connection *connection); - -extern void bt_connection_get_ref(const bt_connection *connection); - -extern void bt_connection_put_ref(const bt_connection *connection); - -#define BT_CONNECTION_PUT_REF_AND_RESET(_var) \ - do { \ - bt_connection_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_CONNECTION_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_connection_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_CONNECTION_CONST_H */ diff --git a/include/babeltrace2/graph/connection.h b/include/babeltrace2/graph/connection.h new file mode 100644 index 00000000..68b56344 --- /dev/null +++ b/include/babeltrace2/graph/connection.h @@ -0,0 +1,210 @@ +#ifndef BABELTRACE2_GRAPH_CONNECTION_H +#define BABELTRACE2_GRAPH_CONNECTION_H + +/* + * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef __BT_IN_BABELTRACE_H +# error "Please include instead." +#endif + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*! +@defgroup api-conn Connection +@ingroup api-graph + +@brief + \bt_c_comp \bt_port connection. + +A connection is a link between an \bt_oport +and an \bt_iport. + +@image html component-zoom.png + +A connection is a \ref api-fund-shared-object "shared object": get a new +reference with bt_connection_get_ref() and put an existing reference with +bt_connection_put_ref(). + +The type of a connection is #bt_connection. + +Borrow the upstream (output) port and downstream (input) port of a +connection with bt_connection_borrow_upstream_port_const() and +bt_connection_borrow_downstream_port_const(). +*/ + +/*! @{ */ + +/*! +@name Type +@{ + +@typedef struct bt_connection bt_connection; + +@brief + Connection. + +@} +*/ + +/*! +@name Port access +@{ +*/ + +/*! +@brief + Borrows the upstream \bt_iport of the connection \bt_p{connection}. + +@param[in] connection + Connection of which to borrow the upstream port. + +@returns + \em Borrowed reference of the upstream port of \bt_p{connection}. + +@bt_pre_not_null{connection} +*/ +extern const bt_port_input *bt_connection_borrow_downstream_port_const( + const bt_connection *connection); + +/*! +@brief + Borrows the downstream \bt_oport of the connection + \bt_p{connection}. + +@param[in] connection + Connection of which to borrow the downstream port. + +@returns + \em Borrowed reference of the downstream port of \bt_p{connection}. + +@bt_pre_not_null{connection} +*/ +extern const bt_port_output *bt_connection_borrow_upstream_port_const( + const bt_connection *connection); + +/*! @} */ + +/*! +@name Reference count +@{ +*/ + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the connection \bt_p{connection}. + +@param[in] connection + @parblock + Connection of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_connection_put_ref() — + Decrements the reference count of a connection. +*/ +extern void bt_connection_get_ref(const bt_connection *connection); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the connection \bt_p{connection}. + +@param[in] connection + @parblock + Connection of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_connection_get_ref() — + Increments the reference count of a connection. +*/ +extern void bt_connection_put_ref(const bt_connection *connection); + +/*! +@brief + Decrements the reference count of the connection + \bt_p{_connection}, and then sets \bt_p{_connection} to \c NULL. + +@param _connection + @parblock + Connection of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_connection} +*/ +#define BT_CONNECTION_PUT_REF_AND_RESET(_connection) \ + do { \ + bt_connection_put_ref(_connection); \ + (_connection) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the connection \bt_p{_dst}, sets + \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} to \c NULL. + +This macro effectively moves a connection reference from the expression +\bt_p{_src} to the expression \bt_p{_dst}, putting the existing +\bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_CONNECTION_MOVE_REF(_dst, _src) \ + do { \ + bt_connection_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* BABELTRACE2_GRAPH_CONNECTION_H */ diff --git a/include/babeltrace2/graph/graph-const.h b/include/babeltrace2/graph/graph-const.h deleted file mode 100644 index 168ed2b2..00000000 --- a/include/babeltrace2/graph/graph-const.h +++ /dev/null @@ -1,57 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_GRAPH_CONST_H -#define BABELTRACE2_GRAPH_GRAPH_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern void bt_graph_get_ref(const bt_graph *graph); - -extern void bt_graph_put_ref(const bt_graph *graph); - -#define BT_GRAPH_PUT_REF_AND_RESET(_var) \ - do { \ - bt_graph_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_GRAPH_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_graph_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_GRAPH_CONST_H */ diff --git a/include/babeltrace2/graph/graph.h b/include/babeltrace2/graph/graph.h index d562e366..6c7b2d1b 100644 --- a/include/babeltrace2/graph/graph.h +++ b/include/babeltrace2/graph/graph.h @@ -34,213 +34,1981 @@ extern "C" { #endif -typedef enum bt_graph_listener_func_status { - BT_GRAPH_LISTENER_FUNC_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_GRAPH_LISTENER_FUNC_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, - BT_GRAPH_LISTENER_FUNC_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, -} bt_graph_listener_func_status; +/*! +@defgroup api-graph Graph -typedef bt_graph_listener_func_status -(*bt_graph_filter_component_input_port_added_listener_func)( - const bt_component_filter *component, - const bt_port_input *port, void *data); +@brief + Trace processing graph. -typedef bt_graph_listener_func_status -(*bt_graph_sink_component_input_port_added_listener_func)( - const bt_component_sink *component, - const bt_port_input *port, void *data); +A trace processing graph is a specialized +filter graph +to manipulate one or more traces. -typedef bt_graph_listener_func_status -(*bt_graph_source_component_output_port_added_listener_func)( - const bt_component_source *component, - const bt_port_output *port, void *data); +Whereas the nodes of a multimedia filter graph typically exchange +video frames and audio samples, the nodes, or \bt_p_comp, of a trace +processing graph exchange immutable \bt_p_msg containing trace data. -typedef bt_graph_listener_func_status -(*bt_graph_filter_component_output_port_added_listener_func)( - const bt_component_filter *component, - const bt_port_output *port, void *data); +The following illustration shows a basic trace processing graph which +converts many traces to a single log of pretty-printed lines: -typedef bt_graph_listener_func_status -(*bt_graph_source_filter_component_ports_connected_listener_func)( - const bt_component_source *source_component, - const bt_component_filter *filter_component, - const bt_port_output *upstream_port, - const bt_port_input *downstream_port, void *data); +@image html basic-convert-graph.png "Basic trace processing graph (conversion graph)." -typedef bt_graph_listener_func_status -(*bt_graph_source_sink_component_ports_connected_listener_func)( - const bt_component_source *source_component, - const bt_component_sink *sink_component, - const bt_port_output *upstream_port, - const bt_port_input *downstream_port, void *data); +In the illustrations above, notice that: -typedef bt_graph_listener_func_status -(*bt_graph_filter_filter_component_ports_connected_listener_func)( - const bt_component_filter *filter_component_upstream, - const bt_component_filter *filter_component_downstream, - const bt_port_output *upstream_port, - const bt_port_input *downstream_port, - void *data); +- The graph (blue) contains five components. -typedef bt_graph_listener_func_status -(*bt_graph_filter_sink_component_ports_connected_listener_func)( - const bt_component_filter *filter_component, - const bt_component_sink *sink_component, - const bt_port_output *upstream_port, - const bt_port_input *downstream_port, void *data); +- Three source components (green) are connected to a single filter + component (yellow). -typedef enum bt_graph_simple_sink_component_initialize_func_status { - BT_GRAPH_SIMPLE_SINK_COMPONENT_INITIALIZE_FUNC_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_GRAPH_SIMPLE_SINK_COMPONENT_INITIALIZE_FUNC_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, - BT_GRAPH_SIMPLE_SINK_COMPONENT_INITIALIZE_FUNC_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, -} bt_graph_simple_sink_component_initialize_func_status; + There are five \bt_p_conn, from five \bt_p_oport + to five \bt_p_iport. -typedef bt_graph_simple_sink_component_initialize_func_status -(*bt_graph_simple_sink_component_initialize_func)( - bt_message_iterator *iterator, - void *data); +- The filter component is connected to a single sink component (red). -typedef enum bt_graph_simple_sink_component_consume_func_status { - BT_GRAPH_SIMPLE_SINK_COMPONENT_CONSUME_FUNC_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_GRAPH_SIMPLE_SINK_COMPONENT_CONSUME_FUNC_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, - BT_GRAPH_SIMPLE_SINK_COMPONENT_CONSUME_FUNC_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, - BT_GRAPH_SIMPLE_SINK_COMPONENT_CONSUME_FUNC_STATUS_AGAIN = __BT_FUNC_STATUS_AGAIN, - BT_GRAPH_SIMPLE_SINK_COMPONENT_CONSUME_FUNC_STATUS_END = __BT_FUNC_STATUS_END, -} bt_graph_simple_sink_component_consume_func_status; + There's a single connection. -typedef bt_graph_simple_sink_component_consume_func_status -(*bt_graph_simple_sink_component_consume_func)( - bt_message_iterator *iterator, - void *data); +- Source components read external resources while the sink component + writes to the standard output or to a file. + +- There are two source components having the same + \ref api-tir-comp-cls "class": source.ctf.fs. + +- All components are instances of \bt_plugin-provided classes: + babeltrace2-plugin-ctf.so, + user-plugin.so, + babeltrace2-plugin-utils.so, and + babeltrace2-plugin-text.so. + +Of course the topology can be much more complex if needed: + +@image html complex-graph.png "Complex trace processing graph." + +In a trace processing graph, \bt_p_comp are instances of \bt_p_comp_cls. + +A \bt_plugin can provide a component class, but you can also create one +dynamically (see \ref api-comp-cls-dev). + +The connections between component ports in a trace processing graph +indicate the needed topology to achieve a trace processing task. That +being said, +\bt_p_msg do not flow within connections. Instead, a source-to-sink +or filter-to-sink connection makes it +possible for a sink component to create a \bt_msg_iter on its end of +the connection (an \bt_iport). In turn, a filter component message +iterator can create other message iterators on one or more of the +component's input ports. For a single connection, there can exist +multiple message iterators. + +A trace processing graph is a +\ref api-fund-shared-object "shared object": get a new reference with +bt_graph_get_ref() and put an existing reference with +bt_graph_put_ref(). + +The type of a trace processing graph is #bt_graph. + +Create a default trace processing graph with bt_graph_create(). You need +to pass a \bt_mip (MIP) version number when you call this function. +Then, see +\ref api-graph-lc "Trace processing graph life cycle" +to learn how to add components to the graph, connect their ports, and +run it. + +To interrupt a \ref api-graph-lc-run "running" trace processing graph, +either: + +- Borrow the graph's default \bt_intr with + bt_graph_borrow_default_interrupter() and set it with + bt_interrupter_set(). + + When you call bt_graph_create(), the returned trace processing + graph has a default interrupter. + +- Add your own interrupter with bt_graph_add_interrupter() \em before + you run the graph with bt_graph_run() or bt_graph_run_once(). + + Then, set the interrupter with bt_interrupter_set(). + +

    \anchor api-graph-lc Trace processing graph life cycle

    + +The following diagram shows the life cycle of a trace processing +graph: + +@image html graph-lifetime.png "Trace processing graph lifecycle." + +After you create a default (empty) trace processing graph with +bt_graph_create(), there are three steps to make the trace processing +task execute: + +-# \ref api-graph-lc-add "Add components" to the graph. +-# \ref api-graph-lc-connect "Connect component ports". +-# \ref api-graph-lc-run "Run the graph". + +You can repeat steps 1 and 2 before step 3, as connecting a +component \bt_port can make this \bt_comp create a new port: +you might want to add a component in reaction to this event +(see \ref api-graph-listeners "Listeners"). + +Steps 1 and 2 constitute the \em configuration phase of the trace +processing graph. The first time you call bt_graph_run() or +bt_graph_run_once() for a given graph (step 3), the graph becomes +configured, and it notifies the sink components as such so that +they can create their \bt_p_msg_iter. + +Once a trace processing graph becomes configured: + +- You cannot \ref api-graph-lc-add "add a component" to it. + +- You cannot \ref api-graph-lc-connect "connect component ports". + +- Components cannot add ports. + +In general, as of \bt_name_version_min_maj: + +- You cannot remove a component from a trace processing graph. + +- You cannot end (remove) a port \bt_conn. + +- Components cannot remove ports. + +If \em any error occurs (a function returns a status code which ends +with ERROR) during step 1 or 2, the trace processing +graph is considered faulty: you cannot use it anymore. +The only functions you can call with a faulty graph are +bt_graph_get_ref() and bt_graph_put_ref(). + +

    \anchor api-graph-lc-add Add components

    + +Adding a \bt_comp to a trace processing graph is also known as +instantiating a \bt_comp_cls because the graph must first +create the component from its class before adding it. + +Because component and component class C types are +\ref api-fund-c-typing "highly specific", there are six functions +to add a component to a trace processing graph: + +
    +
    Source component
    +
    +
    +
    Without initialization method data
    +
    bt_graph_add_source_component()
    + +
    With initialization method data
    +
    bt_graph_add_source_component_with_initialize_method_data()
    +
    +
    + +
    Filter component
    +
    +
    +
    Without initialization method data
    +
    bt_graph_add_filter_component()
    + +
    With initialization method data
    +
    bt_graph_add_filter_component_with_initialize_method_data()
    +
    +
    + +
    Sink component
    +
    +
    +
    Without initialization method data
    +
    bt_graph_add_sink_component()
    + +
    With initialization method data
    +
    bt_graph_add_sink_component_with_initialize_method_data()
    +
    +
    +
    + +The *_with_initialize_method_data() versions can pass a +custom, \bt_voidp pointer to the component's +\ref api-comp-cls-dev-meth-init "initialization method". +The other versions pass \c NULL as this parameter. + +All the functions above accept the same parameters: + +@param[in] graph + Trace processing graph to which to add the created component. +@param[in] component_class + Class to instantiate within \bt_p{graph}. +@param[in] name + Unique name of the component to add within \bt_p{graph}. +@param[in] params + Initialization parameters to use when creating the component. +@param[in] logging_level + Initial logging level of the component to create. +@param[out] component + On success, \bt_p{*component} is the created + component. + +Once you have the created and added component (\bt_p{*component}), +you can borrow its \bt_p_port to +\ref api-graph-lc-connect "connect them". + +You can add as many components as needed to a trace processing graph, +but they must all have a unique name. + +

    \anchor api-graph-lc-add-ss Add a simple sink component

    + +To add a very basic \bt_sink_comp which has a single \bt_iport and +creates a single \bt_msg_iter when the trace processing graph becomes +configured, use bt_graph_add_simple_sink_component(). When you call +this function, you pass three user functions: + +
    +
    \bt_dt_opt Initialization
    +
    + Called when the trace processing graph becomes + configured and when the sink component created its single + message iterator. + + You can do an initial action with the message iterator such as + making it seek a specific point in time or getting messages. +
    + +
    Consume
    +
    + Called every time the sink component's + \ref api-comp-cls-dev-meth-consume "consuming method" is called. + + You can get the next messages from the component's message + iterator and process them. +
    + +
    \bt_dt_opt Finalization
    +
    + Called when the sink component is finalized. +
    +
    + +The three functions above receive, as their last parameter, the user +data you passed to bt_graph_add_simple_sink_component() . + +

    \anchor api-graph-lc-connect Connect component ports

    + +When you \ref api-graph-lc-add "add a component" to a trace processing +graph with one of the bt_graph_add_*_component*() +functions, the function sets \bt_p{*component} to the +created and added component. + +With such a \bt_comp, you can borrow one of its \bt_p_port by index or +by name. + +Connect two component ports within a trace processing graph with +bt_graph_connect_ports(). + +After you connect component ports, you can still +\ref api-graph-lc-add "add" more components to the graph, and then +connect more ports. + +You don't need to connect all the available ports of a given component, +depending on the trace processing task you need to perform. However, +when you \ref api-graph-lc-run "run" the trace processing graph: + +- At least one \bt_oport of any \bt_src_comp must be connected. +- At least one \bt_iport and one output port of any \bt_flt_comp must + be connected. +- At least one input port of any \bt_sink_comp must be connected. + +

    \anchor api-graph-lc-run Run

    + +When you are done configuring a trace processing graph, you can run it +with bt_graph_run(). + +bt_graph_run() does \em not return until one of: + +- All the sink components are ended: bt_graph_run() returns + #BT_GRAPH_RUN_STATUS_OK. + +- One of the sink component returns an error: + bt_graph_run() returns #BT_GRAPH_RUN_STATUS_ERROR or + #BT_GRAPH_RUN_STATUS_MEMORY_ERROR. + +- One of the sink component returns "try again": + bt_graph_run() returns #BT_GRAPH_RUN_STATUS_AGAIN. + + In that case, you can call bt_graph_run() again later, usually after + waiting for some time. + + This feature exists to allow blocking operations within components + to be postponed until they don't block. The graph user can perform + other tasks instead of the graph's thread blocking. + +- The trace processing graph is interrupted (see + bt_graph_borrow_default_interrupter() and bt_graph_add_interrupter()): + bt_graph_run() returns #BT_GRAPH_RUN_STATUS_AGAIN. + + Check the \bt_intr's state with bt_interrupter_is_set() to + distinguish between a sink component returning "try again" and + the trace processing graph getting interrupted. + +If you want to make a single sink component consume and process a few +\bt_p_msg before controlling the thread again, use bt_graph_run_once() +instead of bt_graph_run(). + +

    Standard \bt_name component classes

    -typedef void (*bt_graph_simple_sink_component_finalize_func)(void *data); +The \bt_name project ships with project \bt_p_plugin which provide +"standard" \bt_p_comp_cls. +Those standard component classes can be useful in many trace processing +graph topologies. They are: + +
    +
    \c ctf plugin
    +
    +
    +
    \c fs source component class
    +
    + Opens a + CTF trace on the file + system and emits the \bt_p_msg of their data stream files. + + See \bt_man{babeltrace2-source.ctf.fs,7}. +
    + +
    \c lttng-live source component class
    +
    + Connects to an LTTng relay + daemon and emits the messages of the received CTF data streams. + + See \bt_man{babeltrace2-source.ctf.lttng-live,7}. +
    + +
    \c fs sink component class
    +
    + Writes the consumed messages as one or more CTF traces on the + file system. + + See \bt_man{babeltrace2-sink.ctf.fs,7}. +
    +
    +
    + +
    \c lttng-utils plugin
    +
    +
    +
    \c debug-info filter component class
    +
    + Adds debugging information to compatible LTTng event messages. + + This component class is only available if the project was + built with the \-\-enable-debug-info + configuration option. + + See \bt_man{babeltrace2-filter.lttng-utils.debug-info,7}. +
    +
    +
    + +
    \c text plugin
    +
    +
    +
    \c dmesg source component class
    +
    + Reads the lines of a Linux kernel ring buffer, that is, the + output of the + dmesg + tool, and emits each line as an \bt_ev_msg. + + See \bt_man{babeltrace2-source.text.dmesg,7}. +
    + +
    \c details sink component class
    +
    + Deterministically prints the messages it consumes with details + to the standard output. + + See \bt_man{babeltrace2-sink.text.details,7}. +
    + +
    \c pretty sink component class
    +
    + Pretty-prints the messages it consumes to the standard output or + to a file. + + This is equivalent to the \c text output format of the + Babeltrace 1 + command-line tool. + + See \bt_man{babeltrace2-sink.text.pretty,7}. +
    +
    +
    + +
    \c utils plugin
    +
    +
    +
    \c muxer filter component class
    +
    + Muxes messages by time. + + See \bt_man{babeltrace2-filter.utils.muxer,7}. +
    + +
    \c trimmer filter component class
    +
    + Discards all the consumed messages with a time outside a given + time range, effectively "cutting" \bt_p_stream. + + See \bt_man{babeltrace2-filter.utils.trimmer,7}. +
    + +
    \c counter sink component class
    +
    + Prints the number of consumed messages, either once at the end + or periodically, to the standard output. + + See \bt_man{babeltrace2-sink.utils.counter,7}. +
    + +
    \c dummy sink component class
    +
    + Consumes messages and discards them (does nothing with them). + + This is useful for testing and benchmarking a trace processing + graph application, for example. + + See \bt_man{babeltrace2-sink.utils.dummy,7}. +
    +
    +
    +
    + +To access such a component class, get its plugin by name with +bt_plugin_find() and then borrow the component class by name +with bt_plugin_borrow_source_component_class_by_name_const(), +bt_plugin_borrow_filter_component_class_by_name_const(), or +bt_plugin_borrow_sink_component_class_by_name_const(). + +For example: + +@code +const bt_plugin *plugin; + +if (bt_plugin_find("utils", BT_TRUE, BT_TRUE, BT_TRUE, BT_TRUE, BT_TRUE, + &plugin) != BT_PLUGIN_FIND_STATUS_OK) { + // handle error +} + +const bt_component_class_filter *muxer_component_class = + bt_plugin_borrow_filter_component_class_by_name_const(plugin, "muxer"); + +if (!muxer_component_class) { + // handle error +} +@endcode + +

    \anchor api-graph-listeners Listeners

    + +A \bt_comp can add a \bt_port: + +- At initialization time, that is, when you call one of the + bt_graph_add_*_component*() functions. + +- When one of its ports gets connected, that is, when you call + bt_graph_connect_ports(). + +To get notified when any component of a given trace processing +graph adds a port, add one or more "port +added" listeners to the graph with: + +- bt_graph_add_source_component_output_port_added_listener() +- bt_graph_add_filter_component_input_port_added_listener() +- bt_graph_add_filter_component_output_port_added_listener() +- bt_graph_add_sink_component_input_port_added_listener() + +Within a "port added" listener function, you can +\ref api-graph-lc-add "add more components" +and \ref api-graph-lc-connect "connect more component ports". +*/ + +/*! @{ */ + +/*! +@name Type +@{ + +@typedef struct bt_graph bt_graph; + +@brief + Trace processing graph. + +@} +*/ + +/*! +@name Creation +@{ +*/ + +/*! +@brief + Creates a default, empty trace processing graph honouring version + \bt_p{mip_version} of the \bt_mip. + +On success, the returned graph contains no components (see +\ref api-graph-lc-add "Add components"). + +The graph is configured as operating following version +\bt_p{mip_version} of the Message Interchange Protocol, so that +bt_self_component_get_graph_mip_version() returns this version when +components call it. + +@note + As of \bt_name_version_min_maj, the only available MIP version is 0. + +The returned graph has a default \bt_intr. Any \bt_comp you add with the +bt_graph_add_*_component*() functions and all their +\bt_p_msg_iter also have this same default interrupter. Borrow the graph's +default interrupter with bt_graph_borrow_default_interrupter(). + +@param[in] mip_version + Version of the Message Interchange Protocol to use within the + graph to create. + +@returns + New trace processing graph reference, or \c NULL on memory error. + +@pre + \bt_p{mip_version} is 0. +*/ extern bt_graph *bt_graph_create(uint64_t mip_version); +/*! @} */ + +/*! +@name Component adding +@{ +*/ + +/*! +@brief + Status codes for the + bt_graph_add_*_component*() functions. +*/ typedef enum bt_graph_add_component_status { + /*! + @brief + Success. + */ BT_GRAPH_ADD_COMPONENT_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_GRAPH_ADD_COMPONENT_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, + + /*! + @brief + Out of memory. + */ BT_GRAPH_ADD_COMPONENT_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + Other error. + */ + BT_GRAPH_ADD_COMPONENT_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, } bt_graph_add_component_status; +/*! +@brief + Alias of bt_graph_add_source_component_with_initialize_method_data() + with the \bt_p{initialize_method_data} parameter set to \c NULL. +*/ extern bt_graph_add_component_status bt_graph_add_source_component(bt_graph *graph, const bt_component_class_source *component_class, const char *name, const bt_value *params, - bt_logging_level log_level, const bt_component_source **component); + bt_logging_level logging_level, + const bt_component_source **component); + +/*! +@brief + Creates a \bt_src_comp from the + \ref api-tir-comp-cls "class" \bt_p{component_class} + with the initialization parameters \bt_p{params}, the initialization + user data \bt_p{initialize_method_data}, and the initial + logging level \bt_p{logging_level}, adds it to the trace processing + graph \bt_p{graph} with the name \bt_p{name}, and sets + \bt_p{*component} to the resulting component. + +See \ref api-graph-lc-add "Add components" to learn more about adding +components to a trace processing graph. + +This function calls the source component's +\ref api-comp-cls-dev-meth-init "initialization method" after +creating it. + +The created source component's initialization method receives: + +- \bt_p{params} as its own \bt_p{params} parameter (or an empty + \bt_map_val if \bt_p{params} is \c NULL). + +- \bt_p{initialize_method_data} as its own \bt_p{initialize_method_data} + parameter. + +The created source component can get its logging level +(\bt_p{logging_level}) with bt_component_get_logging_level(). + +@param[in] graph + Trace processing graph to which to add the created source component. +@param[in] component_class + Class to instantiate within \bt_p{graph}. +@param[in] name + Unique name, within \bt_p{graph}, of the component to create. +@param[in] params + @parblock + Initialization parameters to use when creating the source component. + + Can be \c NULL, in which case the created source component's + initialization method receives an empty \bt_map_val as its + \bt_p{params} parameter. + @endparblock +@param[in] initialize_method_data + User data passed as is to the created source component's + initialization method. +@param[in] logging_level + Initial logging level of the source component to create. +@param[out] component + On success, if not \c NULL, \bt_p{*component} is + a \em borrowed reference of the created source component. + +@retval #BT_GRAPH_ADD_COMPONENT_STATUS_OK + Success. +@retval #BT_GRAPH_ADD_COMPONENT_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_GRAPH_ADD_COMPONENT_STATUS_ERROR + Other error, for example, the created source component's + initialization method failed. + +@bt_pre_not_null{graph} +@bt_pre_graph_not_configured{graph} +@bt_pre_graph_not_faulty{graph} +@bt_pre_not_null{component_class} +@bt_pre_not_null{name} +@pre + No other component within \bt_p{graph} has the name \bt_p{name}. +@pre + \bt_p{params} is a \bt_map_val (bt_value_is_map() returns #BT_TRUE) + or is \c NULL. +@bt_post_success_frozen{component_class} +@bt_post_success_frozen{params} +*/ extern bt_graph_add_component_status bt_graph_add_source_component_with_initialize_method_data( bt_graph *graph, const bt_component_class_source *component_class, const char *name, const bt_value *params, - void *init_method_data, bt_logging_level log_level, + void *initialize_method_data, bt_logging_level logging_level, const bt_component_source **component); +/*! +@brief + Alias of bt_graph_add_filter_component_with_initialize_method_data() + with the \bt_p{initialize_method_data} parameter set to \c NULL. +*/ extern bt_graph_add_component_status bt_graph_add_filter_component(bt_graph *graph, const bt_component_class_filter *component_class, const char *name, const bt_value *params, - bt_logging_level log_level, + bt_logging_level logging_level, const bt_component_filter **component); +/*! +@brief + Creates a \bt_flt_comp from the + \ref api-tir-comp-cls "class" \bt_p{component_class} + with the initialization parameters \bt_p{params}, the initialization + user data \bt_p{initialize_method_data}, and the initial + logging level \bt_p{logging_level}, adds it to the trace processing + graph \bt_p{graph} with the name \bt_p{name}, and sets + \bt_p{*component} to the resulting component. + +See \ref api-graph-lc-add "Add components" to learn more about adding +components to a trace processing graph. + +This function calls the filter component's +\ref api-comp-cls-dev-meth-init "initialization method" after +creating it. + +The created filter component's initialization method receives: + +- \bt_p{params} as its own \bt_p{params} parameter (or an empty + \bt_map_val if \bt_p{params} is \c NULL). + +- \bt_p{initialize_method_data} as its own \bt_p{initialize_method_data} + parameter. + +The created filter component can get its logging level +(\bt_p{logging_level}) with bt_component_get_logging_level(). + +@param[in] graph + Trace processing graph to which to add the created filter component. +@param[in] component_class + Class to instantiate within \bt_p{graph}. +@param[in] name + Unique name, within \bt_p{graph}, of the component to create. +@param[in] params + @parblock + Initialization parameters to use when creating the filter component. + + Can be \c NULL, in which case the created filter component's + initialization method receives an empty \bt_map_val as its + \bt_p{params} parameter. + @endparblock +@param[in] initialize_method_data + User data passed as is to the created filter component's + initialization method. +@param[in] logging_level + Initial logging level of the filter component to create. +@param[out] component + On success, if not \c NULL, \bt_p{*component} is + a \em borrowed reference of the created filter component. + +@retval #BT_GRAPH_ADD_COMPONENT_STATUS_OK + Success. +@retval #BT_GRAPH_ADD_COMPONENT_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_GRAPH_ADD_COMPONENT_STATUS_ERROR + Other error, for example, the created filter component's + initialization method failed. + +@bt_pre_not_null{graph} +@bt_pre_graph_not_configured{graph} +@bt_pre_graph_not_faulty{graph} +@bt_pre_not_null{component_class} +@bt_pre_not_null{name} +@pre + No other component within \bt_p{graph} has the name \bt_p{name}. +@pre + \bt_p{params} is a \bt_map_val (bt_value_is_map() returns #BT_TRUE) + or is \c NULL. + +@bt_post_success_frozen{component_class} +@bt_post_success_frozen{params} +*/ extern bt_graph_add_component_status bt_graph_add_filter_component_with_initialize_method_data( bt_graph *graph, const bt_component_class_filter *component_class, const char *name, const bt_value *params, - void *init_method_data, bt_logging_level log_level, + void *initialize_method_data, bt_logging_level logging_level, const bt_component_filter **component); +/*! +@brief + Alias of bt_graph_add_sink_component_with_initialize_method_data() + with the \bt_p{initialize_method_data} parameter set to \c NULL. +*/ extern bt_graph_add_component_status bt_graph_add_sink_component( bt_graph *graph, const bt_component_class_sink *component_class, const char *name, const bt_value *params, - bt_logging_level log_level, + bt_logging_level logging_level, const bt_component_sink **component); +/*! +@brief + Creates a \bt_sink_comp from the + \ref api-tir-comp-cls "class" \bt_p{component_class} + with the initialization parameters \bt_p{params}, the initialization + user data \bt_p{initialize_method_data}, and the initial + logging level \bt_p{logging_level}, adds it to the trace processing + graph \bt_p{graph} with the name \bt_p{name}, and sets + \bt_p{*component} to the resulting component. + +See \ref api-graph-lc-add "Add components" to learn more about adding +components to a trace processing graph. + +This function calls the sink component's +\ref api-comp-cls-dev-meth-init "initialization method" after +creating it. + +The created sink component's initialization method receives: + +- \bt_p{params} as its own \bt_p{params} parameter (or an empty + \bt_map_val if \bt_p{params} is \c NULL). + +- \bt_p{initialize_method_data} as its own \bt_p{initialize_method_data} + parameter. + +The created sink component can get its logging level +(\bt_p{logging_level}) with bt_component_get_logging_level(). + +@param[in] graph + Trace processing graph to which to add the created sink component. +@param[in] component_class + Class to instantiate within \bt_p{graph}. +@param[in] name + Unique name, within \bt_p{graph}, of the component to create. +@param[in] params + @parblock + Initialization parameters to use when creating the sink component. + + Can be \c NULL, in which case the created sink component's + initialization method receives an empty \bt_map_val as its + \bt_p{params} parameter. + @endparblock +@param[in] initialize_method_data + User data passed as is to the created sink component's + initialization method. +@param[in] logging_level + Initial logging level of the sink component to create. +@param[out] component + On success, if not \c NULL, \bt_p{*component} is + a \em borrowed reference of the created sink component. + +@retval #BT_GRAPH_ADD_COMPONENT_STATUS_OK + Success. +@retval #BT_GRAPH_ADD_COMPONENT_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_GRAPH_ADD_COMPONENT_STATUS_ERROR + Other error, for example, the created sink component's + initialization method failed. + +@bt_pre_not_null{graph} +@bt_pre_graph_not_configured{graph} +@bt_pre_graph_not_faulty{graph} +@bt_pre_not_null{component_class} +@bt_pre_not_null{name} +@pre + No other component within \bt_p{graph} has the name \bt_p{name}. +@pre + \bt_p{params} is a \bt_map_val (bt_value_is_map() returns #BT_TRUE) + or is \c NULL. + +@bt_post_success_frozen{component_class} +@bt_post_success_frozen{params} +*/ extern bt_graph_add_component_status bt_graph_add_sink_component_with_initialize_method_data( bt_graph *graph, const bt_component_class_sink *component_class, const char *name, const bt_value *params, - void *init_method_data, bt_logging_level log_level, + void *initialize_method_data, bt_logging_level logging_level, const bt_component_sink **component); +/*! @} */ + +/*! +@name Simple sink component adding +@{ +*/ + +/*! +@brief + Status codes for the #bt_graph_simple_sink_component_initialize_func + type. +*/ +typedef enum bt_graph_simple_sink_component_initialize_func_status { + /*! + @brief + Success. + */ + BT_GRAPH_SIMPLE_SINK_COMPONENT_INITIALIZE_FUNC_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_GRAPH_SIMPLE_SINK_COMPONENT_INITIALIZE_FUNC_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + Other error. + */ + BT_GRAPH_SIMPLE_SINK_COMPONENT_INITIALIZE_FUNC_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, +} bt_graph_simple_sink_component_initialize_func_status; + +/*! +@brief + User initialization function for + bt_graph_add_simple_sink_component(). + +Such an initialization function is called when the trace processing +graph becomes configured and when the simple sink component has created +its single \bt_msg_iter. This occurs the first time you call +bt_graph_run() or bt_graph_run_once() on the trace processing graph. + +See \ref api-graph-lc-add-ss "Add a simple sink component" to learn more +about adding a simple component to a trace processing graph. + +@param[in] message_iterator + @parblock + Simple sink component's upstream message iterator. + + This user function is free to get the message iterator's next + message or to make it seek. + @endparblock +@param[in] user_data + User data, as passed as the \bt_p{user_data} parameter of + bt_graph_add_simple_sink_component(). + +@retval #BT_GRAPH_SIMPLE_SINK_COMPONENT_INITIALIZE_FUNC_STATUS_OK + Success. +@retval #BT_GRAPH_SIMPLE_SINK_COMPONENT_INITIALIZE_FUNC_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_GRAPH_SIMPLE_SINK_COMPONENT_INITIALIZE_FUNC_STATUS_ERROR + Other error. + +@bt_pre_not_null{message_iterator} + +@post + The reference count of \bt_p{message_iterator} is not changed. + +@sa bt_graph_add_simple_sink_component() — + Creates and adds a simple sink component to a trace processing + graph. +*/ +typedef bt_graph_simple_sink_component_initialize_func_status +(*bt_graph_simple_sink_component_initialize_func)( + bt_message_iterator *message_iterator, + void *user_data); + +/*! +@brief + Status codes for the #bt_graph_simple_sink_component_consume_func + type. +*/ +typedef enum bt_graph_simple_sink_component_consume_func_status { + /*! + @brief + Success. + */ + BT_GRAPH_SIMPLE_SINK_COMPONENT_CONSUME_FUNC_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + End of processing. + */ + BT_GRAPH_SIMPLE_SINK_COMPONENT_CONSUME_FUNC_STATUS_END = __BT_FUNC_STATUS_END, + + /*! + @brief + Try again. + */ + BT_GRAPH_SIMPLE_SINK_COMPONENT_CONSUME_FUNC_STATUS_AGAIN = __BT_FUNC_STATUS_AGAIN, + + /*! + @brief + Out of memory. + */ + BT_GRAPH_SIMPLE_SINK_COMPONENT_CONSUME_FUNC_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + Other error. + */ + BT_GRAPH_SIMPLE_SINK_COMPONENT_CONSUME_FUNC_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, +} bt_graph_simple_sink_component_consume_func_status; + +/*! +@brief + User consuming function for bt_graph_add_simple_sink_component(). + +Such a consuming function is called when the simple sink component's own +\ref api-comp-cls-dev-meth-consume "consuming method" is called. This +occurs in a loop within bt_graph_run() or when it's this sink +component's turn to consume in +bt_graph_run_once(). + +See \ref api-graph-lc-add-ss "Add a simple sink component" to learn more +about adding a simple component to a trace processing graph. + +If you are not done consuming messages, return +#BT_GRAPH_SIMPLE_SINK_COMPONENT_CONSUME_FUNC_STATUS_OK. + +If you are done consuming messages, return +#BT_GRAPH_SIMPLE_SINK_COMPONENT_CONSUME_FUNC_STATUS_END. + +If you wish to avoid a blocking operation and make +bt_graph_run() or bt_graph_run_once() aware, return +#BT_GRAPH_SIMPLE_SINK_COMPONENT_CONSUME_FUNC_STATUS_AGAIN. + +@param[in] message_iterator + @parblock + Simple sink component's upstream message iterator. + + This user function is free to get the message iterator's next + message or to make it seek. + @endparblock +@param[in] user_data + User data, as passed as the \bt_p{user_data} parameter of + bt_graph_add_simple_sink_component(). + +@retval #BT_GRAPH_SIMPLE_SINK_COMPONENT_CONSUME_FUNC_STATUS_OK + Success. +@retval #BT_GRAPH_SIMPLE_SINK_COMPONENT_CONSUME_FUNC_STATUS_END + End of processing. +@retval #BT_GRAPH_SIMPLE_SINK_COMPONENT_CONSUME_FUNC_STATUS_AGAIN + Try again. +@retval #BT_GRAPH_SIMPLE_SINK_COMPONENT_CONSUME_FUNC_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_GRAPH_SIMPLE_SINK_COMPONENT_CONSUME_FUNC_STATUS_ERROR + Other error. + +@bt_pre_not_null{message_iterator} + +@post + The reference count of \bt_p{message_iterator} is not changed. + +@sa bt_graph_add_simple_sink_component() — + Creates and adds a simple sink component to a trace processing + graph. +*/ +typedef bt_graph_simple_sink_component_consume_func_status +(*bt_graph_simple_sink_component_consume_func)( + bt_message_iterator *message_iterator, + void *user_data); + +/*! +@brief + User finalization function for bt_graph_add_simple_sink_component(). + +Such a finalization function is called when the simple sink component +is finalized. This occurs when the trace processing graph is destroyed +(you put its last strong \ref api-fund-shared-object "reference" +with bt_graph_put_ref()). + +See \ref api-graph-lc-add-ss "Add a simple sink component" to learn more +about adding a simple component to a trace processing graph. + +@param[in] user_data + User data, as passed as the \bt_p{user_data} parameter of + bt_graph_add_simple_sink_component(). + +@bt_post_no_error + +@sa bt_graph_add_simple_sink_component() — + Creates and adds a simple sink component to a trace processing + graph. +*/ +typedef void (*bt_graph_simple_sink_component_finalize_func)(void *user_data); + +/*! +@brief + Creates a simple \bt_sink_comp, adds it to the trace processing + graph \bt_p{graph} with the name \bt_p{name}, and sets + \bt_p{*component} to the resulting component. + +See \ref api-graph-lc-add-ss "Add a simple sink component" to learn more +about adding a simple component to a trace processing graph. + +\bt_p{initialize_func} (if not \c NULL), \bt_p{consume_func}, +and \bt_p{finalize_func} (if not \c NULL) receive \bt_p{user_data} +as their own \bt_p{user_data} parameter. + +@param[in] graph + Trace processing graph to which to add the created simple sink + component. +@param[in] name + Unique name, within \bt_p{graph}, of the component to create. +@param[in] initialize_func + @parblock + User initialization function. + + Can be \c NULL. + @endparblock +@param[in] consume_func + User consuming function. +@param[in] finalize_func + @parblock + User finalization function. + + Can be \c NULL. + @endparblock +@param[in] user_data + User data to pass as the \bt_p{user_data} parameter of + \bt_p{initialize_func}, \bt_p{consume_func}, and + \bt_p{finalize_func}. +@param[out] component + On success, if not \c NULL, \bt_p{*component} is + a \em borrowed reference of the created simple sink component. + +@retval #BT_GRAPH_ADD_COMPONENT_STATUS_OK + Success. +@retval #BT_GRAPH_ADD_COMPONENT_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_GRAPH_ADD_COMPONENT_STATUS_ERROR + Other error, for example, the created sink component's + \ref api-comp-cls-dev-meth-init "initialization method" failed. + +@bt_pre_not_null{graph} +@bt_pre_graph_not_configured{graph} +@bt_pre_graph_not_faulty{graph} +@bt_pre_not_null{name} +@pre + No other component within \bt_p{graph} has the name \bt_p{name}. +@bt_pre_not_null{consume_func} +*/ extern bt_graph_add_component_status bt_graph_add_simple_sink_component(bt_graph *graph, const char *name, - bt_graph_simple_sink_component_initialize_func init_func, + bt_graph_simple_sink_component_initialize_func initialize_func, bt_graph_simple_sink_component_consume_func consume_func, bt_graph_simple_sink_component_finalize_func finalize_func, void *user_data, const bt_component_sink **component); +/*! @} */ + +/*! +@name Component port connection +@{ +*/ + +/*! +@brief + Status codes for bt_graph_connect_ports(). +*/ typedef enum bt_graph_connect_ports_status { + /*! + @brief + Success. + */ BT_GRAPH_CONNECT_PORTS_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_GRAPH_CONNECT_PORTS_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, + + /*! + @brief + Out of memory. + */ BT_GRAPH_CONNECT_PORTS_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + Other error. + */ + BT_GRAPH_CONNECT_PORTS_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, } bt_graph_connect_ports_status; +/*! +@brief + Connects the \bt_oport \bt_p{upstream_port} to the \bt_iport + \bt_p{downstream_port} within the trace processing graph + \bt_p{graph}, and sets \bt_p{*connection} to the resulting + \bt_conn. + +See \ref api-graph-lc-connect "Connect component ports" to learn more +about connecting ports within a trace processing graph. + +Both \bt_p{upstream_port} and \bt_p{downstream_port} must be +unconnected (bt_port_is_connected() returns #BT_FALSE) when you call +this function. + +@param[in] graph + Trace processing graph containing the \bt_p_comp to which belong + \bt_p{upstream_port} and \bt_p{downstream_port}. +@param[in] upstream_port + \bt_c_oport to connect to \bt_p{downstream_port}. +@param[in] downstream_port + \bt_c_iport to connect to \bt_p{upstream_port}. +@param[in] connection + On success, if not \c NULL, \bt_p{*connection} is + a \em borrowed reference of the resulting \bt_conn. + +@retval #BT_GRAPH_CONNECT_PORTS_STATUS_OK + Success. +@retval #BT_GRAPH_CONNECT_PORTS_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_GRAPH_CONNECT_PORTS_STATUS_ERROR + Other error. + +@bt_pre_not_null{graph} +@bt_pre_graph_not_configured{graph} +@bt_pre_graph_not_faulty{graph} +@bt_pre_not_null{upstream_port} +@pre + \bt_p{graph} contains the component of \bt_p{upstream_port}, + as returned by bt_port_borrow_component_const(). +@pre + \bt_p{upstream_port} is unconnected + (bt_port_is_connected() returns #BT_FALSE). +@bt_pre_not_null{downstream_port} +@pre + \bt_p{graph} contains the component of \bt_p{downstream_port}, + as returned by bt_port_borrow_component_const(). +@pre + \bt_p{downstream_port} is unconnected + (bt_port_is_connected() returns #BT_FALSE). +@pre + Connecting \bt_p{upstream_port} to \bt_p{downstream_port} does not + form a connection cycle within \bt_p{graph}. +*/ extern bt_graph_connect_ports_status bt_graph_connect_ports(bt_graph *graph, - const bt_port_output *upstream, - const bt_port_input *downstream, + const bt_port_output *upstream_port, + const bt_port_input *downstream_port, const bt_connection **connection); +/*! @} */ + +/*! +@name Running +@{ +*/ + +/*! +@brief + Status codes for bt_graph_run(). +*/ typedef enum bt_graph_run_status { + /*! + @brief + Success. + */ BT_GRAPH_RUN_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_GRAPH_RUN_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, - BT_GRAPH_RUN_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + Try again. + */ BT_GRAPH_RUN_STATUS_AGAIN = __BT_FUNC_STATUS_AGAIN, + + /*! + @brief + Out of memory. + */ + BT_GRAPH_RUN_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + Other error. + */ + BT_GRAPH_RUN_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, } bt_graph_run_status; +/*! +@brief + Runs the trace processing graph \bt_p{graph}, calling each + \bt_sink_comp's + \ref api-comp-cls-dev-meth-consume "consuming method" in a round + robin fashion until they are all done consuming or an exception + occurs. + +See \ref api-graph-lc-run "Run" to learn more about running a trace +processing graph. + +This function does \em not return until one of: + +- All the sink components are ended, in which case this function + returns #BT_GRAPH_RUN_STATUS_OK. + +- One of the sink component returns an error, in which case this + function returns #BT_GRAPH_RUN_STATUS_ERROR or + #BT_GRAPH_RUN_STATUS_MEMORY_ERROR. + +- One of the sink component returns "try again", in which case + this function returns #BT_GRAPH_RUN_STATUS_AGAIN. + + In that case, you can call this function again later, usually after + waiting for some time. + + This feature exists to allow blocking operations within components + to be postponed until they don't block. The graph user can perform + other tasks instead of the graph's thread blocking. + +- \bt_p{graph} is interrupted (see bt_graph_borrow_default_interrupter() + and bt_graph_add_interrupter()), in which case this function returns + #BT_GRAPH_RUN_STATUS_AGAIN. + + Check the \bt_intr's state with bt_interrupter_is_set() to + distinguish between a sink component returning "try again" and + \bt_p{graph} getting interrupted. + +To make a single sink component consume, then get the thread's control +back, use bt_graph_run_once(). + +When you call this function or bt_graph_run_once() for the first time, +\bt_p{graph} becomes configured. See +\ref api-graph-lc "Trace processing graph life cycle" +to learn what happens when a trace processing graph becomes configured, +and what you can and cannot do with a configured graph. + +@param[in] graph + Trace processing graph to run. + +@retval #BT_GRAPH_RUN_STATUS_OK + Success. +@retval #BT_GRAPH_RUN_STATUS_AGAIN + Try again. +@retval #BT_GRAPH_RUN_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_GRAPH_RUN_STATUS_ERROR + Other error. + +@bt_pre_not_null{graph} +@bt_pre_graph_not_faulty{graph} +@pre + For each \bt_src_comp within \bt_p{graph}, at least one \bt_oport + is connected. +@pre + For each \bt_flt_comp within \bt_p{graph}, at least one \bt_iport + and one \bt_iport are connected. +@pre + For each \bt_sink_comp within \bt_p{graph}, at least one \bt_iport + is connected. +@pre + \bt_p{graph} contains at least one sink component. + +@sa bt_graph_run_once() — + Calls a single trace processing graph's sink component's consuming + method once. +*/ extern bt_graph_run_status bt_graph_run(bt_graph *graph); +/*! +@brief + Status codes for bt_graph_run(). +*/ typedef enum bt_graph_run_once_status { + /*! + @brief + Success. + */ BT_GRAPH_RUN_ONCE_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_GRAPH_RUN_ONCE_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, - BT_GRAPH_RUN_ONCE_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, - BT_GRAPH_RUN_ONCE_STATUS_AGAIN = __BT_FUNC_STATUS_AGAIN, + + /*! + @brief + All sink components are finished processing. + */ BT_GRAPH_RUN_ONCE_STATUS_END = __BT_FUNC_STATUS_END, + + /*! + @brief + Try again. + */ + BT_GRAPH_RUN_ONCE_STATUS_AGAIN = __BT_FUNC_STATUS_AGAIN, + + /*! + @brief + Out of memory. + */ + BT_GRAPH_RUN_ONCE_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + Other error. + */ + BT_GRAPH_RUN_ONCE_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, } bt_graph_run_once_status; +/*! +@brief + Calls the \ref api-comp-cls-dev-meth-consume "consuming method" of + the next non-ended \bt_sink_comp to make consume within the trace + processing graph \bt_p{graph}. + +See \ref api-graph-lc-run "Run" to learn more about running a trace +processing graph. + +This function makes the \em next non-ended sink component consume. For +example, if \bt_p{graph} has two non-ended sink components A and B: + +- Calling bt_graph_run_once() makes sink component A consume. +- Calling bt_graph_run_once() again makes sink component B consume. +- Calling bt_graph_run_once() again makes sink component A consume. +- ... + +Considering this, if \bt_p{graph} contains a single non-ended sink +component, this function \em always makes this sink component consume. + +If the sink component's consuming method: + +
    +
    Succeeds
    +
    This function returns #BT_GRAPH_RUN_ONCE_STATUS_OK.
    + +
    Returns "try again"
    +
    This function returns #BT_GRAPH_RUN_ONCE_STATUS_AGAIN.
    + +
    Fails
    +
    + This function returns #BT_GRAPH_RUN_ONCE_STATUS_MEMORY_ERROR + or #BT_GRAPH_RUN_ONCE_STATUS_ERROR. +
    +
    + +When all the sink components of \bt_p{graph} are finished processing +(ended), this function returns #BT_GRAPH_RUN_ONCE_STATUS_END. + +bt_graph_run() calls this function in a loop until are the sink +components are ended or an exception occurs. + +When you call this function or bt_graph_run() for the first time, +\bt_p{graph} becomes configured. See +\ref api-graph-lc "Trace processing graph life cycle" +to learn what happens when a trace processing graph becomes configured, +and what you can and cannot do with a configured graph. + +@param[in] graph + Trace processing graph of which to make the next sink component + consume. + +@retval #BT_GRAPH_RUN_ONCE_STATUS_OK + Success. +@retval #BT_GRAPH_RUN_ONCE_STATUS_END + All sink components are finished processing. +@retval #BT_GRAPH_RUN_ONCE_STATUS_AGAIN + Try again. +@retval #BT_GRAPH_RUN_ONCE_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_GRAPH_RUN_ONCE_STATUS_ERROR + Other error. + +@bt_pre_not_null{graph} +@bt_pre_graph_not_faulty{graph} + +@sa bt_graph_run() — + Runs a trace processing graph, making all its sink components + consume in a round robin fashion. +*/ extern bt_graph_run_once_status bt_graph_run_once(bt_graph *graph); +/*! @} */ + +/*! +@name Interruption +@{ +*/ + +/*! +@brief + Status codes for bt_graph_add_interrupter(). +*/ +typedef enum bt_graph_add_interrupter_status { + /*! + @brief + Success. + */ + BT_GRAPH_ADD_INTERRUPTER_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_GRAPH_ADD_INTERRUPTER_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, +} bt_graph_add_interrupter_status; + +/*! +@brief + Adds the \bt_intr \bt_p{interrupter} to all the current and future + \bt_p_sink_comp and \bt_p_msg_iter of the trace processing graph + \bt_p{graph}, as well as to the graph itself. + +Sink components can check whether or not they are interrupted +with bt_self_component_sink_is_interrupted(). + +Message iterators can check whether or not they are interrupted +with bt_self_message_iterator_is_interrupted(). + +The bt_graph_run() loop intermittently checks whether or not any of the +graph's interrupters is set. If so, bt_graph_run() returns +#BT_GRAPH_RUN_STATUS_AGAIN. + +@note + @parblock + bt_graph_create() returns a trace processing graph which comes + with its own default interrupter. + + Instead of adding your own interrupter to \bt_p{graph}, you can + set its default interrupter with + + @code + bt_interrupter_set(bt_graph_borrow_default_interrupter()); + @endcode + @endparblock + +@param[in] graph + Trace processing graph to which to add \bt_p{interrupter}. +@param[in] interrupter + Interrupter to add to \bt_p{graph}. + +@retval #BT_GRAPH_ADD_INTERRUPTER_STATUS_OK + Success. +@retval #BT_GRAPH_ADD_INTERRUPTER_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{graph} +@bt_pre_graph_not_faulty{graph} +@bt_pre_not_null{interrupter} + +@sa bt_graph_borrow_default_interrupter() — + Borrows the default interrupter from a trace processing graph. +*/ +extern bt_graph_add_interrupter_status bt_graph_add_interrupter(bt_graph *graph, + const bt_interrupter *interrupter); + +/*! +@brief + Borrows the default \bt_intr from the trace processing graph + \bt_p{graph}. + +@param[in] graph + Trace processing graph from which to borrow the default interrupter. + +@returns + @parblock + \em Borrowed reference of the default interrupter of \bt_p{graph}. + + The returned pointer remains valid as long as \bt_p{graph} exists. + @endparblock + +@bt_pre_not_null{graph} + +@sa bt_graph_add_interrupter() — + Adds an interrupter to a trace processing graph. +*/ +extern bt_interrupter *bt_graph_borrow_default_interrupter(bt_graph *graph); + +/*! @} */ + +/*! +@name Listeners +@{ +*/ + +/*! +@brief + Status codes for the + bt_graph_add_*_component_*_port_added_listener() + functions. +*/ typedef enum bt_graph_add_listener_status { + /*! + @brief + Success. + */ BT_GRAPH_ADD_LISTENER_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ BT_GRAPH_ADD_LISTENER_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, } bt_graph_add_listener_status; +/*! +@brief + Status codes for the + bt_graph_*_component_*_port_added_listener_func() + types. +*/ +typedef enum bt_graph_listener_func_status { + /*! + @brief + Success. + */ + BT_GRAPH_LISTENER_FUNC_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_GRAPH_LISTENER_FUNC_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + Other error. + */ + BT_GRAPH_LISTENER_FUNC_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, +} bt_graph_listener_func_status; + +/*! +@brief + User function for + bt_graph_add_filter_component_input_port_added_listener(). + +Such a function is called whenever a \bt_flt_comp within a trace +processing graph adds an \bt_iport during the graph +\ref api-graph-lc "configuration" phase. + +See \ref api-graph-listeners "Listeners" to learn more. + +@param[in] component + Filter component which added \bt_p{port}. +@param[in] port + Input port added by \bt_p{component}. +@param[in] user_data + User data, as passed as the \bt_p{user_data} parameter of + bt_graph_add_filter_component_input_port_added_listener(). + +@retval #BT_GRAPH_LISTENER_FUNC_STATUS_OK + Success. +@retval #BT_GRAPH_LISTENER_FUNC_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_GRAPH_LISTENER_FUNC_STATUS_ERROR + Other error. + +@bt_pre_not_null{component} +@bt_pre_not_null{port} + +@sa bt_graph_add_filter_component_input_port_added_listener() — + Adds a "filter component input port added" listener to a trace + processing graph. +*/ +typedef bt_graph_listener_func_status +(*bt_graph_filter_component_input_port_added_listener_func)( + const bt_component_filter *component, + const bt_port_input *port, void *user_data); + +/*! +@brief + Adds a \"\bt_flt_comp \bt_iport added\" listener to the trace + processing graph \bt_p{graph}. + +Once this function returns, \bt_p{user_func} is called whenever a +filter component adds an input port within \bt_p{graph}. + +See \ref api-graph-listeners "Listeners" to learn more. + +@param[in] graph + Trace processing graph to add the "filter component input port + added" listener to. +@param[in] user_func + User function of the "filter component input port added" listener to + add to \bt_p{graph}. +@param[in] user_data + User data to pass as the \bt_p{user_data} parameter of + \bt_p{user_func}. +@param[out] listener_id + On success and if not \c NULL, \bt_p{*listener_id} + is the ID of the added listener within \bt_p{graph}. + +@retval #BT_GRAPH_ADD_LISTENER_STATUS_OK + Success. +@retval #BT_GRAPH_ADD_LISTENER_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{graph} +@bt_pre_graph_not_faulty{graph} +@bt_pre_not_null{user_func} +*/ extern bt_graph_add_listener_status bt_graph_add_filter_component_input_port_added_listener( bt_graph *graph, - bt_graph_filter_component_input_port_added_listener_func listener, - void *data, bt_listener_id *listener_id); + bt_graph_filter_component_input_port_added_listener_func user_func, + void *user_data, bt_listener_id *listener_id); + +/*! +@brief + User function for + bt_graph_add_sink_component_input_port_added_listener(). + +Such a function is called whenever a \bt_sink_comp within a trace +processing graph adds an \bt_iport during the graph +\ref api-graph-lc "configuration" phase. + +See \ref api-graph-listeners "Listeners" to learn more. + +@param[in] component + Filter component which added \bt_p{port}. +@param[in] port + Input port added by \bt_p{component}. +@param[in] user_data + User data, as passed as the \bt_p{user_data} parameter of + bt_graph_add_sink_component_input_port_added_listener(). + +@retval #BT_GRAPH_LISTENER_FUNC_STATUS_OK + Success. +@retval #BT_GRAPH_LISTENER_FUNC_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_GRAPH_LISTENER_FUNC_STATUS_ERROR + Other error. + +@bt_pre_not_null{component} +@bt_pre_not_null{port} + +@sa bt_graph_add_sink_component_input_port_added_listener() — + Adds a "sink component input port added" listener to a trace + processing graph. +*/ +typedef bt_graph_listener_func_status +(*bt_graph_sink_component_input_port_added_listener_func)( + const bt_component_sink *component, + const bt_port_input *port, void *user_data); + +/*! +@brief + Adds a \"\bt_sink_comp \bt_iport added\" listener to the trace + processing graph \bt_p{graph}. + +Once this function returns, \bt_p{user_func} is called whenever a +sink component adds an input port within \bt_p{graph}. + +See \ref api-graph-listeners "Listeners" to learn more. + +@param[in] graph + Trace processing graph to add the "sink component input port + added" listener to. +@param[in] user_func + User function of the "sink component input port added" listener to + add to \bt_p{graph}. +@param[in] user_data + User data to pass as the \bt_p{user_data} parameter of + \bt_p{user_func}. +@param[out] listener_id + On success and if not \c NULL, \bt_p{*listener_id} + is the ID of the added listener within \bt_p{graph}. + +@retval #BT_GRAPH_ADD_LISTENER_STATUS_OK + Success. +@retval #BT_GRAPH_ADD_LISTENER_STATUS_MEMORY_ERROR + Out of memory. +@bt_pre_not_null{graph} +@bt_pre_graph_not_faulty{graph} +@bt_pre_not_null{user_func} +*/ extern bt_graph_add_listener_status bt_graph_add_sink_component_input_port_added_listener( bt_graph *graph, - bt_graph_sink_component_input_port_added_listener_func listener, - void *data, bt_listener_id *listener_id); + bt_graph_sink_component_input_port_added_listener_func user_func, + void *user_data, bt_listener_id *listener_id); +/*! +@brief + User function for + bt_graph_add_source_component_output_port_added_listener(). + +Such a function is called whenever a \bt_src_comp within a trace +processing graph adds an \bt_oport during the graph +\ref api-graph-lc "configuration" phase. + +See \ref api-graph-listeners "Listeners" to learn more. + +@param[in] component + Filter component which added \bt_p{port}. +@param[in] port + Input port added by \bt_p{component}. +@param[in] user_data + User data, as passed as the \bt_p{user_data} parameter of + bt_graph_add_source_component_output_port_added_listener(). + +@retval #BT_GRAPH_LISTENER_FUNC_STATUS_OK + Success. +@retval #BT_GRAPH_LISTENER_FUNC_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_GRAPH_LISTENER_FUNC_STATUS_ERROR + Other error. + +@bt_pre_not_null{component} +@bt_pre_not_null{port} + +@sa bt_graph_add_source_component_output_port_added_listener() — + Adds a "source component output port added" listener to a trace + processing graph. +*/ +typedef bt_graph_listener_func_status +(*bt_graph_source_component_output_port_added_listener_func)( + const bt_component_source *component, + const bt_port_output *port, void *user_data); + +/*! +@brief + Adds a \"\bt_src_comp \bt_oport added\" listener to the trace + processing graph \bt_p{graph}. + +Once this function returns, \bt_p{user_func} is called whenever a +source component adds an output port within \bt_p{graph}. + +See \ref api-graph-listeners "Listeners" to learn more. + +@param[in] graph + Trace processing graph to add the "source component output port + added" listener to. +@param[in] user_func + User function of the "source component output port added" listener + to add to \bt_p{graph}. +@param[in] user_data + User data to pass as the \bt_p{user_data} parameter of + \bt_p{user_func}. +@param[out] listener_id + On success and if not \c NULL, \bt_p{*listener_id} + is the ID of the added listener within \bt_p{graph}. + +@retval #BT_GRAPH_ADD_LISTENER_STATUS_OK + Success. +@retval #BT_GRAPH_ADD_LISTENER_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{graph} +@bt_pre_graph_not_faulty{graph} +@bt_pre_not_null{user_func} +*/ extern bt_graph_add_listener_status bt_graph_add_source_component_output_port_added_listener( bt_graph *graph, - bt_graph_source_component_output_port_added_listener_func listener, - void *data, bt_listener_id *listener_id); + bt_graph_source_component_output_port_added_listener_func user_func, + void *user_data, bt_listener_id *listener_id); + +/*! +@brief + User function for + bt_graph_add_filter_component_output_port_added_listener(). + +Such a function is called whenever a \bt_flt_comp within a trace +processing graph adds an \bt_oport during the graph +\ref api-graph-lc "configuration" phase. + +See \ref api-graph-listeners "Listeners" to learn more. + +@param[in] component + Filter component which added \bt_p{port}. +@param[in] port + Input port added by \bt_p{component}. +@param[in] user_data + User data, as passed as the \bt_p{user_data} parameter of + bt_graph_add_filter_component_output_port_added_listener(). + +@retval #BT_GRAPH_LISTENER_FUNC_STATUS_OK + Success. +@retval #BT_GRAPH_LISTENER_FUNC_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_GRAPH_LISTENER_FUNC_STATUS_ERROR + Other error. + +@bt_pre_not_null{component} +@bt_pre_not_null{port} + +@sa bt_graph_add_filter_component_output_port_added_listener() — + Adds a "filter component output port added" listener to a trace + processing graph. +*/ +typedef bt_graph_listener_func_status +(*bt_graph_filter_component_output_port_added_listener_func)( + const bt_component_filter *component, + const bt_port_output *port, void *user_data); + +/*! +@brief + Adds a \"\bt_flt_comp \bt_oport added\" listener to the trace + processing graph \bt_p{graph}. + +Once this function returns, \bt_p{user_func} is called whenever a +filter component adds an output port within \bt_p{graph}. + +See \ref api-graph-listeners "Listeners" to learn more. +@param[in] graph + Trace processing graph to add the "filter component output port + added" listener to. +@param[in] user_func + User function of the "filter component output port added" listener + to add to \bt_p{graph}. +@param[in] user_data + User data to pass as the \bt_p{user_data} parameter of + \bt_p{user_func}. +@param[out] listener_id + On success and if not \c NULL, \bt_p{*listener_id} + is the ID of the added listener within \bt_p{graph}. + +@retval #BT_GRAPH_ADD_LISTENER_STATUS_OK + Success. +@retval #BT_GRAPH_ADD_LISTENER_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{graph} +@bt_pre_graph_not_faulty{graph} +@bt_pre_not_null{user_func} +*/ extern bt_graph_add_listener_status bt_graph_add_filter_component_output_port_added_listener( bt_graph *graph, - bt_graph_filter_component_output_port_added_listener_func listener, - void *data, bt_listener_id *listener_id); + bt_graph_filter_component_output_port_added_listener_func user_func, + void *user_data, bt_listener_id *listener_id); -typedef enum bt_graph_add_interrupter_status { - BT_GRAPH_ADD_INTERRUPTER_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_GRAPH_ADD_INTERRUPTER_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, -} bt_graph_add_interrupter_status; +/*! @} */ -extern bt_graph_add_interrupter_status bt_graph_add_interrupter(bt_graph *graph, - const bt_interrupter *interrupter); +/*! +@name Reference count +@{ +*/ -extern bt_interrupter *bt_graph_borrow_default_interrupter(bt_graph *graph); +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the trace processing graph \bt_p{graph}. + +@param[in] graph + @parblock + Trace processing graph of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_graph_put_ref() — + Decrements the reference count of a trace processing graph. +*/ +extern void bt_graph_get_ref(const bt_graph *graph); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the trace processing graph \bt_p{graph}. + +@param[in] graph + @parblock + Trace processing graph of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_graph_get_ref() — + Increments the reference count of a trace processing graph. +*/ +extern void bt_graph_put_ref(const bt_graph *graph); + +/*! +@brief + Decrements the reference count of the trace processing graph + \bt_p{_graph}, and then sets \bt_p{_graph} to \c NULL. + +@param _graph + @parblock + Trace processing graph of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_graph} +*/ +#define BT_GRAPH_PUT_REF_AND_RESET(_graph) \ + do { \ + bt_graph_put_ref(_graph); \ + (_graph) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the trace processing graph + \bt_p{_dst}, sets \bt_p{_dst} to \bt_p{_src}, and then sets + \bt_p{_src} to \c NULL. + +This macro effectively moves a trace processing graph reference from the +expression \bt_p{_src} to the expression \bt_p{_dst}, putting the +existing \bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_GRAPH_MOVE_REF(_dst, _src) \ + do { \ + bt_graph_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! @} */ #ifdef __cplusplus } diff --git a/include/babeltrace2/graph/interrupter-const.h b/include/babeltrace2/graph/interrupter-const.h deleted file mode 100644 index 8a85dcca..00000000 --- a/include/babeltrace2/graph/interrupter-const.h +++ /dev/null @@ -1,59 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_INTERRUPTER_CONST_H -#define BABELTRACE2_GRAPH_INTERRUPTER_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern bt_bool bt_interrupter_is_set(const bt_interrupter *interrupter); - -extern void bt_interrupter_get_ref(const bt_interrupter *interrupter); - -extern void bt_interrupter_put_ref(const bt_interrupter *interrupter); - -#define BT_INTERRUPTER_PUT_REF_AND_RESET(_var) \ - do { \ - bt_interrupter_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_INTERRUPTER_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_interrupter_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_INTERRUPTER_CONST_H */ diff --git a/include/babeltrace2/graph/interrupter.h b/include/babeltrace2/graph/interrupter.h index 95377532..56c022e2 100644 --- a/include/babeltrace2/graph/interrupter.h +++ b/include/babeltrace2/graph/interrupter.h @@ -33,12 +33,258 @@ extern "C" { #endif +/*! +@defgroup api-intr Interrupter +@ingroup api-graph + +@brief + Interrupter. + +An interrupter is a simple object which has +a single boolean state: set or not set. + +You can use an interrupter to interrupt a running trace processing +\bt_graph or \ref api-qexec "query". The user and library functions periodically +check if they are interrupted (with +bt_self_component_sink_is_interrupted(), +bt_self_message_iterator_is_interrupted(), or +bt_query_executor_is_interrupted()); meanwhile, another thread or +a signal handler sets the shared interrupter with bt_interrupter_set(). + +To interrupt a running trace processing graph or query: + +-# Create an interrupter with bt_interrupter_create(). + +-# Before running a trace processing graph with bt_graph_run() or + performing a query with bt_query_executor_query(), add + the created interrupter to the object with bt_graph_add_interrupter() + or bt_query_executor_add_interrupter(). + + Alternatively, you can borrow the existing, default interrupter from + those objects with bt_graph_borrow_default_interrupter() and + bt_query_executor_borrow_default_interrupter(). + +-# Run the graph with bt_graph_run() or perform the query with + bt_query_executor_query(). + +-# From a signal handler or another thread, call bt_interrupter_set() to + set the shared interrupter. + +Eventually, the trace processing graph or query thread checks if it's +interrupted and stops processing, usually returning a status code which +ends with \c _AGAIN. + +You can add more than one interrupter to a trace processing graph and +to a query executor. The bt_self_component_sink_is_interrupted(), +bt_self_message_iterator_is_interrupted(), and +bt_query_executor_is_interrupted() functions return the logical +disjunction of all the added interrupters's states, so that \em any +interrupter can interrupt the thread. + +Once a trace processing graph or a query executor is interrupted and +you get the thread's control back, you can reset the interrupter +with bt_interrupter_reset() and continue the previous operation, +calling bt_graph_run() or bt_query_executor_query() again. + +An interrupter is a \ref api-fund-shared-object "shared object": get a +new reference with bt_interrupter_get_ref() and put an existing +reference with bt_interrupter_put_ref(). + +The type of an interrupter is #bt_interrupter. +*/ + +/*! @{ */ + +/*! +@name Type +@{ + +@typedef struct bt_interrupter bt_interrupter; + +@brief + Interrupter. + +@} +*/ + +/*! +@name Creation +@{ +*/ + +/*! +@brief + Creates a default interrupter. + +On success, the returned interrupter is \em not set +(bt_interrupter_is_set() returns #BT_FALSE). + +@returns + New interrupter reference, or \c NULL on memory error. +*/ extern bt_interrupter *bt_interrupter_create(void); +/*! @} */ + +/*! +@name State +@{ +*/ + +/*! +@brief + Sets the interrupter \bt_p{interrupter}. + +After you call this function, bt_interrupter_is_set() returns +#BT_TRUE. + +@param[in] interrupter + Interrupter to set. + +@bt_pre_not_null{interrupter} + +@sa bt_interrupter_reset() — + Resets an interrupter. +@sa bt_interrupter_is_set() — + Returns whether or not an interrupter is set. +*/ extern void bt_interrupter_set(bt_interrupter *interrupter); +/*! +@brief + Resets the interrupter \bt_p{interrupter}. + +After you call this function, bt_interrupter_is_set() returns +#BT_FALSE. + +@param[in] interrupter + Interrupter to reset. + +@bt_pre_not_null{interrupter} + +@sa bt_interrupter_set() — + Sets an interrupter. +@sa bt_interrupter_is_set() — + Returns whether or not an interrupter is set. +*/ extern void bt_interrupter_reset(bt_interrupter *interrupter); +/*! +@brief + Returns whether or not the interrupter \bt_p{interrupter} is set. + +@param[in] interrupter + Interrupter to reset. + +@returns + #BT_TRUE if \bt_p{interrupter} is set. + +@bt_pre_not_null{interrupter} + +@sa bt_interrupter_set() — + Sets an interrupter. +@sa bt_interrupter_reset() — + Resets an interrupter. +*/ +extern bt_bool bt_interrupter_is_set(const bt_interrupter *interrupter); + +/*! @} */ + +/*! +@name Reference count +@{ +*/ + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the interrupter \bt_p{interrupter}. + +@param[in] interrupter + @parblock + Interrupter of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_interrupter_put_ref() — + Decrements the reference count of an interrupter. +*/ +extern void bt_interrupter_get_ref(const bt_interrupter *interrupter); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the interrupter \bt_p{interrupter}. + +@param[in] interrupter + @parblock + Interrupter of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_interrupter_get_ref() — + Increments the reference count of an interrupter. +*/ +extern void bt_interrupter_put_ref(const bt_interrupter *interrupter); + +/*! +@brief + Decrements the reference count of the interrupter + \bt_p{_interrupter}, and then sets \bt_p{_interrupter} to \c NULL. + +@param _interrupter + @parblock + Interrupter of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_interrupter} +*/ +#define BT_INTERRUPTER_PUT_REF_AND_RESET(_interrupter) \ + do { \ + bt_interrupter_put_ref(_interrupter); \ + (_interrupter) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the interrupter \bt_p{_dst}, sets + \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} to \c NULL. + +This macro effectively moves an interrupter reference from the +expression \bt_p{_src} to the expression \bt_p{_dst}, putting the +existing \bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_INTERRUPTER_MOVE_REF(_dst, _src) \ + do { \ + bt_interrupter_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! @} */ + #ifdef __cplusplus } #endif diff --git a/include/babeltrace2/graph/message-const.h b/include/babeltrace2/graph/message-const.h deleted file mode 100644 index 0612b3c8..00000000 --- a/include/babeltrace2/graph/message-const.h +++ /dev/null @@ -1,79 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_MESSAGE_CONST_H -#define BABELTRACE2_GRAPH_MESSAGE_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Message types. Unhandled message types should be ignored. - */ -typedef enum bt_message_type { - BT_MESSAGE_TYPE_EVENT = 1 << 0, - BT_MESSAGE_TYPE_MESSAGE_ITERATOR_INACTIVITY = 1 << 1, - BT_MESSAGE_TYPE_STREAM_BEGINNING = 1 << 2, - BT_MESSAGE_TYPE_STREAM_END = 1 << 3, - BT_MESSAGE_TYPE_PACKET_BEGINNING = 1 << 4, - BT_MESSAGE_TYPE_PACKET_END = 1 << 5, - BT_MESSAGE_TYPE_DISCARDED_EVENTS = 1 << 6, - BT_MESSAGE_TYPE_DISCARDED_PACKETS = 1 << 7, -} bt_message_type; - -/** - * Get a message's type. - * - * @param message Message instance - * @returns One of #bt_message_type - */ -extern bt_message_type bt_message_get_type(const bt_message *message); - -extern void bt_message_get_ref(const bt_message *message); - -extern void bt_message_put_ref(const bt_message *message); - -#define BT_MESSAGE_PUT_REF_AND_RESET(_var) \ - do { \ - bt_message_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_MESSAGE_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_message_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_MESSAGE_CONST_H */ diff --git a/include/babeltrace2/graph/message-discarded-events-const.h b/include/babeltrace2/graph/message-discarded-events-const.h deleted file mode 100644 index 87508e2c..00000000 --- a/include/babeltrace2/graph/message-discarded-events-const.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_MESSAGE_DISCARDED_EVENTS_CONST_H -#define BABELTRACE2_GRAPH_MESSAGE_DISCARDED_EVENTS_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern const bt_clock_snapshot * -bt_message_discarded_events_borrow_beginning_default_clock_snapshot_const( - const bt_message *msg); - -extern const bt_clock_snapshot * -bt_message_discarded_events_borrow_end_default_clock_snapshot_const( - const bt_message *msg); - -extern const bt_clock_class * -bt_message_discarded_events_borrow_stream_class_default_clock_class_const( - const bt_message *msg); - -extern const bt_stream * -bt_message_discarded_events_borrow_stream_const(const bt_message *message); - -extern bt_property_availability bt_message_discarded_events_get_count( - const bt_message *message, uint64_t *count); - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_MESSAGE_DISCARDED_EVENTS_CONST_H */ diff --git a/include/babeltrace2/graph/message-discarded-events.h b/include/babeltrace2/graph/message-discarded-events.h deleted file mode 100644 index 0b102fa3..00000000 --- a/include/babeltrace2/graph/message-discarded-events.h +++ /dev/null @@ -1,57 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_MESSAGE_DISCARDED_EVENTS_H -#define BABELTRACE2_GRAPH_MESSAGE_DISCARDED_EVENTS_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern bt_message *bt_message_discarded_events_create( - bt_self_message_iterator *message_iterator, - const bt_stream *stream); - -extern bt_message *bt_message_discarded_events_create_with_default_clock_snapshots( - bt_self_message_iterator *message_iterator, - const bt_stream *stream, uint64_t beginning_raw_value, - uint64_t end_raw_value); - -extern bt_stream *bt_message_discarded_events_borrow_stream( - bt_message *message); - -extern void bt_message_discarded_events_set_count(bt_message *message, - uint64_t count); - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_MESSAGE_DISCARDED_EVENTS_H */ diff --git a/include/babeltrace2/graph/message-discarded-packets-const.h b/include/babeltrace2/graph/message-discarded-packets-const.h deleted file mode 100644 index a528b760..00000000 --- a/include/babeltrace2/graph/message-discarded-packets-const.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_MESSAGE_DISCARDED_PACKETS_CONST_H -#define BABELTRACE2_GRAPH_MESSAGE_DISCARDED_PACKETS_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern const bt_clock_snapshot * -bt_message_discarded_packets_borrow_beginning_default_clock_snapshot_const( - const bt_message *msg); - -extern const bt_clock_snapshot * -bt_message_discarded_packets_borrow_end_default_clock_snapshot_const( - const bt_message *msg); - -extern const bt_clock_class * -bt_message_discarded_packets_borrow_stream_class_default_clock_class_const( - const bt_message *msg); - -extern const bt_stream * -bt_message_discarded_packets_borrow_stream_const(const bt_message *message); - -extern bt_property_availability bt_message_discarded_packets_get_count( - const bt_message *message, uint64_t *count); - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_MESSAGE_DISCARDED_PACKETS_CONST_H */ diff --git a/include/babeltrace2/graph/message-discarded-packets.h b/include/babeltrace2/graph/message-discarded-packets.h deleted file mode 100644 index c268d54d..00000000 --- a/include/babeltrace2/graph/message-discarded-packets.h +++ /dev/null @@ -1,57 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_MESSAGE_DISCARDED_PACKETS_H -#define BABELTRACE2_GRAPH_MESSAGE_DISCARDED_PACKETS_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern bt_message *bt_message_discarded_packets_create( - bt_self_message_iterator *message_iterator, - const bt_stream *stream); - -extern bt_message *bt_message_discarded_packets_create_with_default_clock_snapshots( - bt_self_message_iterator *message_iterator, - const bt_stream *stream, uint64_t beginning_raw_value, - uint64_t end_raw_value); - -extern bt_stream *bt_message_discarded_packets_borrow_stream( - bt_message *message); - -extern void bt_message_discarded_packets_set_count(bt_message *message, - uint64_t count); - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_MESSAGE_DISCARDED_PACKETS_H */ diff --git a/include/babeltrace2/graph/message-event-const.h b/include/babeltrace2/graph/message-event-const.h deleted file mode 100644 index 3cb886c7..00000000 --- a/include/babeltrace2/graph/message-event-const.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_MESSAGE_EVENT_CONST_H -#define BABELTRACE2_GRAPH_MESSAGE_EVENT_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern const bt_event *bt_message_event_borrow_event_const( - const bt_message *message); - -extern const bt_clock_snapshot * -bt_message_event_borrow_default_clock_snapshot_const(const bt_message *msg); - -extern const bt_clock_class * -bt_message_event_borrow_stream_class_default_clock_class_const( - const bt_message *msg); - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_MESSAGE_EVENT_CONST_H */ diff --git a/include/babeltrace2/graph/message-event.h b/include/babeltrace2/graph/message-event.h deleted file mode 100644 index 739a6848..00000000 --- a/include/babeltrace2/graph/message-event.h +++ /dev/null @@ -1,69 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_MESSAGE_EVENT_H -#define BABELTRACE2_GRAPH_MESSAGE_EVENT_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern -bt_message *bt_message_event_create( - bt_self_message_iterator *message_iterator, - const bt_event_class *event_class, - const bt_stream *stream); - -extern -bt_message *bt_message_event_create_with_packet( - bt_self_message_iterator *message_iterator, - const bt_event_class *event_class, - const bt_packet *packet); - -extern -bt_message *bt_message_event_create_with_default_clock_snapshot( - bt_self_message_iterator *message_iterator, - const bt_event_class *event_class, - const bt_stream *stream, uint64_t raw_clock_value); - -extern -bt_message *bt_message_event_create_with_packet_and_default_clock_snapshot( - bt_self_message_iterator *message_iterator, - const bt_event_class *event_class, - const bt_packet *packet, uint64_t raw_clock_value); - -extern bt_event *bt_message_event_borrow_event( - bt_message *message); - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_MESSAGE_EVENT_H */ diff --git a/include/babeltrace2/graph/message-iterator-class.h b/include/babeltrace2/graph/message-iterator-class.h index 3ee9c0da..e668a515 100644 --- a/include/babeltrace2/graph/message-iterator-class.h +++ b/include/babeltrace2/graph/message-iterator-class.h @@ -31,131 +31,1216 @@ extern "C" { #endif -typedef enum bt_message_iterator_class_set_method_status { - BT_MESSAGE_ITERATOR_CLASS_SET_METHOD_STATUS_OK = __BT_FUNC_STATUS_OK, -} bt_message_iterator_class_set_method_status; +/*! +@defgroup api-msg-iter-cls Message iterator class +@ingroup api-comp-cls-dev + +@brief + \bt_c_msg_iter class. + +A message iterator class is the class of a +\bt_msg_iter. + +@image html msg-iter-cls.png + +\bt_cp_src_comp_cls and \bt_p_flt_comp_cls contain a message iterator +class. For such a component class, its message iterator class is the +class of any message iterator created for any \bt_oport of the +component class's instances (\bt_p_comp). + +Therefore, the only thing you can do with a message iterator class is to +pass it to bt_component_class_source_create() or +bt_component_class_filter_create() to set it as the created component +class's message iterator class. + +A message iterator class has methods. This module essentially +offers: + +- Message iterator class method type definitions. + +- A message iterator class creation function, to which you must pass + the mandatory \link api-msg-iter-cls-meth-next "next" method\endlink. + +- Functions to set optional message iterator class methods. + +A message iterator class method is a user function. All message iterator +class methods operate on an instance (a \bt_msg_iter). The type of the +method's first parameter is #bt_self_message_iterator. This is similar +to an instance method in Python (where the instance object name is +generally self) or a member function in C++ (where the +instance pointer is named this), for example. + +See \ref api-msg-iter-cls-methods "Methods" to learn more about the +different types of message iterator class methods. + +A message iterator class is a +\ref api-fund-shared-object "shared object": get a new reference with +bt_message_iterator_class_get_ref() and put an existing reference with +bt_message_iterator_class_put_ref(). + +Some library functions \ref api-fund-freezing "freeze" message iterator +classes on success. The documentation of those functions indicate this +postcondition. + +The type of a message iterator class is #bt_message_iterator_class. + +Create a message iterator class with bt_message_iterator_class_create(). +When you call this function, you must pass the message iterator +class's mandatory +\link api-msg-iter-cls-meth-next "next" method\endlink. + +

    \anchor api-msg-iter-cls-methods Methods

    + +To learn when exactly the methods below are called, see +\ref api-graph-lc "Trace processing graph life cycle" and +\ref api-msg-iter. + +The available message iterator class methods to implement are: + + + + + + + + + + +
    Name + Requirement + C type +
    Can seek beginning? + Optional + #bt_message_iterator_class_can_seek_beginning_method +
    Can seek ns from origin? + Optional + #bt_message_iterator_class_can_seek_ns_from_origin_method +
    Finalize + Optional + #bt_message_iterator_class_finalize_method +
    Initialize + Optional + #bt_message_iterator_class_initialize_method +
    Next + Mandatory + #bt_message_iterator_class_next_method +
    Seek beginning + Optional + #bt_message_iterator_class_seek_beginning_method +
    Seek ns from origin + Optional + #bt_message_iterator_class_seek_ns_from_origin_method +
    + +
    +
    + \anchor api-msg-iter-cls-meth-can-seek-beg + Can seek beginning? +
    +
    + Called to check whether or not your \bt_msg_iter can currently + seek its beginning (the very first message of its + \ref api-msg-seq "sequence"). + + There are some use cases in which a message iterator cannot always + seek its beginning, depending on its state. + + If you don't implement this method, then, if you implement the + \ref api-msg-iter-cls-meth-seek-beg "seek beginning" method, the + library assumes that your message iterator can always seek its + beginning. + + The message iterator of a \bt_flt_comp will typically consider + the beginning seeking capability of its own upstream message + iterator(s) (with bt_message_iterator_can_seek_beginning()) in this + method's implementation. + + If you need to block the thread to compute whether or not your + message iterator can seek its beginning, you can instead report to + try again later to the caller by returning + #BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_BEGINNING_METHOD_STATUS_AGAIN. + + Set this optional method with the \bt_p{can_seek_method} parameter + of bt_message_iterator_class_set_seek_beginning_methods(). +
    + +
    + \anchor api-msg-iter-cls-meth-can-seek-ns + Can seek ns from origin? +
    +
    + Called to check whether or not your \bt_msg_iter can currently + seek a message occuring at or after a specific time given in + nanoseconds from its + \ref api-tir-clock-cls-origin "clock class origin". + + There are some use cases in which a message iterator cannot always + seek some specific time, depending on its state. + + Within this method, your receive the specific time to seek as the + \bt_p{ns_from_origin} parameter. You don't receive any + \bt_clock_cls: the method operates at the nanosecond from some + origin level and it is left to the implementation to decide whether + or not the message iterator can seek this point in time. + + If you don't implement this method, then, if you implement the + \ref api-msg-iter-cls-meth-seek-ns "seek ns from origin" method, the + library assumes that your message iterator can always seek any + message occuring at or after any time. + + The message iterator of a \bt_flt_comp will typically consider + the time seeking capability of its own upstream message + iterator(s) (with bt_message_iterator_can_seek_ns_from_origin()) in + this method's implementation. + + If you need to block the thread to compute whether or not your + message iterator can seek a message occuring at or after a given + time, you can instead report to try again later to the caller by + returning + #BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_AGAIN. + + Set this optional method with the \bt_p{can_seek_method} parameter + of bt_message_iterator_class_set_seek_ns_from_origin_methods(). +
    + +
    + \anchor api-msg-iter-cls-meth-fini + Finalize +
    +
    + Called to finalize your \bt_msg_iter, that is, to let you + destroy/free/finalize any user data you have (retrieved with + bt_self_message_iterator_get_data()). + + The \bt_name library does not specify exactly when this method is + called, but guarantees that it's called before the message iterator + is destroyed. + + The library guarantees that all message iterators are destroyed + before their component is destroyed. + + This method is \em not called if the message iterator's + \ref api-msg-iter-cls-meth-init "initialization method" + previously returned an error status code. + + Set this optional method with + bt_message_iterator_class_set_finalize_method(). +
    + +
    + \anchor api-msg-iter-cls-meth-init + Initialize +
    +
    + Called within bt_message_iterator_create_from_message_iterator() + or bt_message_iterator_create_from_sink_component() to initialize + your \bt_msg_iter. + + Within this method, you can access your \bt_comp's user data + by first borrowing it with + bt_self_message_iterator_borrow_component() and then using + bt_self_component_get_data(). + + For the message iterator of a \bt_flt_comp, this method is + typically where you create an upstream \bt_msg_iter + with bt_message_iterator_create_from_message_iterator(). + + You can create user data and set it as the \bt_self_msg_iter's user + data with bt_self_message_iterator_set_data(). + + If you return #BT_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_STATUS_OK + from this method, then your message iterator's + \ref api-msg-iter-cls-meth-fini "finalization method" will be + called, if it exists, when your message iterator is finalized. + + This method receives a message iterator configuration object + (#bt_self_message_iterator_configuration type). As of + \bt_name_version_min_maj, you can use + bt_self_message_iterator_configuration_set_can_seek_forward() + during, and only during, this method's execution to set whether or + not your message iterator can seek forward. + + For a message iterator to be able to seek forward, all the \bt_p_msg + of its message sequence must have some \bt_cs. + bt_message_iterator_seek_ns_from_origin() uses this configuration + option and the beginning seeking capability of a message iterator + (bt_message_iterator_can_seek_beginning()) + to make it seek a message occuring at or after a specific time even + when the message iterator does not implement the + \ref api-msg-iter-cls-meth-seek-ns "seek ns from origin" method. + + Set this optional method with + bt_message_iterator_class_set_initialize_method(). +
    + +
    + \anchor api-msg-iter-cls-meth-next + "Next" (get next messages) +
    +
    + Called within bt_message_iterator_next() + to "advance" your \bt_msg_iter, that is, to get its next + messages. + + Within this method, you receive: + + - An array of \bt_p_msg to fill (\bt_p{messages} parameter) + with your message iterator's next messages, if any. + + Note that this array needs its own message + \ref api-fund-shared-object "references". In other + words, if you have a message reference and you put this message + into the array without calling bt_message_get_ref(), then you just + \em moved the message reference to the array (the array owns the + message now). + + - The capacity of the message array (\bt_p{capacity} parameter), + that is, the maximum number of messages you can put in it. + + - A message count output parameter (\bt_p{count}) which, on success, + you must set to the number of messages you put in the message + array. + + If you return #BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_OK + from this method, then you must put at least one message in the + message array. In other words, \bt_p{*count} must be greater than + zero. + + You must honour the \ref api-msg-seq "message sequence rules" when + you put new or existing messages in the message array. + + If you return #BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_OK, + then all the messages of the message array become + \ref api-fund-freezing "frozen". + + This method typically: + +
    +
    For a \bt_src_comp's message iterator
    +
    + Creates brand new \bt_p_msg to represent one or more input + traces. +
    + +
    For a \bt_flt_comp's message iterator
    +
    + Gets \em one message batch from one (or more) upstream + \bt_msg_iter and filters them. +
    +
    + + For a source component's message iterator, you are free to create + as many as \bt_p{capacity} messages. For a filter component's + message iterator, you are free to get more than one batch of + messages from upstream message iterators if needed. However, in both + cases, keep in mind that the \bt_name project recommends that this + method executes fast enough so as not to block an interactive + application running on the same thread. + + During what you consider to be a long, blocking operation, the + project recommends that you periodically check whether or not you + are interrupted with bt_self_message_iterator_is_interrupted(). When + you are, you can return either + #BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_AGAIN or + #BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_ERROR, depending on + your capability to continue the current operation later. + + If you need to block the thread to insert messages into the message + array, you can instead report to try again later to the caller by + returning #BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_AGAIN. + When you return this status code, you must \em not put any message + into the message array. + + If your message iterator's iteration process is done (you have no + more messages to emit), then return + #BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_END. When you return + this status code, you must \em not put any message into the message + array. + + Set this mandatory method at message iterator class creation time + with bt_message_iterator_class_create(). +
    + +
    + \anchor api-msg-iter-cls-meth-seek-beg + Seek beginning +
    +
    + Called within bt_message_iterator_seek_beginning() to make + your message iterator seek its beginning, that is, the very first + message of its \ref api-msg-seq "sequence". + + The sequence of messages of a given message iterator must always be + the same, in that, if your message iterator emitted the messages A, + B, C, D, and E, and then this "seek beginning" method is called + successfully + (it returns + #BT_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHOD_STATUS_OK), + then your message iterator's next messages (the next time your + \link api-msg-iter-cls-meth-next "next" method\endlink + is called) must be A, B, C, D, and E. + + The \bt_name project recommends that this method executes fast + enough so as not to block an interactive application running on the + same thread. + + During what you consider to be a long, blocking operation, the + project recommends that you periodically check whether or not you + are interrupted with bt_self_message_iterator_is_interrupted(). When + you are, you can return either + #BT_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHOD_STATUS_AGAIN or + #BT_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHOD_STATUS_ERROR, + depending on your capability to continue the current operation + later. + + If you need to block the thread to make your message iterator seek + its beginning, you can instead report to try again later to the + caller by returning + #BT_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHOD_STATUS_AGAIN. + + The optional + \ref api-msg-iter-cls-meth-can-seek-beg "can seek beginning?" + method can indicate whether or not your message iterator can + currently seek its beginning. If you implement it, the library + guarantees that it is called and returns #BT_TRUE before this "seek + beginning" is called, without any other message iterator methods + being called in between. + + Set this optional method with the \bt_p{seek_method} parameter + of bt_message_iterator_class_set_seek_beginning_methods(). +
    + +
    + \anchor api-msg-iter-cls-meth-seek-ns + Seek ns from origin +
    +
    + Called within bt_message_iterator_seek_ns_from_origin() to make + your message iterator seek a message occuring at or after a specific + time given in nanoseconds from its + \ref api-tir-clock-cls-origin "clock class origin". + + Within this method, your receive the specific time to seek as the + \bt_p{ns_from_origin} parameter. You don't receive any + \bt_clock_cls: the method operates at the nanosecond from some + origin level and it is left to the implementation to seek a message + having at least this time while still honouring the + \ref api-msg-seq "message sequence rules" the next time your + \link api-msg-iter-cls-meth-next "next" method\endlink is called. + + If you return + #BT_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_OK from + this method, then the next time your + \link api-msg-iter-cls-meth-next "next" method\endlink is called: + + - For each "active" \bt_stream at the seeked time point, you must + emit a \bt_sb_msg for this stream before you emit any other + message for this stream. + + The stream beginning message must have a + \ref api-msg-sb-prop-cs "default clock snapshot" which corresponds + to the seeked time point. + + - For each "active" \bt_pkt at the seeked time point, you must + emit a \bt_pb_msg for this packet before you emit any other + message for this packet. + + The packet beginning message must have a + \ref api-msg-pb-prop-cs "default clock snapshot" which corresponds + to the seeked time point. + + The \bt_name project recommends that this method executes fast + enough so as not to block an interactive application running on the + same thread. + + During what you consider to be a long, blocking operation, the + project recommends that you periodically check whether or not you + are interrupted with bt_self_message_iterator_is_interrupted(). When + you are, you can return either + #BT_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_AGAIN + or + #BT_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_ERROR, + depending on your capability to continue the current operation + later. + + If you need to block the thread to make your message iterator seek a + message occuring at or after a given time, you can instead report to + try again later to the caller by returning + #BT_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_AGAIN. + + The optional + \ref api-msg-iter-cls-meth-can-seek-ns "can seek ns from origin?" + method can indicate whether or not your message iterator can + currently seek a specific time. If you implement it, the library + guarantees that it is called and returns #BT_TRUE before this "seek + ns from origin" is called, without any other message iterator + methods being called in between. + + Set this optional method with the \bt_p{seek_method} parameter + of bt_message_iterator_class_set_seek_ns_from_origin_methods(). +
    +
    + +Within any method, you can access the \bt_msg_iter's \bt_comp's +configured \ref #bt_logging_level "logging level" by first upcasting the +\bt_self_comp to the #bt_component type with +bt_self_component_as_component(), and then with +bt_component_get_logging_level(). +*/ + +/*! @{ */ + +/*! +@name Type +@{ + +@typedef struct bt_message_iterator_class bt_message_iterator_class; + +@brief + Message iterator class. + +@} +*/ + +/*! +@name Method types +@{ +*/ + +/*! +@brief + Status codes for #bt_message_iterator_class_can_seek_beginning_method. +*/ +typedef enum bt_message_iterator_class_can_seek_beginning_method_status { + /*! + @brief + Success. + */ + BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_BEGINNING_METHOD_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Try again. + */ + BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_BEGINNING_METHOD_STATUS_AGAIN = __BT_FUNC_STATUS_AGAIN, + + /*! + @brief + Out of memory. + */ + BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_BEGINNING_METHOD_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + User error. + */ + BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_BEGINNING_METHOD_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, +} bt_message_iterator_class_can_seek_beginning_method_status; + +/*! +@brief + \bt_c_msg_iter "can seek beginning?" method. + +See the \ref api-msg-iter-cls-meth-can-seek-beg "can seek beginning?" +method. + +@param[in] self_message_iterator + Message iterator instance. +@param[out] can_seek_beginning + On success, \bt_p{*can_seek_beginning} is + #BT_TRUE if \bt_p{self_message_iterator} can currently seek its + beginning. + +@retval #BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_BEGINNING_METHOD_STATUS_OK + Success. +@retval #BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_BEGINNING_METHOD_STATUS_AGAIN + Try again. +@retval #BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_BEGINNING_METHOD_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_BEGINNING_METHOD_STATUS_ERROR + User error. + +@bt_pre_not_null{self_message_iterator} +@bt_pre_not_null{can_seek_beginning} + +@post + On success, \bt_p{*can_seek_beginning} is set. + +@sa bt_message_iterator_class_set_seek_beginning_methods() — + Sets the "seek beginning" and "can seek beginning?" methods of a + message iterator class. +*/ +typedef bt_message_iterator_class_can_seek_beginning_method_status +(*bt_message_iterator_class_can_seek_beginning_method)( + bt_self_message_iterator *self_message_iterator, + bt_bool *can_seek_beginning); + +/*! +@brief + Status codes for #bt_message_iterator_class_can_seek_ns_from_origin_method. +*/ +typedef enum bt_message_iterator_class_can_seek_ns_from_origin_method_status { + /*! + @brief + Success. + */ + BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Try again. + */ + BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_AGAIN = __BT_FUNC_STATUS_AGAIN, + + /*! + @brief + Out of memory. + */ + BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + User error. + */ + BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, +} bt_message_iterator_class_can_seek_ns_from_origin_method_status; + +/*! +@brief + \bt_c_msg_iter "can seek ns from origin?" method. + +See the \ref api-msg-iter-cls-meth-can-seek-ns "can seek ns from origin?" +method. + +@param[in] self_message_iterator + Message iterator instance. +@param[in] ns_from_origin + Requested time point to seek. +@param[out] can_seek_ns_from_origin + On success, set \bt_p{*can_seek_ns_from_origin} to + #BT_TRUE if \bt_p{self_message_iterator} can currently seek a + message occuring at or after \bt_p{ns_from_origin} nanoseconds from + its \ref api-tir-clock-cls-origin "clock class origin". + +@retval #BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_OK + Success. +@retval #BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_AGAIN + Try again. +@retval #BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_ERROR + User error. + +@bt_pre_not_null{self_message_iterator} +@bt_pre_not_null{can_seek_ns_from_origin} + +@post + On success, \bt_p{*can_seek_ns_from_origin} is set. + +@sa bt_message_iterator_class_set_seek_ns_from_origin_methods() — + Sets the "seek ns from origin" and "can seek ns from origin?" + methods of a message iterator class. +*/ +typedef bt_message_iterator_class_can_seek_ns_from_origin_method_status +(*bt_message_iterator_class_can_seek_ns_from_origin_method)( + bt_self_message_iterator *self_message_iterator, + int64_t ns_from_origin, bt_bool *can_seek_ns_from_origin); + +/*! +@brief + \bt_c_msg_iter finalization method. + +See the \ref api-msg-iter-cls-meth-fini "finalize" method. + +@param[in] self_message_iterator + Message iterator instance. + +@bt_pre_not_null{self_message_iterator} + +@bt_post_no_error + +@sa bt_message_iterator_class_set_finalize_method() — + Sets the finalization method of a message iterator class. +*/ +typedef void +(*bt_message_iterator_class_finalize_method)( + bt_self_message_iterator *self_message_iterator); + +/*! +@brief + Status codes for #bt_message_iterator_class_initialize_method. +*/ typedef enum bt_message_iterator_class_initialize_method_status { + /*! + @brief + Success. + */ BT_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, + + /*! + @brief + Out of memory. + */ BT_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + User error. + */ + BT_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, } bt_message_iterator_class_initialize_method_status; +/*! +@brief + \bt_c_msg_iter initialization method. + +See the \ref api-msg-iter-cls-meth-init "initialize" method. + +@param[in] self_message_iterator + Message iterator instance. +@param[in] configuration + Message iterator's configuration. +@param[in] port + \bt_c_oport for which \bt_p{self_message_iterator} was created. + +@retval #BT_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_STATUS_OK + Success. +@retval #BT_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_STATUS_ERROR + User error. + +@bt_pre_not_null{self_message_iterator} +@bt_pre_not_null{configuration} +@bt_pre_not_null{port} + +@sa bt_message_iterator_class_set_initialize_method() — + Sets the initialization method of a message iterator class. +*/ +typedef bt_message_iterator_class_initialize_method_status +(*bt_message_iterator_class_initialize_method)( + bt_self_message_iterator *self_message_iterator, + bt_self_message_iterator_configuration *configuration, + bt_self_component_port_output *port); + +/*! +@brief + Status codes for #bt_message_iterator_class_next_method. +*/ typedef enum bt_message_iterator_class_next_method_status { + /*! + @brief + Success. + */ BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + End of iteration. + */ + BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_END = __BT_FUNC_STATUS_END, + + /*! + @brief + Try again. + */ BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_AGAIN = __BT_FUNC_STATUS_AGAIN, - BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, + + /*! + @brief + Out of memory. + */ BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, - BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_END = __BT_FUNC_STATUS_END, + + /*! + @brief + User error. + */ + BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, } bt_message_iterator_class_next_method_status; -typedef enum bt_message_iterator_class_seek_ns_from_origin_method_status { - BT_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_AGAIN = __BT_FUNC_STATUS_AGAIN, - BT_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, - BT_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, -} bt_message_iterator_class_seek_ns_from_origin_method_status; +/*! +@brief + \bt_c_msg_iter "next" (get next messages) method. -typedef enum bt_message_iterator_class_can_seek_ns_from_origin_method_status { - BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_AGAIN = __BT_FUNC_STATUS_AGAIN, - BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, - BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, -} bt_message_iterator_class_can_seek_ns_from_origin_method_status; +See the \link api-msg-iter-cls-meth-next "next"\endlink method. +If this method returns #BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_OK, +then all the messages of the message array become +\ref api-fund-freezing "frozen". + +@param[in] self_message_iterator + Message iterator instance. +@param[out] messages + @parblock + Message array to fill, on success, with the \bt_p_msg to emit. + + This array needs its own message + \ref api-fund-shared-object "references". In other + words, if you have a message reference and you put this message + into the array without calling bt_message_get_ref(), then you just + \em moved the message reference to the array (the array owns the + message now). + + The capacity of this array (maximum number of messages you can put + in it) is \bt_p{capacity}. + @endparblock +@param[in] capacity + Capacity of the \bt_p{messages} array (maximum number of messages + you can put in it). +@param[out] count + On success, \bt_p{*count} is the number of messages + you put in \bt_p{messages}. + +@retval #BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_OK + Success. +@retval #BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_END + End of iteration. +@retval #BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_AGAIN + Try again. +@retval #BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_ERROR + User error. + +@bt_pre_not_null{self_message_iterator} +@bt_pre_not_null{messages} +@pre + \bt_p{capacity} ≥ 1. +@bt_pre_not_null{count} + +@post + On success, \bt_p{messages} contains \bt_p{*count} + message references as its first \bt_p{*count} elements. +@post + On success, the \bt_p_msg in \bt_p{messages} honour + the \ref api-msg-seq "message sequence rules". +@post + On success, for any \bt_ev_msg in + \bt_p{messages}, its + \ref api-tir-ev-prop-payload "payload field", + \ref api-tir-ev-prop-spec-ctx "specific context field", + \ref api-tir-ev-prop-common-ctx "common context field", and all + their inner \bt_p_field, recursively, are set. +@post + On success, \bt_p{*count} â‰¥ 1. +@post + On success, + \bt_p{*count} â‰¤ \bt_p{capacity}. + +@sa bt_message_iterator_class_create() — + Creates a message iterator class. +*/ +typedef bt_message_iterator_class_next_method_status +(*bt_message_iterator_class_next_method)( + bt_self_message_iterator *self_message_iterator, + bt_message_array_const messages, uint64_t capacity, + uint64_t *count); + +/*! +@brief + Status codes for #bt_message_iterator_class_seek_beginning_method. +*/ typedef enum bt_message_iterator_class_seek_beginning_method_status { + /*! + @brief + Success. + */ BT_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHOD_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Try again. + */ BT_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHOD_STATUS_AGAIN = __BT_FUNC_STATUS_AGAIN, - BT_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHOD_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, + + /*! + @brief + Out of memory. + */ BT_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHOD_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, -} bt_message_iterator_class_seek_beginning_method_status; -typedef enum bt_message_iterator_class_can_seek_beginning_method_status { - BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_BEGINNING_METHOD_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_BEGINNING_METHOD_STATUS_AGAIN = __BT_FUNC_STATUS_AGAIN, - BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_BEGINNING_METHOD_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, - BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_BEGINNING_METHOD_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, -} bt_message_iterator_class_can_seek_beginning_method_status; + /*! + @brief + User error. + */ + BT_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHOD_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, +} bt_message_iterator_class_seek_beginning_method_status; -typedef bt_message_iterator_class_initialize_method_status -(*bt_message_iterator_class_initialize_method)( - bt_self_message_iterator *message_iterator, - bt_self_message_iterator_configuration *config, - bt_self_component_port_output *port); +/*! +@brief + \bt_c_msg_iter "seek beginning" method. -typedef void -(*bt_message_iterator_class_finalize_method)( - bt_self_message_iterator *message_iterator); +See the \ref api-msg-iter-cls-meth-seek-beg "seek beginning" method. -typedef bt_message_iterator_class_next_method_status -(*bt_message_iterator_class_next_method)( - bt_self_message_iterator *message_iterator, - bt_message_array_const msgs, uint64_t capacity, - uint64_t *count); +@param[in] self_message_iterator + Message iterator instance. -typedef bt_message_iterator_class_seek_ns_from_origin_method_status -(*bt_message_iterator_class_seek_ns_from_origin_method)( - bt_self_message_iterator *message_iterator, - int64_t ns_from_origin); +@retval #BT_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHOD_STATUS_OK + Success. +@retval #BT_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHOD_STATUS_AGAIN + Try again. +@retval #BT_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHOD_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHOD_STATUS_ERROR + User error. -typedef bt_message_iterator_class_can_seek_ns_from_origin_method_status -(*bt_message_iterator_class_can_seek_ns_from_origin_method)( - bt_self_message_iterator *message_iterator, - int64_t ns_from_origin, bt_bool *can_seek); +@bt_pre_not_null{self_message_iterator} +@pre + If \bt_p{self_message_iterator} has a + \ref api-msg-iter-cls-meth-can-seek-beg "can seek beginning?" + method, then it was called and returned #BT_TRUE before + this "seek beginning" method is called, without any other method of + \bt_p{self_message_iterator} called in between. +@sa bt_message_iterator_class_set_seek_beginning_methods() — + Sets the "seek beginning" and "can seek beginning?" methods of a + message iterator class. +*/ typedef bt_message_iterator_class_seek_beginning_method_status (*bt_message_iterator_class_seek_beginning_method)( - bt_self_message_iterator *message_iterator); + bt_self_message_iterator *self_message_iterator); -typedef bt_message_iterator_class_can_seek_beginning_method_status -(*bt_message_iterator_class_can_seek_beginning_method)( - bt_self_message_iterator *message_iterator, bt_bool *can_seek); +/*! +@brief + Status codes for #bt_message_iterator_class_seek_ns_from_origin_method. +*/ +typedef enum bt_message_iterator_class_seek_ns_from_origin_method_status { + /*! + @brief + Success. + */ + BT_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_OK = __BT_FUNC_STATUS_OK, -extern void bt_message_iterator_class_get_ref( - const bt_message_iterator_class *message_iterator_class); + /*! + @brief + Try again. + */ + BT_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_AGAIN = __BT_FUNC_STATUS_AGAIN, -extern void bt_message_iterator_class_put_ref( - const bt_message_iterator_class *message_iterator_class); + /*! + @brief + Out of memory. + */ + BT_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, -#define BT_MESSAGE_ITERATOR_CLASS_PUT_REF_AND_RESET(_var) \ - do { \ - bt_message_iterator_class_put_ref(_var); \ - (_var) = NULL; \ - } while (0) + /*! + @brief + User error. + */ + BT_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, +} bt_message_iterator_class_seek_ns_from_origin_method_status; -#define BT_MESSAGE_ITERATOR_CLASS_MOVE_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_message_iterator_class_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) +/*! +@brief + \bt_c_msg_iter "seek ns from origin" method. + +See the \ref api-msg-iter-cls-meth-seek-ns "seek ns from origin" method. + +@param[in] self_message_iterator + Message iterator instance. +@param[in] ns_from_origin + Time point to seek. + +@retval #BT_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_OK + Success. +@retval #BT_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_AGAIN + Try again. +@retval #BT_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_ERROR + User error. + +@bt_pre_not_null{self_message_iterator} +@pre + If \bt_p{self_message_iterator} has a + \ref api-msg-iter-cls-meth-can-seek-ns "can seek ns from origin?" + method, then it was called and returned #BT_TRUE before + this "seek ns from origin" method is called, without any other + method of \bt_p{self_message_iterator} called in between. + +@sa bt_message_iterator_class_set_seek_ns_from_origin_methods() — + Sets the "seek ns from origin" and "can seek ns from origin?" + methods of a message iterator class. +*/ +typedef bt_message_iterator_class_seek_ns_from_origin_method_status +(*bt_message_iterator_class_seek_ns_from_origin_method)( + bt_self_message_iterator *self_message_iterator, + int64_t ns_from_origin); + +/*! @} */ + +/*! +@name Creation +@{ +*/ +/*! +@brief + Creates a message iterator class having the + \link api-msg-iter-cls-meth-next "next" method\endlink method + \bt_p{next_method}. + +@param[in] next_method + "Next" method of the message iterator class to create. + +@returns + New message iterator class reference, or \c NULL on memory error. + +@bt_pre_not_null{next_method} +*/ extern bt_message_iterator_class * bt_message_iterator_class_create( bt_message_iterator_class_next_method next_method); -extern bt_message_iterator_class_set_method_status -bt_message_iterator_class_set_initialize_method( - bt_message_iterator_class *message_iterator_class, - bt_message_iterator_class_initialize_method method); +/*! @} */ + +/*! +@name Method setting +@{ +*/ + +/*! +@brief + Status code for the + bt_message_iterator_class_set_*_method() functions. +*/ +typedef enum bt_message_iterator_class_set_method_status { + /*! + @brief + Success. + */ + BT_MESSAGE_ITERATOR_CLASS_SET_METHOD_STATUS_OK = __BT_FUNC_STATUS_OK, +} bt_message_iterator_class_set_method_status; + +/*! +@brief + Sets the optional finalization method of the message iterator class + \bt_p{message_iterator_class} to \bt_p{method}. + +See the \ref api-msg-iter-cls-meth-fini "finalize" method. +@param[in] message_iterator_class + Message iterator class of which to set the finalization method to + \bt_p{method}. +@param[in] method + New finalization method of \bt_p{message_iterator_class}. + +@retval #BT_MESSAGE_ITERATOR_CLASS_SET_METHOD_STATUS_OK + Success. + +@bt_pre_not_null{message_iterator_class} +@bt_pre_hot{message_iterator_class} +@bt_pre_not_null{method} +*/ extern bt_message_iterator_class_set_method_status bt_message_iterator_class_set_finalize_method( bt_message_iterator_class *message_iterator_class, bt_message_iterator_class_finalize_method method); +/*! +@brief + Sets the optional initialization method of the message iterator + class \bt_p{message_iterator_class} to \bt_p{method}. + +See the \ref api-msg-iter-cls-meth-init "initialize" method. + +@param[in] message_iterator_class + Message iterator class of which to set the initialization method to + \bt_p{method}. +@param[in] method + New initialization method of \bt_p{message_iterator_class}. + +@retval #BT_MESSAGE_ITERATOR_CLASS_SET_METHOD_STATUS_OK + Success. + +@bt_pre_not_null{message_iterator_class} +@bt_pre_hot{message_iterator_class} +@bt_pre_not_null{method} +*/ extern bt_message_iterator_class_set_method_status -bt_message_iterator_class_set_seek_ns_from_origin_methods( +bt_message_iterator_class_set_initialize_method( bt_message_iterator_class *message_iterator_class, - bt_message_iterator_class_seek_ns_from_origin_method seek_method, - bt_message_iterator_class_can_seek_ns_from_origin_method can_seek_method); + bt_message_iterator_class_initialize_method method); + +/*! +@brief + Sets the optional "seek beginning" and + "can seek beginning?" methods of the message iterator class + \bt_p{message_iterator_class} to \bt_p{seek_method} and + \bt_p{can_seek_method}. + +See the \ref api-msg-iter-cls-meth-seek-beg "seek beginning" +and \ref api-msg-iter-cls-meth-can-seek-beg "can seek beginning?" +methods. + +@param[in] message_iterator_class + Message iterator class of which to set the "seek beginning" + and "can seek beginning?" methods. +@param[in] seek_method + New "seek beginning" method of \bt_p{message_iterator_class}. +@param[in] can_seek_method + @parblock + New "can seek beginning?" method of \bt_p{message_iterator_class}. + + Can be \c NULL, in which case it is equivalent to setting a method + which always returns #BT_TRUE. + @endparblock +@retval #BT_MESSAGE_ITERATOR_CLASS_SET_METHOD_STATUS_OK + Success. + +@bt_pre_not_null{message_iterator_class} +@bt_pre_hot{message_iterator_class} +@bt_pre_not_null{seek_method} +*/ extern bt_message_iterator_class_set_method_status bt_message_iterator_class_set_seek_beginning_methods( bt_message_iterator_class *message_iterator_class, bt_message_iterator_class_seek_beginning_method seek_method, bt_message_iterator_class_can_seek_beginning_method can_seek_method); +/*! +@brief + Sets the optional "seek ns from origin" and + "can seek ns from origin?" methods of the message iterator class + \bt_p{message_iterator_class} to \bt_p{seek_method} and + \bt_p{can_seek_method}. + +See the \ref api-msg-iter-cls-meth-seek-ns "seek ns from origin" +and +\ref api-msg-iter-cls-meth-can-seek-ns "can seek ns from origin?" +methods. + +@param[in] message_iterator_class + Message iterator class of which to set the "seek ns from origin" + and "can seek ns from origin?" methods. +@param[in] seek_method + New "seek ns from origin" method of \bt_p{message_iterator_class}. +@param[in] can_seek_method + @parblock + New "can seek ns from origin?" method of + \bt_p{message_iterator_class}. + + Can be \c NULL, in which case it is equivalent to setting a method + which always returns #BT_TRUE. + @endparblock + +@retval #BT_MESSAGE_ITERATOR_CLASS_SET_METHOD_STATUS_OK + Success. + +@bt_pre_not_null{message_iterator_class} +@bt_pre_hot{message_iterator_class} +@bt_pre_not_null{seek_method} +*/ +extern bt_message_iterator_class_set_method_status +bt_message_iterator_class_set_seek_ns_from_origin_methods( + bt_message_iterator_class *message_iterator_class, + bt_message_iterator_class_seek_ns_from_origin_method seek_method, + bt_message_iterator_class_can_seek_ns_from_origin_method can_seek_method); + +/*! @} */ + +/*! +@name Reference count +@{ +*/ + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the message iterator class \bt_p{message_iterator_class}. + +@param[in] message_iterator_class + @parblock + Message iterator class of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_component_put_ref() — + Decrements the reference count of a message iterator class. +*/ +extern void bt_message_iterator_class_get_ref( + const bt_message_iterator_class *message_iterator_class); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the message iterator class \bt_p{message_iterator_class}. + +@param[in] message_iterator_class + @parblock + Message iterator class of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_component_get_ref() — + Increments the reference count of a message iterator class. +*/ +extern void bt_message_iterator_class_put_ref( + const bt_message_iterator_class *message_iterator_class); + +/*! +@brief + Decrements the reference count of the message iterator class + \bt_p{_message_iterator_class}, and then sets + \bt_p{_message_iterator_class} to \c NULL. + +@param _message_iterator_class + @parblock + Message iterator class of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_message_iterator_class} +*/ +#define BT_MESSAGE_ITERATOR_CLASS_PUT_REF_AND_RESET(_message_iterator_class) \ + do { \ + bt_message_iterator_class_put_ref(_message_iterator_class); \ + (_message_iterator_class) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the message iterator class \bt_p{_dst}, + sets \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} + to \c NULL. + +This macro effectively moves a message iterator class reference from the +expression \bt_p{_src} to the expression \bt_p{_dst}, putting the +existing \bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_MESSAGE_ITERATOR_CLASS_MOVE_MOVE_REF(_dst, _src) \ + do { \ + bt_message_iterator_class_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! @} */ + #ifdef __cplusplus } #endif diff --git a/include/babeltrace2/graph/message-iterator.h b/include/babeltrace2/graph/message-iterator.h index 228b40d1..cda5040a 100644 --- a/include/babeltrace2/graph/message-iterator.h +++ b/include/babeltrace2/graph/message-iterator.h @@ -31,125 +31,865 @@ extern "C" { #endif +/*! +@defgroup api-msg-iter Message iterator +@ingroup api-comp-cls-dev + +@brief + Iterator of a \bt_msg sequence. + +A message iterator iterates a sequence of +\bt_p_msg. + +A message iterator is the \bt_name mechanism for the \bt_p_comp of a +trace processing \bt_graph to exchange information. This information +takes the form of a sequence of individual messages which contain +trace data (\bt_p_ev, for example). + +A message iterator is a \bt_msg_iter_cls instance. Because a message +iterator class is part of a \bt_src_comp_cls or \bt_flt_comp_cls, a +message iterator is part of a \bt_src_comp or \bt_flt_comp. Borrow +a message iterator's component with +bt_message_iterator_borrow_component(). + +A message iterator is a \ref api-fund-shared-object "shared object": get +a new reference with bt_component_get_ref() and put an existing +reference with bt_component_put_ref(). + +The type of a message iterator is #bt_message_iterator. + +There are two contexts from which you can create a message iterator: + +
    +
    From another message iterator
    +
    + This is the case for a \bt_flt_comp's message iterator. + + Use bt_message_iterator_create_from_message_iterator(). + + You can call this function from any message iterator + \ref api-msg-iter-cls-methods "method" except the + \ref api-msg-iter-cls-meth-fini "finalization method". +
    + +
    From a \bt_sink_comp
    +
    + Use bt_message_iterator_create_from_sink_component(). + + You can call this function from a sink component + \ref api-comp-cls-dev-methods "method" once the trace processing + graph which contains the component is + \ref api-graph-lc "configured", that is: + + - \ref api-comp-cls-dev-meth-graph-configured "Graph is configured" + method (typical). + + - \ref api-comp-cls-dev-meth-consume "Consume" method. +
    +
    + +When you call one of the creation functions above, you pass an \bt_iport +on which to create the message iterator. + +You can create more than one message iterator on a given +\ref api-port-prop-is-connected "connected" input port. The +\bt_p_conn between \bt_p_port in a trace processing \bt_graph establish +which \bt_p_comp and message iterators can create message iterators of +other \bt_p_comp. Then: + +- Any \bt_sink_comp is free to create one or more message iterators + on any of its connected input ports. + +- Any message iterator is free to create one or more message iterators + on any of its component's connected input ports. + +The following illustration shows a very simple use case where the +\ref api-comp-cls-dev-meth-consume "consuming method" of a sink +component uses a single \bt_flt_comp's message iterator which itself +uses a single \bt_src_comp's message iterator: + +@image html msg-iter.png + +Many message iterator relations are possible, for example: + +@image html msg-iter-complex.png + +

    \anchor api-msg-iter-ops Operations

    + +Once you have created a message iterator, there are three possible +operations: + +
    +
    + \anchor api-msg-iter-op-next + Get the message iterator's next messages +
    +
    + This operation returns a batch of the message iterator's next + \bt_p_msg considering its current state. + + This operation returns a batch of messages instead of a single + message for performance reasons. + + This operation is said to \em advance the message iterator. + + Get the next messages of a message iterator with + bt_message_iterator_next(). +
    + +
    + \anchor api-msg-iter-op-seek-beg + Make the message iterator seek its beginning +
    +
    + This operation resets the message iterator's position to the + beginning of its \ref api-msg-seq "message sequence". + + If the operation is successful, then the next call to + bt_message_iterator_next() returns the first \bt_p_msg of the + message iterator's sequence. + + If bt_message_iterator_seek_ns_from_origin() returns something + else than #BT_MESSAGE_ITERATOR_SEEK_BEGINNING_STATUS_OK, you + \em cannot call bt_message_iterator_next() afterwards. In that case, + you can only call bt_message_iterator_seek_beginning() again or + bt_message_iterator_seek_ns_from_origin(). + + Before you call bt_message_iterator_seek_beginning() to make + the message iterator seek its beginning, check if it can currently + do it with bt_message_iterator_can_seek_beginning(). +
    + +
    + \anchor api-msg-iter-op-seek-ns + Make the message iterator seek a message occuring at or after a + given time (in nanoseconds) from its clock class origin +
    +
    + This operation changes the position of the message iterator within + its \ref api-msg-seq "sequence" so that the next call to + bt_message_iterator_next() returns \bt_p_msg which occur at or after + a given time (in nanoseconds) from its + \ref api-tir-clock-cls-origin "clock class origin". + + When you call bt_message_iterator_seek_ns_from_origin() to perform + the operation, your pass the specific time to seek as the + \bt_p{ns_from_origin} parameter. You don't pass any + \bt_clock_cls: the function operates at the nanosecond from some + origin level and it is left to the message iterator's implementation + to seek a message having at least this time. + + If the requested time point is \em after the message iterator's + sequence's last message, then the next call to + bt_message_iterator_next() returns + #BT_MESSAGE_ITERATOR_NEXT_STATUS_END. + + If bt_message_iterator_seek_ns_from_origin() returns something + else than #BT_MESSAGE_ITERATOR_SEEK_NS_FROM_ORIGIN_STATUS_OK, you + \em cannot call bt_message_iterator_next() afterwards. In that case, + you can only call bt_message_iterator_seek_ns_from_origin() again + or bt_message_iterator_seek_beginning(). + + Before you call bt_message_iterator_seek_ns_from_origin() to make + the message iterator seek a specific point in time, check if it can + currently do it with bt_message_iterator_can_seek_ns_from_origin(). +
    +
    +*/ + +/*! @{ */ + +/*! +@name Type +@{ + +@typedef struct bt_message_iterator bt_message_iterator; + +@brief + Message iterator. + +@} +*/ + +/*! +@name Creation +@{ +*/ + +/*! +@brief + Status code for bt_message_iterator_create_from_message_iterator(). +*/ +typedef enum bt_message_iterator_create_from_message_iterator_status { + /*! + @brief + Success. + */ + BT_MESSAGE_ITERATOR_CREATE_FROM_MESSAGE_ITERATOR_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_MESSAGE_ITERATOR_CREATE_FROM_MESSAGE_ITERATOR_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + Other error. + */ + BT_MESSAGE_ITERATOR_CREATE_FROM_MESSAGE_ITERATOR_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, +} bt_message_iterator_create_from_message_iterator_status; + +/*! +@brief + Creates a message iterator on the \bt_iport \bt_p{port} from + another message iterator \bt_p{self_message_iterator}, and sets + \bt_p{*message_iterator} to the resulting message iterator. + +On success, the message iterator's position is at the beginning +of its \ref api-msg-seq "message sequence". + +@param[in] self_message_iterator + Other message iterator from which to create the message iterator. +@param[in] port + Input port on which to create the message iterator. +@param[out] message_iterator + On success, \bt_p{*message_iterator} is a new + message iterator reference. + +@retval #BT_MESSAGE_ITERATOR_CREATE_FROM_MESSAGE_ITERATOR_STATUS_OK + Success. +@retval #BT_MESSAGE_ITERATOR_CREATE_FROM_MESSAGE_ITERATOR_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_MESSAGE_ITERATOR_CREATE_FROM_MESSAGE_ITERATOR_STATUS_ERROR + Other error, for example, the created message iterator's + \ref api-msg-iter-cls-meth-init "initialization method" failed. + +@bt_pre_not_null{self_message_iterator} +@bt_pre_not_null{port} +@pre + bt_port_is_connected(port) returns #BT_TRUE. +@bt_pre_not_null{message_iterator} + +@sa bt_message_iterator_create_from_sink_component() — + Creates a message iterator from a \bt_sink_comp. +*/ +extern bt_message_iterator_create_from_message_iterator_status +bt_message_iterator_create_from_message_iterator( + bt_self_message_iterator *self_message_iterator, + bt_self_component_port_input *port, + bt_message_iterator **message_iterator); + +/*! +@brief + Status code for bt_message_iterator_create_from_sink_component(). +*/ +typedef enum bt_message_iterator_create_from_sink_component_status { + /*! + @brief + Success. + */ + BT_MESSAGE_ITERATOR_CREATE_FROM_SINK_COMPONENT_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_MESSAGE_ITERATOR_CREATE_FROM_SINK_COMPONENT_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + Other error. + */ + BT_MESSAGE_ITERATOR_CREATE_FROM_SINK_COMPONENT_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, +} bt_message_iterator_create_from_sink_component_status; + +/*! +@brief + Creates a message iterator on the \bt_iport \bt_p{port} from the + \bt_sink_comp \bt_p{self_component_sink}, and sets + \bt_p{*message_iterator} to the resulting message iterator. + +On success, the message iterator's position is at the beginning +of its \ref api-msg-seq "message sequence". + +@param[in] self_component_sink + Sink component from which to create the message iterator. +@param[in] port + Input port on which to create the message iterator. +@param[out] message_iterator + On success, \bt_p{*message_iterator} is a new + message iterator reference. + +@retval #BT_MESSAGE_ITERATOR_CREATE_FROM_MESSAGE_ITERATOR_STATUS_OK + Success. +@retval #BT_MESSAGE_ITERATOR_CREATE_FROM_MESSAGE_ITERATOR_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_MESSAGE_ITERATOR_CREATE_FROM_MESSAGE_ITERATOR_STATUS_ERROR + Other error, for example, the created message iterator's + \ref api-msg-iter-cls-meth-init "initialization method" failed. + +@bt_pre_not_null{self_component_sink} +@bt_pre_not_null{port} +@pre + bt_port_is_connected(port) returns #BT_TRUE. +@bt_pre_not_null{message_iterator} + +@sa bt_message_iterator_create_from_message_iterator() — + Creates a message iterator from another message iterator. +*/ +extern bt_message_iterator_create_from_sink_component_status +bt_message_iterator_create_from_sink_component( + bt_self_component_sink *self_component_sink, + bt_self_component_port_input *port, + bt_message_iterator **message_iterator); + +/*! @} */ + +/*! +@name Component access +@{ +*/ + +/*! +@brief + Borrows the \bt_comp which provides the \bt_msg_iter + \bt_p{message_iterator}. + +@param[in] message_iterator + Message iterator from which to borrow the component which provides + it. + +@returns + Component which provides \bt_p{message_iterator}. + +@bt_pre_not_null{message_iterator} +*/ +extern bt_component * +bt_message_iterator_borrow_component( + bt_message_iterator *message_iterator); + +/*! @} */ + +/*! +@name "Next" operation (get next messages) +@{ +*/ + +/*! +@brief + Status code for bt_message_iterator_next(). +*/ typedef enum bt_message_iterator_next_status { + /*! + @brief + Success. + */ BT_MESSAGE_ITERATOR_NEXT_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + End of iteration. + */ BT_MESSAGE_ITERATOR_NEXT_STATUS_END = __BT_FUNC_STATUS_END, + + /*! + @brief + Try again. + */ BT_MESSAGE_ITERATOR_NEXT_STATUS_AGAIN = __BT_FUNC_STATUS_AGAIN, - BT_MESSAGE_ITERATOR_NEXT_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, + + /*! + @brief + Out of memory. + */ BT_MESSAGE_ITERATOR_NEXT_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + Other error. + */ + BT_MESSAGE_ITERATOR_NEXT_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, } bt_message_iterator_next_status; -typedef enum bt_message_iterator_seek_beginning_status { - BT_MESSAGE_ITERATOR_SEEK_BEGINNING_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_MESSAGE_ITERATOR_SEEK_BEGINNING_STATUS_AGAIN = __BT_FUNC_STATUS_AGAIN, - BT_MESSAGE_ITERATOR_SEEK_BEGINNING_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, - BT_MESSAGE_ITERATOR_SEEK_BEGINNING_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, -} bt_message_iterator_seek_beginning_status; +/*! +@brief + Returns the next \bt_p_msg of the message iterator + \bt_p{message_iterator} into the \bt_p{*messages} array of size + \bt_p{*count}, effectively advancing \bt_p{message_iterator}. -typedef enum bt_message_iterator_seek_ns_from_origin_status { - BT_MESSAGE_ITERATOR_SEEK_NS_FROM_ORIGIN_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_MESSAGE_ITERATOR_SEEK_NS_FROM_ORIGIN_STATUS_AGAIN = __BT_FUNC_STATUS_AGAIN, - BT_MESSAGE_ITERATOR_SEEK_NS_FROM_ORIGIN_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, - BT_MESSAGE_ITERATOR_SEEK_NS_FROM_ORIGIN_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, -} bt_message_iterator_seek_ns_from_origin_status; +See \ref api-msg-iter-op-next "this operation's documentation". + +On success, the message iterator's position is advanced by \bt_p{*count} +messages. + +@param[in] message_iterator + Message iterator from which to get the next messages. +@param[out] messages + @parblock + On success, \bt_p{*messages} is an array containing + the next messages of \bt_p{message_iterator} as its first elements. + + \bt_p{*count} is the number of messages in \bt_p{*messages}. + The library allocates and manages this array, but until you + perform another \ref api-msg-iter-ops "operation" on + \bt_p{message_iterator}, you are free to modify it. For example, + you can set its elements to \c NULL if your use case needs it. + + You own the references of the messages this array contains. In + other words, you must put them with bt_message_put_ref() or move + them to another message array (from a + \link api-msg-iter-cls-meth-next "next" method\endlink) + before you perform another operation on \bt_p{message_iterator} or + before \bt_p{message_iterator} is destroyed. + @endparblock +@param[out] count + On success, \bt_p{*count} is the number of messages + in \bt_p{*messages}. + +@retval #BT_MESSAGE_ITERATOR_NEXT_STATUS_OK + Success. +@retval #BT_MESSAGE_ITERATOR_NEXT_STATUS_END + End of iteration. +@retval #BT_MESSAGE_ITERATOR_NEXT_STATUS_AGAIN + Try again. +@retval #BT_MESSAGE_ITERATOR_NEXT_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_MESSAGE_ITERATOR_NEXT_STATUS_ERROR + Other error. + +@bt_pre_not_null{message_iterator} +@bt_pre_not_null{messages} +@bt_pre_not_null{count} + +@post + On success, \bt_p{*count} â‰¥ 1. +*/ +extern bt_message_iterator_next_status +bt_message_iterator_next(bt_message_iterator *message_iterator, + bt_message_array_const *messages, uint64_t *count); + +/*! @} */ + +/*! +@name Seeking +@{ +*/ + +/*! +@brief + Status code for bt_message_iterator_can_seek_beginning(). +*/ typedef enum bt_message_iterator_can_seek_beginning_status { + /*! + @brief + Success. + */ BT_MESSAGE_ITERATOR_CAN_SEEK_BEGINNING_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Try again. + */ BT_MESSAGE_ITERATOR_CAN_SEEK_BEGINNING_STATUS_AGAIN = __BT_FUNC_STATUS_AGAIN, - BT_MESSAGE_ITERATOR_CAN_SEEK_BEGINNING_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, + + /*! + @brief + Out of memory. + */ BT_MESSAGE_ITERATOR_CAN_SEEK_BEGINNING_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + Other error. + */ + BT_MESSAGE_ITERATOR_CAN_SEEK_BEGINNING_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, } bt_message_iterator_can_seek_beginning_status; +/*! +@brief + Returns whether or not the message iterator \bt_p{message_iterator} + can currently seek its beginning (first \bt_msg). + +See the \link api-msg-iter-op-seek-beg "seek beginning" +operation\endlink. + +Make sure to call this function, without performing any other +\ref api-msg-iter-ops "operation" on \bt_p{message_iterator}, before you +call bt_message_iterator_seek_beginning(). + +@param[in] message_iterator + Message iterator from which to to get whether or not it can seek + its beginning. +@param[out] can_seek_beginning + On success, \bt_p{*can_seek_beginning} is #BT_TRUE + if \bt_p{message_iterator} can seek its beginning. + +@retval #BT_MESSAGE_ITERATOR_CAN_SEEK_BEGINNING_STATUS_OK + Success. +@retval #BT_MESSAGE_ITERATOR_CAN_SEEK_BEGINNING_STATUS_AGAIN + Try again. +@retval #BT_MESSAGE_ITERATOR_CAN_SEEK_BEGINNING_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_MESSAGE_ITERATOR_CAN_SEEK_BEGINNING_STATUS_ERROR + Other error. + +@bt_pre_not_null{message_iterator} +@bt_pre_not_null{can_seek_beginning} + +@sa bt_message_iterator_seek_beginning() — + Makes a message iterator seek its beginning. +*/ +extern bt_message_iterator_can_seek_beginning_status +bt_message_iterator_can_seek_beginning( + bt_message_iterator *message_iterator, + bt_bool *can_seek_beginning); + +/*! +@brief + Status code for bt_message_iterator_seek_beginning(). +*/ +typedef enum bt_message_iterator_seek_beginning_status { + /*! + @brief + Success. + */ + BT_MESSAGE_ITERATOR_SEEK_BEGINNING_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Try again. + */ + BT_MESSAGE_ITERATOR_SEEK_BEGINNING_STATUS_AGAIN = __BT_FUNC_STATUS_AGAIN, + + /*! + @brief + Out of memory. + */ + BT_MESSAGE_ITERATOR_SEEK_BEGINNING_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + Other error. + */ + BT_MESSAGE_ITERATOR_SEEK_BEGINNING_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, +} bt_message_iterator_seek_beginning_status; + +/*! +@brief + Makes the message iterator \bt_p{message_iterator} seek its + beginning (first \bt_msg). + +See \ref api-msg-iter-op-seek-beg "this operation's documentation". + +Make sure to call bt_message_iterator_can_seek_beginning(), +without performing any other \ref api-msg-iter-ops "operation" on +\bt_p{message_iterator}, before you call this function. + +@param[in] message_iterator + Message iterator to seek to its beginning. + +@retval #BT_MESSAGE_ITERATOR_SEEK_BEGINNING_STATUS_OK + Success. +@retval #BT_MESSAGE_ITERATOR_SEEK_BEGINNING_STATUS_AGAIN + Try again. +@retval #BT_MESSAGE_ITERATOR_SEEK_BEGINNING_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_MESSAGE_ITERATOR_SEEK_BEGINNING_STATUS_ERROR + Other error. + +@bt_pre_not_null{message_iterator} +@pre + bt_message_iterator_can_seek_beginning(message_iterator) + returns #BT_TRUE. + +@sa bt_message_iterator_can_seek_beginning() — + Returns whether or not a message iterator can currently seek its + beginning. +*/ +extern bt_message_iterator_seek_beginning_status +bt_message_iterator_seek_beginning( + bt_message_iterator *message_iterator); + +/*! +@brief + Status code for bt_message_iterator_can_seek_ns_from_origin(). +*/ typedef enum bt_message_iterator_can_seek_ns_from_origin_status { + /*! + @brief + Success. + */ BT_MESSAGE_ITERATOR_CAN_SEEK_NS_FROM_ORIGIN_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Try again. + */ BT_MESSAGE_ITERATOR_CAN_SEEK_NS_FROM_ORIGIN_STATUS_AGAIN = __BT_FUNC_STATUS_AGAIN, - BT_MESSAGE_ITERATOR_CAN_SEEK_NS_FROM_ORIGIN_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, + + /*! + @brief + Out of memory. + */ BT_MESSAGE_ITERATOR_CAN_SEEK_NS_FROM_ORIGIN_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + Other error. + */ + BT_MESSAGE_ITERATOR_CAN_SEEK_NS_FROM_ORIGIN_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, } bt_message_iterator_can_seek_ns_from_origin_status; -typedef enum bt_message_iterator_create_from_message_iterator_status { - BT_MESSAGE_ITERATOR_CREATE_FROM_MESSAGE_ITERATOR_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_MESSAGE_ITERATOR_CREATE_FROM_MESSAGE_ITERATOR_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, - BT_MESSAGE_ITERATOR_CREATE_FROM_MESSAGE_ITERATOR_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, -} bt_message_iterator_create_from_message_iterator_status; +/*! +@brief + Returns whether or not the message iterator \bt_p{message_iterator} + can currently seek a \bt_msg occuring at or after + \bt_p{ns_from_origin} nanoseconds from its + \ref api-tir-clock-cls-origin "clock class origin". -typedef enum bt_message_iterator_create_from_sink_component_status { - BT_MESSAGE_ITERATOR_CREATE_FROM_SINK_COMPONENT_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_MESSAGE_ITERATOR_CREATE_FROM_SINK_COMPONENT_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, - BT_MESSAGE_ITERATOR_CREATE_FROM_SINK_COMPONENT_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, -} bt_message_iterator_create_from_sink_component_status; +See the \link api-msg-iter-op-seek-ns "seek ns from origin" +operation\endlink. -static inline -bt_message_iterator * -bt_message_iterator_as_message_iterator( - bt_message_iterator *iterator) -{ - return __BT_UPCAST(bt_message_iterator, iterator); -} +Make sure to call this function, without performing any other +\ref api-msg-iter-ops "operation" on \bt_p{message_iterator}, before you +call bt_message_iterator_seek_ns_from_origin(). -extern bt_message_iterator_create_from_message_iterator_status -bt_message_iterator_create_from_message_iterator( - bt_self_message_iterator *self_msg_iter, - bt_self_component_port_input *input_port, - bt_message_iterator **message_iterator); +@param[in] message_iterator + Message iterator from which to to get whether or not it can seek + its beginning. +@param[in] ns_from_origin + Requested time point to seek. +@param[out] can_seek_ns_from_origin + On success, \bt_p{*can_seek_ns_from_origin} is + #BT_TRUE if \bt_p{message_iterator} can seek a message occuring at + or after \bt_p{ns_from_origin} nanoseconds from its clock class + origin. -extern bt_message_iterator_create_from_sink_component_status -bt_message_iterator_create_from_sink_component( - bt_self_component_sink *self_comp, - bt_self_component_port_input *input_port, - bt_message_iterator **message_iterator); +@retval #BT_MESSAGE_ITERATOR_CAN_SEEK_NS_FROM_ORIGIN_STATUS_OK + Success. +@retval #BT_MESSAGE_ITERATOR_CAN_SEEK_NS_FROM_ORIGIN_STATUS_AGAIN + Try again. +@retval #BT_MESSAGE_ITERATOR_CAN_SEEK_NS_FROM_ORIGIN_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_MESSAGE_ITERATOR_CAN_SEEK_NS_FROM_ORIGIN_STATUS_ERROR + Other error. -extern bt_component * -bt_message_iterator_borrow_component( - bt_message_iterator *iterator); +@bt_pre_not_null{message_iterator} +@bt_pre_not_null{can_seek_ns_from_origin} -extern bt_message_iterator_next_status -bt_message_iterator_next( - bt_message_iterator *iterator, - bt_message_array_const *msgs, uint64_t *count); +@sa bt_message_iterator_seek_ns_from_origin() — + Makes a message iterator seek a message occuring at or after + a given time from its clock class origin. +*/ extern bt_message_iterator_can_seek_ns_from_origin_status bt_message_iterator_can_seek_ns_from_origin( - bt_message_iterator *iterator, - int64_t ns_from_origin, bt_bool *can_seek); + bt_message_iterator *message_iterator, + int64_t ns_from_origin, bt_bool *can_seek_ns_from_origin); -extern bt_message_iterator_can_seek_beginning_status -bt_message_iterator_can_seek_beginning( - bt_message_iterator *iterator, - bt_bool *can_seek); +/*! +@brief + Status code for bt_message_iterator_seek_ns_from_origin(). +*/ +typedef enum bt_message_iterator_seek_ns_from_origin_status { + /*! + @brief + Success. + */ + BT_MESSAGE_ITERATOR_SEEK_NS_FROM_ORIGIN_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Try again. + */ + BT_MESSAGE_ITERATOR_SEEK_NS_FROM_ORIGIN_STATUS_AGAIN = __BT_FUNC_STATUS_AGAIN, + + /*! + @brief + Out of memory. + */ + BT_MESSAGE_ITERATOR_SEEK_NS_FROM_ORIGIN_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + Other error. + */ + BT_MESSAGE_ITERATOR_SEEK_NS_FROM_ORIGIN_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, +} bt_message_iterator_seek_ns_from_origin_status; + +/*! +@brief + Makes the message iterator \bt_p{message_iterator} seek a \bt_msg + occuring at or after \bt_p{ns_from_origin} nanoseconds from its + \ref api-tir-clock-cls-origin "clock class origin". + +See \ref api-msg-iter-op-seek-ns "this operation's documentation". + +Make sure to call bt_message_iterator_can_seek_ns_from_origin(), +without performing any other \ref api-msg-iter-ops "operation" on +\bt_p{message_iterator}, before you call this function. + +@param[in] message_iterator + Message iterator to seek to a message occuring at or after + \bt_p{ns_from_origin} nanoseconds from its clock class origin. +@param[in] ns_from_origin + Time point to seek. + +@retval #BT_MESSAGE_ITERATOR_SEEK_NS_FROM_ORIGIN_STATUS_OK + Success. +@retval #BT_MESSAGE_ITERATOR_SEEK_NS_FROM_ORIGIN_STATUS_AGAIN + Try again. +@retval #BT_MESSAGE_ITERATOR_SEEK_NS_FROM_ORIGIN_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_MESSAGE_ITERATOR_SEEK_NS_FROM_ORIGIN_STATUS_ERROR + Other error. +@bt_pre_not_null{message_iterator} +@pre + bt_message_iterator_can_seek_ns_from_origin(message_iterator, ns_from_origin) + returns #BT_TRUE. + +@sa bt_message_iterator_can_seek_ns_from_origin() — + Returns whether or not a message iterator can currently seek a + message occuring at or after a given time from its clock class + origin. +*/ extern bt_message_iterator_seek_ns_from_origin_status bt_message_iterator_seek_ns_from_origin( - bt_message_iterator *iterator, + bt_message_iterator *message_iterator, int64_t ns_from_origin); -extern bt_message_iterator_seek_beginning_status -bt_message_iterator_seek_beginning( - bt_message_iterator *iterator); +/*! @} */ + +/*! +@name Configuration +@{ +*/ + +/*! +@brief + Returns whether or not the message iterator \bt_p{message_iterator} + can seek forward. + +A message iterator can seek forward if all the \bt_p_msg of its +message sequence have some \bt_cs. + +@param[in] message_iterator + Message iterator of which to get whether or not it can seek forward. +@returns + #BT_TRUE if \bt_p{message_iterator} can seek forward. + +@sa bt_self_message_iterator_configuration_set_can_seek_forward() — + Sets whether or not a message iterator can seek forward. +*/ extern bt_bool bt_message_iterator_can_seek_forward( - bt_message_iterator *iterator); + bt_message_iterator *message_iterator); + +/*! @} */ + +/*! +@name Reference count +@{ +*/ + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the message iterator \bt_p{message_iterator}. +@param[in] message_iterator + @parblock + Message iterator of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_message_iterator_put_ref() — + Decrements the reference count of a message iterator. +*/ extern void bt_message_iterator_get_ref( const bt_message_iterator *message_iterator); +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the message iterator \bt_p{message_iterator}. + +@param[in] message_iterator + @parblock + Message iterator of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_message_iterator_get_ref() — + Increments the reference count of a message iterator. +*/ extern void bt_message_iterator_put_ref( const bt_message_iterator *message_iterator); -#define BT_MESSAGE_ITERATOR_PUT_REF_AND_RESET(_var) \ +/*! +@brief + Decrements the reference count of the message iterator + \bt_p{_message_iterator}, and then sets \bt_p{_message_iterator} + to \c NULL. + +@param _message_iterator + @parblock + Message iterator of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_message_iterator} +*/ +#define BT_MESSAGE_ITERATOR_PUT_REF_AND_RESET(_message_iterator) \ do { \ - bt_message_iterator_put_ref(_var); \ - (_var) = NULL; \ + bt_message_iterator_put_ref(_message_iterator); \ + (_message_iterator) = NULL; \ } while (0) -#define BT_MESSAGE_ITERATOR_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_message_iterator_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ +/*! +@brief + Decrements the reference count of the message iterator \bt_p{_dst}, + sets \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} to + \c NULL. + +This macro effectively moves a message iterator reference from the +expression \bt_p{_src} to the expression \bt_p{_dst}, putting the +existing \bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_MESSAGE_ITERATOR_MOVE_REF(_dst, _src) \ + do { \ + bt_message_iterator_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ } while (0) +/*! @} */ + +/*! @} */ + #ifdef __cplusplus } #endif diff --git a/include/babeltrace2/graph/message-message-iterator-inactivity-const.h b/include/babeltrace2/graph/message-message-iterator-inactivity-const.h deleted file mode 100644 index ce5ed337..00000000 --- a/include/babeltrace2/graph/message-message-iterator-inactivity-const.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_MESSAGE_MESSAGE_ITERATOR_INACTIVITY_CONST_H -#define BABELTRACE2_GRAPH_MESSAGE_MESSAGE_ITERATOR_INACTIVITY_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern const bt_clock_snapshot * -bt_message_message_iterator_inactivity_borrow_clock_snapshot_const( - const bt_message *msg); - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_MESSAGE_MESSAGE_ITERATOR_INACTIVITY_CONST_H */ diff --git a/include/babeltrace2/graph/message-message-iterator-inactivity.h b/include/babeltrace2/graph/message-message-iterator-inactivity.h deleted file mode 100644 index dba7c4a4..00000000 --- a/include/babeltrace2/graph/message-message-iterator-inactivity.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_MESSAGE_MESSAGE_ITERATOR_INACTIVITY_H -#define BABELTRACE2_GRAPH_MESSAGE_MESSAGE_ITERATOR_INACTIVITY_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern -bt_message *bt_message_message_iterator_inactivity_create( - bt_self_message_iterator *message_iterator, - const bt_clock_class *clock_class, uint64_t raw_value); - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_MESSAGE_MESSAGE_ITERATOR_INACTIVITY_H */ diff --git a/include/babeltrace2/graph/message-packet-beginning-const.h b/include/babeltrace2/graph/message-packet-beginning-const.h deleted file mode 100644 index af2f747c..00000000 --- a/include/babeltrace2/graph/message-packet-beginning-const.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_MESSAGE_PACKET_BEGINNING_CONST_H -#define BABELTRACE2_GRAPH_MESSAGE_PACKET_BEGINNING_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern const bt_packet *bt_message_packet_beginning_borrow_packet_const( - const bt_message *message); - -extern const bt_clock_snapshot * -bt_message_packet_beginning_borrow_default_clock_snapshot_const( - const bt_message *msg); - -extern const bt_clock_class * -bt_message_packet_beginning_borrow_stream_class_default_clock_class_const( - const bt_message *msg); - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_MESSAGE_PACKET_BEGINNING_CONST_H */ diff --git a/include/babeltrace2/graph/message-packet-beginning.h b/include/babeltrace2/graph/message-packet-beginning.h deleted file mode 100644 index 93a9785e..00000000 --- a/include/babeltrace2/graph/message-packet-beginning.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_MESSAGE_PACKET_BEGINNING_H -#define BABELTRACE2_GRAPH_MESSAGE_PACKET_BEGINNING_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern -bt_message *bt_message_packet_beginning_create( - bt_self_message_iterator *message_iterator, - const bt_packet *packet); - -extern -bt_message *bt_message_packet_beginning_create_with_default_clock_snapshot( - bt_self_message_iterator *message_iterator, - const bt_packet *packet, uint64_t raw_value); - -extern bt_packet *bt_message_packet_beginning_borrow_packet( - bt_message *message); - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_MESSAGE_PACKET_BEGINNING_H */ diff --git a/include/babeltrace2/graph/message-packet-end-const.h b/include/babeltrace2/graph/message-packet-end-const.h deleted file mode 100644 index 82e2bbd4..00000000 --- a/include/babeltrace2/graph/message-packet-end-const.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_MESSAGE_PACKET_END_CONST_H -#define BABELTRACE2_GRAPH_MESSAGE_PACKET_END_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern const bt_packet *bt_message_packet_end_borrow_packet_const( - const bt_message *message); - -extern const bt_clock_snapshot * -bt_message_packet_end_borrow_default_clock_snapshot_const( - const bt_message *msg); - -extern const bt_clock_class * -bt_message_packet_end_borrow_stream_class_default_clock_class_const( - const bt_message *msg); - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_MESSAGE_PACKET_END_CONST_H */ diff --git a/include/babeltrace2/graph/message-packet-end.h b/include/babeltrace2/graph/message-packet-end.h deleted file mode 100644 index a0201799..00000000 --- a/include/babeltrace2/graph/message-packet-end.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_MESSAGE_PACKET_END_H -#define BABELTRACE2_GRAPH_MESSAGE_PACKET_END_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern -bt_message *bt_message_packet_end_create( - bt_self_message_iterator *message_iterator, - const bt_packet *packet); - -extern -bt_message *bt_message_packet_end_create_with_default_clock_snapshot( - bt_self_message_iterator *message_iterator, - const bt_packet *packet, uint64_t raw_value); - -extern bt_packet *bt_message_packet_end_borrow_packet( - bt_message *message); - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_MESSAGE_PACKET_END_H */ diff --git a/include/babeltrace2/graph/message-stream-beginning-const.h b/include/babeltrace2/graph/message-stream-beginning-const.h deleted file mode 100644 index 69fdaa48..00000000 --- a/include/babeltrace2/graph/message-stream-beginning-const.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_MESSAGE_STREAM_BEGINNING_CONST_H -#define BABELTRACE2_GRAPH_MESSAGE_STREAM_BEGINNING_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern const bt_stream *bt_message_stream_beginning_borrow_stream_const( - const bt_message *message); - -extern bt_message_stream_clock_snapshot_state -bt_message_stream_beginning_borrow_default_clock_snapshot_const( - const bt_message *message, const bt_clock_snapshot **snapshot); - -extern const bt_clock_class * -bt_message_stream_beginning_borrow_stream_class_default_clock_class_const( - const bt_message *msg); - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_MESSAGE_STREAM_BEGINNING_CONST_H */ diff --git a/include/babeltrace2/graph/message-stream-beginning.h b/include/babeltrace2/graph/message-stream-beginning.h deleted file mode 100644 index e7385c54..00000000 --- a/include/babeltrace2/graph/message-stream-beginning.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_MESSAGE_STREAM_BEGINNING_H -#define BABELTRACE2_GRAPH_MESSAGE_STREAM_BEGINNING_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern -bt_message *bt_message_stream_beginning_create( - bt_self_message_iterator *message_iterator, - const bt_stream *stream); - -extern bt_stream *bt_message_stream_beginning_borrow_stream( - bt_message *message); - -extern -void bt_message_stream_beginning_set_default_clock_snapshot( - bt_message *message, uint64_t raw_value); - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_MESSAGE_STREAM_BEGINNING_H */ diff --git a/include/babeltrace2/graph/message-stream-const.h b/include/babeltrace2/graph/message-stream-const.h deleted file mode 100644 index 8ecdfe78..00000000 --- a/include/babeltrace2/graph/message-stream-const.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_MESSAGE_STREAM_CONST_H -#define BABELTRACE2_GRAPH_MESSAGE_STREAM_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum bt_message_stream_clock_snapshot_state { - BT_MESSAGE_STREAM_CLOCK_SNAPSHOT_STATE_UNKNOWN = 0, - BT_MESSAGE_STREAM_CLOCK_SNAPSHOT_STATE_KNOWN = 1, -} bt_message_stream_clock_snapshot_state; - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_MESSAGE_STREAM_CONST_H */ diff --git a/include/babeltrace2/graph/message-stream-end-const.h b/include/babeltrace2/graph/message-stream-end-const.h deleted file mode 100644 index b822e3bb..00000000 --- a/include/babeltrace2/graph/message-stream-end-const.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_MESSAGE_STREAM_END_CONST_H -#define BABELTRACE2_GRAPH_MESSAGE_STREAM_END_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern const bt_stream *bt_message_stream_end_borrow_stream_const( - const bt_message *message); - -extern bt_message_stream_clock_snapshot_state -bt_message_stream_end_borrow_default_clock_snapshot_const( - const bt_message *message, const bt_clock_snapshot **snapshot); - -extern const bt_clock_class * -bt_message_stream_end_borrow_stream_class_default_clock_class_const( - const bt_message *msg); - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_MESSAGE_STREAM_END_CONST_H */ diff --git a/include/babeltrace2/graph/message-stream-end.h b/include/babeltrace2/graph/message-stream-end.h deleted file mode 100644 index 34b98b8f..00000000 --- a/include/babeltrace2/graph/message-stream-end.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_MESSAGE_STREAM_END_H -#define BABELTRACE2_GRAPH_MESSAGE_STREAM_END_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern -bt_message *bt_message_stream_end_create( - bt_self_message_iterator *message_iterator, - const bt_stream *stream); - -extern bt_stream *bt_message_stream_end_borrow_stream( - bt_message *message); - -extern -void bt_message_stream_end_set_default_clock_snapshot( - bt_message *message, uint64_t raw_value); - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_MESSAGE_STREAM_END_H */ diff --git a/include/babeltrace2/graph/message.h b/include/babeltrace2/graph/message.h new file mode 100644 index 00000000..34b98bc0 --- /dev/null +++ b/include/babeltrace2/graph/message.h @@ -0,0 +1,3223 @@ +#ifndef BABELTRACE2_GRAPH_MESSAGE_H +#define BABELTRACE2_GRAPH_MESSAGE_H + +/* + * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef __BT_IN_BABELTRACE_H +# error "Please include instead." +#endif + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*! +@defgroup api-msg Messages +@ingroup api-comp-cls-dev + +@brief + Elements exchanged between \bt_p_comp. + +Messages are the objects which are exchanged +between \bt_p_comp in a trace processing \bt_graph to accomplish a +trace processing job. + +\bt_cp_msg_iter create messages while message iterators \em and +\bt_p_sink_comp consume messages. + +There are eight types of messages: + +- \bt_c_sb_msg +- \bt_c_se_msg +- \bt_c_ev_msg +- \bt_c_pb_msg +- \bt_c_pe_msg +- \bt_c_disc_ev_msg +- \bt_c_disc_pkt_msg +- \bt_c_inac_msg + +The type of a message is #bt_message. + +Get the type enumerator of a message with bt_message_get_type(). + +A message is a \ref api-fund-shared-object "shared object": get a +new reference with bt_message_get_ref() and put an existing +reference with bt_message_put_ref(). + +Some library functions \ref api-fund-freezing "freeze" messages on +success. The documentation of those functions indicate this +postcondition. + +Messages transport objects of the \ref api-tir API, which is an +intermediate representation of the tracing domain concepts. + +All types of messages, except the \bt_inac_msg type, are related to a +specific \bt_stream, which represents a conceptual +\ref api-msg-seq "sequence of messages". + +Some types of messages can have a default \bt_cs, depending on whether +or not their stream has a conceptual default clock, that is, whether or +not the stream's \ref api-tir-stream-cls "class" has a +\ref api-tir-stream-cls-prop-def-clock-cls "default clock class". +The creation functions for those types of messages contain +_with_default_clock_snapshot (for example, +bt_message_event_create_with_default_clock_snapshot()). + +For the \bt_sb_msg and \bt_se_msg, the default clock snapshot property +is optional, therefore they have dedicated +bt_message_stream_beginning_set_default_clock_snapshot() and +bt_message_stream_end_set_default_clock_snapshot() functions. + +All the message creation functions take a \bt_self_msg_iter as their +first parameter. This is because a message iterator method is the only +valid context to create a message. + +

    Message types

    + +This section details each type of message. + +The following table shows the creation functions and types for each type +of message: + + + + + + + + + + + +
    Name + Type enumerator + Creation functions +
    \ref api-msg-sb "Stream beginning" + #BT_MESSAGE_TYPE_STREAM_BEGINNING + bt_message_stream_beginning_create() +
    \ref api-msg-se "Stream end" + #BT_MESSAGE_TYPE_STREAM_END + bt_message_stream_end_create() +
    \ref api-msg-ev "Event" + #BT_MESSAGE_TYPE_EVENT + + bt_message_event_create()
    + bt_message_event_create_with_default_clock_snapshot()
    + bt_message_event_create_with_packet()
    + bt_message_event_create_with_packet_and_default_clock_snapshot() +
    \ref api-msg-pb "Packet beginning" + #BT_MESSAGE_TYPE_PACKET_BEGINNING + + bt_message_packet_beginning_create()
    + bt_message_packet_beginning_create_with_default_clock_snapshot() +
    \ref api-msg-pe "Packet end" + #BT_MESSAGE_TYPE_PACKET_END + + bt_message_packet_end_create()
    + bt_message_packet_end_create_with_default_clock_snapshot() +
    \ref api-msg-disc-ev "Discarded events" + #BT_MESSAGE_TYPE_DISCARDED_EVENTS + + bt_message_discarded_events_create()
    + bt_message_discarded_events_create_with_default_clock_snapshots() +
    \ref api-msg-disc-pkt "Discarded packets" + #BT_MESSAGE_TYPE_DISCARDED_PACKETS + + bt_message_discarded_packets_create()
    + bt_message_discarded_packets_create_with_default_clock_snapshots() +
    \ref api-msg-inac "Message iterator inactivity" + #BT_MESSAGE_TYPE_MESSAGE_ITERATOR_INACTIVITY + bt_message_message_iterator_inactivity_create() +
    + +

    \anchor api-msg-sb Stream beginning message

    + +A stream beginning message indicates the +beginning of a \bt_stream. + +For a given stream: + +- A stream beginning message is always the first one in the + \ref api-msg-seq "message sequence". + +- There can be only one stream beginning message. + +Create a stream beginning message with +bt_message_stream_beginning_create(). + +A stream beginning message has the following properties: + +
    +
    \anchor api-msg-sb-prop-stream Stream
    +
    + \bt_c_stream of which the message indicates the beginning. + + You cannot change the stream once the message is created. + + Borrow a stream beginning message's stream with + bt_message_stream_beginning_borrow_stream() and + bt_message_stream_beginning_borrow_stream_const(). +
    + +
    + \anchor api-msg-sb-prop-cs + \bt_dt_opt Default \bt_cs +
    +
    + Snapshot of the message's \bt_stream's default clock when the + stream begins. + + A stream beginning message can only have a default clock snapshot + if its stream's \ref api-tir-stream-cls "class" has a + \ref api-tir-stream-cls-prop-def-clock-cls "default clock class". + + When a stream beginning message has no default clock snapshot, + then its time is unknown. + + Set a stream beginning message's default clock snapshot with + bt_message_stream_beginning_set_default_clock_snapshot(). + + Borrow a stream beginning message's default clock snapshot with + bt_message_stream_beginning_borrow_default_clock_snapshot_const(). +
    +
    + +

    \anchor api-msg-se Stream end message

    + +A stream end message indicates the +end of a \bt_stream. + +For a given stream: + +- A stream end message is always the last one in the + \ref api-msg-seq "message sequence". + +- There can be only one stream end message. + +Create a stream end message with bt_message_stream_end_create(). + +A stream end message has the following properties: + +
    +
    \anchor api-msg-se-prop-stream Stream
    +
    + \bt_c_stream of which the message indicates the end. + + You cannot change the stream once the message is created. + + Borrow a stream end message's stream with + bt_message_stream_end_borrow_stream() and + bt_message_stream_end_borrow_stream_const(). +
    + +
    + \anchor api-msg-se-prop-cs + \bt_dt_opt Default \bt_cs +
    +
    + Snapshot of the message's \bt_stream's default clock when the + stream ends. + + A stream end message can only have a default clock snapshot + if its stream's \ref api-tir-stream-cls "class" has a + \ref api-tir-stream-cls-prop-def-clock-cls "default clock class". + + When a stream end message has no default clock snapshot, then its + time is unknown. + + Set a stream end message's default clock snapshot with + bt_message_stream_end_set_default_clock_snapshot(). + + Borrow a stream end message's default clock snapshot with + bt_message_stream_end_borrow_default_clock_snapshot_const(). +
    +
    + +

    \anchor api-msg-ev Event message

    + +An event message transports an \bt_ev and has, +possibly, a default \bt_cs. + +Within its \bt_stream's \ref api-msg-seq "message sequence", an event +message can only occur: + +
    +
    + If the stream's \ref api-tir-stream-cls "class" + \ref api-tir-stream-cls-prop-supports-pkt "supports packets" +
    +
    After a \bt_pb_msg and before a \bt_pe_msg.
    + +
    + If the stream's class does not support packets +
    +
    After the \bt_sb_msg and before the \bt_se_msg.
    +
    + +To create an event message for a given stream, use: + +
    +
    + If the stream's \ref api-tir-stream-cls "class" + \ref api-tir-stream-cls-prop-supports-pkt "supports packets" +
    +
    +
    +
    + If the stream's class has a + \ref api-tir-stream-cls-prop-def-clock-cls "default clock class" +
    +
    bt_message_event_create_with_packet_and_default_clock_snapshot()
    + +
    + If the stream's class does not have a + \ref api-tir-stream-cls-prop-def-clock-cls "default clock class" +
    +
    bt_message_event_create_with_packet()
    +
    + + Those two creation functions accept a \bt_pkt parameter which is + the packet logically containing the message's event. A packet is + part of a stream. +
    + +
    + If the stream's class does not supports packets +
    +
    +
    +
    + If the stream's class has a default clock class +
    +
    bt_message_event_create_with_default_clock_snapshot()
    + +
    + If the stream's class does not have a + \ref api-tir-stream-cls-prop-def-clock-cls "default clock class" +
    +
    bt_message_event_create()
    +
    +
    +
    + +The four creation functions above accept an \bt_ev_cls parameter. When +you create the message, the library instantiates this event class as an +\bt_ev. Borrow the resulting event with bt_message_event_borrow_event(). +This event class must be part of the class of the event message's +stream. + +An event message's event is initially not set: before you emit +the event message from a \bt_msg_iter's +\link api-msg-iter-cls-meth-next "next" method\endlink, you need to +borrow each of its \bt_p_field (with bt_event_borrow_payload_field(), +bt_event_borrow_specific_context_field(), and +bt_event_borrow_common_context_field()) and, recursively, set the values +of the all their inner fields. + +An event message has the following properties: + +
    +
    \anchor api-msg-ev-prop-ev Event
    +
    + \bt_c_ev which the message transports. + + This is an instance of the \bt_ev_cls which was passed to the + message's creation function. + + With this event, you can access its \bt_pkt (if any) with + bt_event_borrow_packet_const() and its + \bt_stream with bt_event_borrow_stream_const(). + + Borrow an event message's event with bt_message_event_borrow_event() + and bt_message_event_borrow_event_const(). +
    + +
    + \anchor api-msg-ev-prop-cs + \bt_dt_opt Default \bt_cs +
    +
    + Snapshot of the message's \bt_stream's default clock when the + event occurs. + + An event message has a default clock snapshot + if its stream's \ref api-tir-stream-cls "class" has a + \ref api-tir-stream-cls-prop-def-clock-cls "default clock class", + and has none otherwise. + + Within its \bt_msg_iter's \ref api-msg-seq "message sequence", + the default clock snapshot of an event message must be greater than + or equal to any default clock snapshot of any previous message. + + Borrow an event message's default clock snapshot with + bt_message_event_borrow_default_clock_snapshot_const(). +
    +
    + +

    \anchor api-msg-pb Packet beginning message

    + +A packet beginning message indicates the +beginning of a \bt_pkt. + +A packet beginning message can only exist if its \bt_stream's +\ref api-tir-stream-cls "class" +\ref api-tir-stream-cls-prop-supports-pkt "supports packets". + +For a given packet, there can be only one packet beginning message. + +Within its \bt_stream's \ref api-msg-seq "message sequence", a packet +beginning message can only occur after the \bt_sb_msg and before the +\bt_se_msg. + +To create a packet beginning message for a given stream, use: + +
    +
    + If, for this stream's class, + \ref api-tir-stream-cls-prop-pkt-beg-cs "packets have a beginning default clock snapshot" +
    +
    bt_message_packet_beginning_create_with_default_clock_snapshot()
    + +
    + If, for this stream's class, packets do not have a beginning default + clock snapshot +
    +
    bt_message_packet_beginning_create()
    +
    + +A packet beginning message has the following properties: + +
    +
    \anchor api-msg-pb-prop-pkt Packet
    +
    + \bt_c_pkt of which the message indicates the beginning. + + You cannot change the packet once the message is created. + + Borrow a packet beginning message's packet with + bt_message_packet_beginning_borrow_packet() and + bt_message_packet_beginning_borrow_packet_const(). +
    + +
    + \anchor api-msg-pb-prop-cs + \bt_dt_opt Default \bt_cs +
    +
    + Snapshot of the message's \bt_stream's default clock when the + packet begins. + + A packet beginning message has a default clock snapshot if: + + - Its stream's \ref api-tir-stream-cls "class" has a + \ref api-tir-stream-cls-prop-def-clock-cls "default clock class". + + - For its stream's class, + \ref api-tir-stream-cls-prop-pkt-beg-cs "packets have a beginning default clock snapshot". + + Within its \bt_msg_iter's \ref api-msg-seq "message sequence", + the default clock snapshot of a packet beginning message must be + greater than or equal to any clock snapshot of any previous message. + + Borrow a packet beginning message's default clock snapshot with + bt_message_packet_beginning_borrow_default_clock_snapshot_const(). +
    +
    + +

    \anchor api-msg-pe Packet end message

    + +A packet end message indicates the +end of a \bt_pkt. + +A packet end message can only exist if its \bt_stream's +\ref api-tir-stream-cls "class" +\ref api-tir-stream-cls-prop-supports-pkt "supports packets". + +For a given packet, there can be only one packet end message. + +Within its \bt_stream's \ref api-msg-seq "message sequence", a packet +end message can only occur: + +- After the \bt_sb_msg and before the \bt_se_msg. +- After a \bt_pb_msg for the same packet. + +To create a packet end message for a given stream, use: + +
    +
    + If, for this stream's class, + \ref api-tir-stream-cls-prop-pkt-end-cs "packets have an end default clock snapshot" +
    +
    bt_message_packet_end_create_with_default_clock_snapshot()
    + +
    + If, for this stream's class, packets do not have an end default + clock snapshot +
    +
    bt_message_packet_end_create()
    +
    + +A packet end message has the following properties: + +
    +
    \anchor api-msg-pe-prop-pkt Packet
    +
    + \bt_c_pkt of which the message indicates the end. + + You cannot change the packet once the message is created. + + Borrow a packet end message's packet with + bt_message_packet_end_borrow_packet() and + bt_message_packet_end_borrow_packet_const(). +
    + +
    + \anchor api-msg-pe-prop-cs + \bt_dt_opt Default \bt_cs +
    +
    + Snapshot of the message's \bt_stream's default clock when the + packet ends. + + A packet end message has a default clock snapshot if: + + - Its stream's \ref api-tir-stream-cls "class" has a + \ref api-tir-stream-cls-prop-def-clock-cls "default clock class". + + - For its stream's class, + \ref api-tir-stream-cls-prop-pkt-end-cs "packets have an end default clock snapshot". + + Within its \bt_msg_iter's \ref api-msg-seq "message sequence", + the default clock snapshot of a packet end message must be greater + than or equal to any clock snapshot of any previous message. + + Borrow a packet end message's default clock snapshot with + bt_message_packet_end_borrow_default_clock_snapshot_const(). +
    +
    + +

    \anchor api-msg-disc-ev Discarded events message

    + +A discarded events message indicates that +events were discarded at tracing time. It does \em not indicate +that \bt_p_ev_msg were dropped during a trace processing \bt_graph run. + +A discarded events message can only exist if its \bt_stream's +\ref api-tir-stream-cls "class" +\ref api-tir-stream-cls-prop-supports-disc-ev "supports discarded events". + +Within its \bt_stream's \ref api-msg-seq "message sequence", a discarded +events message can only occur after the \bt_sb_msg and before the +\bt_se_msg. + +To create a discarded events message for a given stream, use: + +
    +
    + If, for this stream's class, + \ref api-tir-stream-cls-prop-disc-ev-cs "discarded events have default clock snapshots" +
    +
    bt_message_discarded_events_create_with_default_clock_snapshots()
    + +
    + If, for this stream's class, discarded events do not have default + clock snapshots +
    +
    bt_message_discarded_events_create()
    +
    + +A discarded events message has the following properties: + +
    +
    \anchor api-msg-disc-ev-prop-stream Stream
    +
    + \bt_c_stream into which events were discarded. + + You cannot change the stream once the message is created. + + Borrow a discarded events message's stream with + bt_message_discarded_events_borrow_stream() and + bt_message_discarded_events_borrow_stream_const(). +
    + +
    + \anchor api-msg-disc-ev-prop-cs-beg + \bt_dt_opt Beginning default \bt_cs +
    +
    + Snapshot of the message's \bt_stream's default clock which indicates + the beginning of the discarded events time range. + + A discarded events message has a beginning default clock snapshot + if: + + - Its stream's \ref api-tir-stream-cls "class" has a + \ref api-tir-stream-cls-prop-def-clock-cls "default clock class". + + - For its stream's class, + \ref api-tir-stream-cls-prop-disc-ev-cs "discarded events have default clock snapshots". + + Within its \bt_msg_iter's \ref api-msg-seq "message sequence", + the beginning default clock snapshot of a discarded events message + must be greater than or equal to any clock snapshot of any previous + message. + + Borrow a discarded events message's beginning default clock snapshot + with + bt_message_discarded_events_borrow_beginning_default_clock_snapshot_const(). +
    + +
    + \anchor api-msg-disc-ev-prop-cs-end + \bt_dt_opt End default \bt_cs +
    +
    + Snapshot of the message's \bt_stream's default clock which indicates + the end of the discarded events time range. + + A discarded events message has an end default clock snapshot if: + + - Its stream's \ref api-tir-stream-cls "class" has a + \ref api-tir-stream-cls-prop-def-clock-cls "default clock class". + + - For its stream's class, + \ref api-tir-stream-cls-prop-disc-ev-cs "discarded events have default clock snapshots". + + If a discarded events message has both a + \ref api-msg-disc-ev-prop-cs-beg "beginning" and an end default + clock snapshots, the end default clock snapshot must be greater than + or equal to the beginning default clock snapshot. + + Within its \bt_msg_iter's \ref api-msg-seq "message sequence", + the end default clock snapshot of a discarded events message must be + greater than or equal to any clock snapshot of any previous message. + + Borrow a discarded events message's end default clock snapshot with + bt_message_discarded_events_borrow_end_default_clock_snapshot_const(). +
    + +
    + \anchor api-msg-disc-ev-prop-count + \bt_dt_opt Discarded event count +
    +
    + Exact number of discarded events. + + If this property is missing, then the number of discarded events + is at least one. + + Use bt_message_discarded_events_set_count() and + bt_message_discarded_events_get_count(). +
    +
    + +

    \anchor api-msg-disc-pkt Discarded packets message

    + +A discarded packets message indicates that +packets were discarded at tracing time. It does \em not +indicate that whole packets were dropped during a trace processing +\bt_graph run. + +A discarded packets message can only exist if its \bt_stream's +\ref api-tir-stream-cls "class" +\ref api-tir-stream-cls-prop-supports-disc-pkt "supports discarded packets". + +Within its \bt_stream's \ref api-msg-seq "message sequence", a discarded +packets message can only occur: + +- After the \bt_sb_msg. +- Before the \bt_se_msg. +- One of: + - Before any \bt_pb_msg. + - After any \bt_pe_msg. + - Between a packet end and a packet beginning message. + +To create a discarded packets message for a given stream, use: + +
    +
    + If, for this stream's class, + \ref api-tir-stream-cls-prop-disc-pkt-cs "discarded packets have default clock snapshots" +
    +
    bt_message_discarded_packets_create_with_default_clock_snapshots()
    + +
    + If, for this stream's class, discarded packets do not have default + clock snapshots +
    +
    bt_message_discarded_packets_create()
    +
    + +A discarded packets message has the following properties: + +
    +
    \anchor api-msg-disc-pkt-prop-stream Stream
    +
    + \bt_c_stream into which packets were discarded. + + You cannot change the stream once the message is created. + + Borrow a discarded packets message's stream with + bt_message_discarded_packets_borrow_stream() and + bt_message_discarded_packets_borrow_stream_const(). +
    + +
    + \anchor api-msg-disc-pkt-prop-cs-beg + \bt_dt_opt Beginning default \bt_cs +
    +
    + Snapshot of the message's \bt_stream's default clock which indicates + the beginning of the discarded packets time range. + + A discarded packets message has a beginning default clock snapshot + if: + + - Its stream's \ref api-tir-stream-cls "class" has a + \ref api-tir-stream-cls-prop-def-clock-cls "default clock class". + + - For its stream's class, + \ref api-tir-stream-cls-prop-disc-pkt-cs "discarded packets have default clock snapshots". + + Within its \bt_msg_iter's \ref api-msg-seq "message sequence", + the beginning default clock snapshot of a discarded packets message + must be greater than or equal to any clock snapshot of any previous + message. + + Borrow a discarded packets message's beginning default clock snapshot + with + bt_message_discarded_packets_borrow_beginning_default_clock_snapshot_const(). +
    + +
    + \anchor api-msg-disc-pkt-prop-cs-end + \bt_dt_opt End default \bt_cs +
    +
    + Snapshot of the message's \bt_stream's default clock which indicates + the end of the discarded packets time range. + + A discarded packets message has an end default clock snapshot if: + + - Its stream's \ref api-tir-stream-cls "class" has a + \ref api-tir-stream-cls-prop-def-clock-cls "default clock class". + + - For its stream's class, + \ref api-tir-stream-cls-prop-disc-pkt-cs "discarded packets have default clock snapshots". + + If a discarded packets message has both a + \ref api-msg-disc-pkt-prop-cs-beg "beginning" and an end default + clock snapshots, the end default clock snapshot must be greater than + or equal to the beginning default clock snapshot. + + Within its \bt_msg_iter's \ref api-msg-seq "message sequence", + the end default clock snapshot of a discarded packets message must + be greater than or equal to any clock snapshot of any previous + message. + + Borrow a discarded packets message's end default clock snapshot with + bt_message_discarded_packets_borrow_end_default_clock_snapshot_const(). +
    + +
    + \anchor api-msg-disc-pkt-prop-count + \bt_dt_opt Discarded packet count +
    +
    + Exact number of discarded packets. + + If this property is missing, then the number of discarded packets + is at least one. + + Use bt_message_discarded_packets_set_count() and + bt_message_discarded_packets_get_count(). +
    +
    + +

    \anchor api-msg-inac Message iterator inactivity

    + +A message iterator inactivity message +indicates that, within the \ref api-msg-seq "message sequence" of a +given \bt_msg_iter, there's no messages since the last message (if any) +until a given point in time. + +A message iterator inactivity message is the only type of message that's +not related to a \bt_stream: it targets the whole message sequence of a +message iterator, and can occur at any position within the sequence. + +This message is mostly significant for real-time message iterators: if a +message iterator A indicates that there's no messages until a given +point in time T, then a downstream filter message iterator B which +relies on multiple upstream message iterators does not have to wait for +new messages from A until T. + +In other words, a message iterator inactivity message can help +downstream message iterators or \bt_p_sink_comp progress. + +Create a message iterator inactivity message with +bt_message_message_iterator_inactivity_create(). You must pass a +\bt_clock_cls and the value of a fictitious (clock) instance to this +function so that it creates a \bt_cs. + +A message iterator inactivity message has the following property: + +
    +
    + \anchor api-msg-inac-prop-cs + \bt_dt_opt \bt_c_cs +
    +
    + Snapshot of a fictitious instance of the message's \bt_clock_cls + which indicates the point in time until when there's no messages + in the message iterator's \ref api-msg-seq "message sequence". + + Within its \bt_msg_iter's message sequence, the clock snapshot of a + message iterator inactivity message must be greater than or equal to + any clock snapshot of any previous message. + + Borrow a message iterator inactivity message's clock snapshot + with + bt_message_message_iterator_inactivity_borrow_clock_snapshot_const(). +
    +
    + +

    \anchor api-msg-mip Message Interchange Protocol

    + +The Message Interchange Protocol (MIP) is the system of rules +used by \bt_p_comp and \bt_p_msg_iter to exchance messages within a +trace processing graph. + +The MIP covers everything related to messages and what they contain, as +well as how they are ordered within the \ref api-msg-seq "sequence" that +a message iterator produces. + +For example: + +- A valid message sequence for a given \bt_stream starts with a + \bt_sb_msg and ends with a \bt_se_msg. + +- The maximum + \ref api-tir-fc-int-prop-size "field value range" for an \bt_uint_fc + is [0, 264 - 1]. + +- The available message types are stream beginning and end, event, + packet beginning and end, discarded events and packets, and message + iterator inactivity. + +The MIP has a version which is a single major number, independent from +the \bt_name project's version. As of \bt_name_version_min_maj, the only +available MIP version is 0. + +If what the MIP covers changes in a breaking or semantical way in the +future, the MIP and \bt_name's minor versions will be bumped. + +When you create a trace processing \bt_graph with bt_graph_create(), you +must pass the effective MIP version to use. Then, the components you +\ref api-graph-lc-add "add" to this graph can access this configured MIP +version with bt_self_component_get_graph_mip_version() and behave +accordingly. In other words, if the configured MIP version is 0, then a +component cannot use features introduced by MIP version 1. For +example, should the project introduce a new type of \bt_fc, the MIP +version would be bumped. + +A component which cannot honor a given MIP can fail at +initialization time, making the corresponding +bt_graph_add_*_component*() call fail too. To avoid any +surprise, you can create a \bt_comp_descr_set with descriptors of the +components you intend to add to a trace processing graph and call +bt_get_greatest_operative_mip_version() to get the greatest (most +recent) MIP version you can use. + +To get the library's latest MIP version, use +bt_get_maximal_mip_version(). + +The ultimate goal of the MIP version feature is for the \bt_name project +to be able to introduce new features or even major breaking changes +without breaking existing \bt_p_comp_cls. This is especially important +considering that \bt_name supports \bt_p_plugin written by different +authors. Of course one of the project's objectives is to bump the MIP +version as rarely as possible. When it is required, though, it's a +welcome tool to make the project evolve gracefully. + +The Message Interchange Protocol has no dedicated documentation as this +very message module (and its submodules, like \ref api-tir) +documentation is enough. You can consider that all the +functions of the message and trace IR objects have an implicit MIP +version \ref api-fund-pre-post "precondition". When a given +function documentation does not explicitly document a MIP version +precondition, it means that the effective MIP version has no effect on +said function's behaviour. + +

    \anchor api-msg-seq Message sequence rules

    + +The purpose of a \bt_msg_iter is to iterate a sequence of messages. + +Those messages can be related to different \bt_p_stream: + +@image html trace-structure-msg-seq.png "Messages of multiple streams as a single message sequence for a given message iterator." + +However, for such a message sequence, the current \bt_mip +(version \bt_max_mip_version) dictates that: + +
      +
    • + For a given \bt_stream: + + - The sequence must begin with a \bt_sb_msg. + - The sequence must end with a \bt_se_msg. + - If the stream's \ref api-tir-stream-cls "class" + \ref api-tir-stream-cls-prop-supports-pkt "supports packets": + - Any \bt_pb_msg must be followed with a \bt_pe_msg. + - All \bt_p_ev_msg must be between a packet beginning and a + packet end message. + - A \bt_disc_pkt_msg must be (one of): + - Before the first packet beginning message. + - Between a packet end message and a packet beginning message. + - After the last packet end message. + + The rules above can be summarized by the following regular + expressions: + +
      +
      Without packets
      +
      + @code{.unparsed} + SB (E | DE)* SE + @endcode +
      + +
      With packets
      +
      + @code{.unparsed} + SB ((PB (E | DE)* PE) | DE | DP)* SE + @endcode +
      +
      + + With this alphabet: + +
      +
      SB
      +
      \bt_c_sb_msg
      + +
      SE
      +
      \bt_c_se_msg
      + +
      E
      +
      \bt_c_ev_msg
      + +
      PB
      +
      \bt_c_pb_msg
      + +
      PE
      +
      \bt_c_pe_msg
      + +
      DE
      +
      \bt_c_disc_ev_msg
      + +
      DP
      +
      \bt_c_disc_pkt_msg
      +
      +
    • + For a given message iterator, for any message with a \bt_cs, its + clock snapshot must be greater than or equal to any clock snapshot + of any previous message. + + For the scope of this rule, the clock snapshot of a \bt_disc_ev_msg + or of a \bt_disc_pkt_msg is its beginning default clock snapshot. +
    • + For a given message iterator, the \bt_p_cs of all the messages of + the sequence with a clock snapshot must be correlatable + (see \ref api-tir-clock-cls-origin "Clock value vs. clock class origin"). +
    +*/ + +/*! @{ */ + +/*! +@name Type +@{ + +@typedef struct bt_message bt_message; + +@brief + Message. + +@} +*/ + +/*! +@name Type query +@{ +*/ + +/*! +@brief + Message type enumerators. +*/ +typedef enum bt_message_type { + /*! + @brief + \bt_c_sb_msg. + */ + BT_MESSAGE_TYPE_STREAM_BEGINNING = 1 << 0, + + /*! + @brief + \bt_c_se_msg. + */ + BT_MESSAGE_TYPE_STREAM_END = 1 << 1, + + /*! + @brief + \bt_c_ev_msg. + */ + BT_MESSAGE_TYPE_EVENT = 1 << 2, + + /*! + @brief + \bt_c_pb_msg. + */ + BT_MESSAGE_TYPE_PACKET_BEGINNING = 1 << 3, + + /*! + @brief + \bt_c_pe_msg. + */ + BT_MESSAGE_TYPE_PACKET_END = 1 << 4, + + /*! + @brief + \bt_c_disc_ev_msg. + */ + BT_MESSAGE_TYPE_DISCARDED_EVENTS = 1 << 5, + + /*! + @brief + \bt_c_disc_pkt_msg. + */ + BT_MESSAGE_TYPE_DISCARDED_PACKETS = 1 << 6, + + /*! + @brief + \bt_c_inac_msg. + */ + BT_MESSAGE_TYPE_MESSAGE_ITERATOR_INACTIVITY = 1 << 7, +} bt_message_type; + +/*! +@brief + Returns the type enumerator of the message \bt_p{message}. + +@param[in] message + Message of which to get the type enumerator + +@returns + Type enumerator of \bt_p{message}. + +@bt_pre_not_null{message} +*/ +extern bt_message_type bt_message_get_type(const bt_message *message); + +/*! @} */ + +/*! +@name Common stream message +@{ +*/ + +/*! +@brief + Return type of + bt_message_stream_beginning_borrow_default_clock_snapshot_const() + and + bt_message_stream_end_borrow_default_clock_snapshot_const(). +*/ +typedef enum bt_message_stream_clock_snapshot_state { + /*! + @brief + Known \bt_cs. + */ + BT_MESSAGE_STREAM_CLOCK_SNAPSHOT_STATE_KNOWN = 1, + + /*! + @brief + Unknown (no) \bt_cs. + */ + BT_MESSAGE_STREAM_CLOCK_SNAPSHOT_STATE_UNKNOWN = 0, +} bt_message_stream_clock_snapshot_state; + +/*! @} */ + +/*! +@name Stream beginning message +@{ +*/ + +/*! +@brief + Creates a \bt_sb_msg for the \bt_stream \bt_p{stream} from the + \bt_msg_iter \bt_p{self_message_iterator}. + +On success, the returned stream beginning message has the following +property values: + + + + + +
    Property + Value +
    \ref api-msg-sb-prop-stream "Stream" + \bt_p{stream} +
    \ref api-msg-sb-prop-cs "Default clock snapshot" + \em None +
    + +@param[in] self_message_iterator + Self message iterator from which to create the stream beginning + message. +@param[in] stream + Stream of which the message to create indicates the beginning. + +@returns + New stream beginning message reference, or \c NULL on memory error. + +@bt_pre_not_null{self_message_iterator} +@bt_pre_not_null{stream} + +@bt_post_success_frozen{stream} +*/ +extern +bt_message *bt_message_stream_beginning_create( + bt_self_message_iterator *self_message_iterator, + const bt_stream *stream); + +/*! +@brief + Borrows the \bt_stream of the \bt_sb_msg \bt_p{message}. + +See the \ref api-msg-sb-prop-stream "stream" property. + +@param[in] message + Stream beginning message from which to borrow the stream. + +@returns + @parblock + \em Borrowed reference of the stream of \bt_p{message}. + + The returned pointer remains valid as long as \bt_p{message} exists. + @endparblock + +@bt_pre_not_null{message} +@bt_pre_is_sb_msg{message} + +@sa bt_message_stream_beginning_borrow_stream_const() — + \c const version of this function. +*/ +extern bt_stream *bt_message_stream_beginning_borrow_stream( + bt_message *message); + +/*! +@brief + Borrows the \bt_stream of the \bt_sb_msg \bt_p{message} + (\c const version). + +See bt_message_stream_beginning_borrow_stream(). +*/ +extern const bt_stream *bt_message_stream_beginning_borrow_stream_const( + const bt_message *message); + +/*! +@brief + Sets the value, in clock cycles, of the default \bt_cs of the + \bt_sb_msg \bt_p{message} to \bt_p{value}. + +See the \ref api-msg-sb-prop-cs "default clock snapshot" property. + +@param[in] message + Stream beginning message of which to set the default clock snapshot + value to \bt_p{value}. +@param[in] value + New value (clock cycles) of the default clock snapshot of + \bt_p{message}. + +@bt_pre_not_null{message} +@bt_pre_hot{message} +@bt_pre_is_sb_msg{message} +@pre + The \bt_stream_cls of \bt_p{message} has a + \ref api-tir-stream-cls-prop-def-clock-cls "default clock class". + +@sa bt_message_stream_beginning_borrow_default_clock_snapshot_const() — + Borrows the default clock snapshot of a stream beginning message. +*/ +extern +void bt_message_stream_beginning_set_default_clock_snapshot( + bt_message *message, uint64_t value); + +/*! +@brief + Borrows the default \bt_cs of the \bt_sb_msg \bt_p{message}. + +See the \ref api-msg-sb-prop-cs "default clock snapshot" property. + +@param[in] message + Stream beginning message from which to borrow the default clock + snapshot. +@param[out] clock_snapshot + If this function returns + #BT_MESSAGE_STREAM_CLOCK_SNAPSHOT_STATE_KNOWN, + \bt_p{*clock_snapshot} is a \em borrowed reference of the default + clock snapshot of \bt_p{message}. + +@retval #BT_MESSAGE_STREAM_CLOCK_SNAPSHOT_STATE_KNOWN + The default clock snapshot of \bt_p{message} is known and returned + as \bt_p{*clock_snapshot}. +@retval #BT_MESSAGE_STREAM_CLOCK_SNAPSHOT_STATE_UNKNOWN + \bt_p{message} has no default clock snapshot: its time is unknown. + +@bt_pre_not_null{message} +@bt_pre_is_sb_msg{message} +@pre + The \bt_stream_cls of \bt_p{message} has a + \ref api-tir-stream-cls-prop-def-clock-cls "default clock class". +@bt_pre_not_null{clock_snapshot} + +@sa bt_message_stream_beginning_set_default_clock_snapshot() — + Sets the default clock snapshot of a stream beginning message. +*/ +extern bt_message_stream_clock_snapshot_state +bt_message_stream_beginning_borrow_default_clock_snapshot_const( + const bt_message *message, + const bt_clock_snapshot **clock_snapshot); + +/*! +@brief + Borrows the default \bt_clock_cls of the \bt_stream_cls + of the \bt_sb_msg \bt_p{message}. + +See the stream class's +\ref api-tir-stream-cls-prop-def-clock-cls "default clock class" +property. + +This is a helper which is equivalent to + +@code +bt_stream_class_borrow_default_clock_class_const( + bt_stream_borrow_class_const( + bt_message_stream_beginning_borrow_stream_const(message))) +@endcode + +@param[in] message + Stream beginning message from which to borrow its stream's class's + default clock class. + +@returns + \em Borrowed reference of the default clock class of + the stream class of \bt_p{message}, or \c NULL if none. + +@bt_pre_not_null{message} +@bt_pre_is_sb_msg{message} +*/ +extern const bt_clock_class * +bt_message_stream_beginning_borrow_stream_class_default_clock_class_const( + const bt_message *message); + +/*! @} */ + +/*! +@name Stream end message +@{ +*/ + +/*! +@brief + Creates a \bt_se_msg for the \bt_stream \bt_p{stream} from the + \bt_msg_iter \bt_p{self_message_iterator}. + +On success, the returned stream end message has the following +property values: + + + + + +
    Property + Value +
    \ref api-msg-se-prop-stream "Stream" + \bt_p{stream} +
    \ref api-msg-se-prop-cs "Default clock snapshot" + \em None +
    + +@param[in] self_message_iterator + Self message iterator from which to create the stream end + message. +@param[in] stream + Stream of which the message to create indicates the end. + +@returns + New stream end message reference, or \c NULL on memory error. + +@bt_pre_not_null{self_message_iterator} +@bt_pre_not_null{stream} + +@bt_post_success_frozen{stream} +*/ +extern +bt_message *bt_message_stream_end_create( + bt_self_message_iterator *self_message_iterator, + const bt_stream *stream); + +/*! +@brief + Borrows the \bt_stream of the \bt_se_msg \bt_p{message}. + +See the \ref api-msg-se-prop-stream "stream" property. + +@param[in] message + Stream end message from which to borrow the stream. + +@returns + @parblock + \em Borrowed reference of the stream of \bt_p{message}. + + The returned pointer remains valid as long as \bt_p{message} exists. + @endparblock + +@bt_pre_not_null{message} +@bt_pre_is_se_msg{message} + +@sa bt_message_stream_end_borrow_stream_const() — + \c const version of this function. +*/ +extern bt_stream *bt_message_stream_end_borrow_stream( + bt_message *message); + +/*! +@brief + Borrows the \bt_stream of the \bt_se_msg \bt_p{message} + (\c const version). + +See bt_message_stream_end_borrow_stream(). +*/ +extern const bt_stream *bt_message_stream_end_borrow_stream_const( + const bt_message *message); + +/*! +@brief + Sets the value, in clock cycles, of the default \bt_cs of the + \bt_se_msg \bt_p{message} to \bt_p{value}. + +See the \ref api-msg-se-prop-cs "default clock snapshot" property. + +@param[in] message + Stream end message of which to set the default clock snapshot + value to \bt_p{value}. +@param[in] value + New value (clock cycles) of the default clock snapshot of + \bt_p{message}. + +@bt_pre_not_null{message} +@bt_pre_hot{message} +@bt_pre_is_se_msg{message} +@pre + The \bt_stream_cls of \bt_p{message} has a + \ref api-tir-stream-cls-prop-def-clock-cls "default clock class". + +@sa bt_message_stream_end_borrow_default_clock_snapshot_const() — + Borrows the default clock snapshot of a stream end message. +*/ +extern +void bt_message_stream_end_set_default_clock_snapshot( + bt_message *message, uint64_t value); + +/*! +@brief + Borrows the default \bt_cs of the \bt_se_msg \bt_p{message}. + +See the \ref api-msg-se-prop-cs "default clock snapshot" property. + +@param[in] message + Stream end message from which to borrow the default clock + snapshot. +@param[out] clock_snapshot + If this function returns + #BT_MESSAGE_STREAM_CLOCK_SNAPSHOT_STATE_KNOWN, + \bt_p{*clock_snapshot} is a \em borrowed reference of the default + clock snapshot of \bt_p{message}. + +@retval #BT_MESSAGE_STREAM_CLOCK_SNAPSHOT_STATE_KNOWN + The default clock snapshot of \bt_p{message} is known and returned + as \bt_p{*clock_snapshot}. +@retval #BT_MESSAGE_STREAM_CLOCK_SNAPSHOT_STATE_UNKNOWN + \bt_p{message} has no default clock snapshot: its time is unknown. + +@bt_pre_not_null{message} +@bt_pre_is_se_msg{message} +@pre + The \bt_stream_cls of \bt_p{message} has a + \ref api-tir-stream-cls-prop-def-clock-cls "default clock class". +@bt_pre_not_null{clock_snapshot} + +@sa bt_message_stream_end_set_default_clock_snapshot() — + Sets the default clock snapshot of a stream end message. +*/ +extern bt_message_stream_clock_snapshot_state +bt_message_stream_end_borrow_default_clock_snapshot_const( + const bt_message *message, + const bt_clock_snapshot **clock_snapshot); + +/*! +@brief + Borrows the default \bt_clock_cls of the \bt_stream_cls + of the \bt_se_msg \bt_p{message}. + +See the stream class's +\ref api-tir-stream-cls-prop-def-clock-cls "default clock class" +property. + +This is a helper which is equivalent to + +@code +bt_stream_class_borrow_default_clock_class_const( + bt_stream_borrow_class_const( + bt_message_stream_end_borrow_stream_const(message))) +@endcode + +@param[in] message + Stream end message from which to borrow its stream's class's + default clock class. + +@returns + \em Borrowed reference of the default clock class of + the stream class of \bt_p{message}, or \c NULL if none. + +@bt_pre_not_null{message} +@bt_pre_is_se_msg{message} +*/ +extern const bt_clock_class * +bt_message_stream_end_borrow_stream_class_default_clock_class_const( + const bt_message *message); + +/*! @} */ + +/*! +@name Event message +@{ +*/ + +/*! +@brief + Creates an \bt_ev_msg, having an instance of the \bt_ev_cls + \bt_p{event_class}, for the \bt_stream \bt_p{stream} from the + \bt_msg_iter \bt_p{self_message_iterator}. + +@attention + @parblock + Only use this function if + + @code + bt_stream_class_supports_packets(bt_stream_borrow_class_const(stream)) + @endcode + + returns #BT_FALSE and + + @code + bt_stream_class_borrow_default_clock_class_const(bt_stream_borrow_class_const(stream)) + @endcode + + returns \c NULL. + + Otherwise, use + bt_message_event_create_with_default_clock_snapshot(), + bt_message_event_create_with_packet(), or + bt_message_event_create_with_packet_and_default_clock_snapshot(). + @endparblock + +On success, the returned event message has the following property +values: + + + + + +
    Property + Value +
    \ref api-msg-ev-prop-ev "Event" + + An instance (with \bt_p_field that are not set) of + \bt_p{event_class}. +
    \ref api-msg-se-prop-cs "Default clock snapshot" + \em None +
    + +@param[in] self_message_iterator + Self message iterator from which to create the event message. +@param[in] event_class + Class of the \bt_ev of the message to create. +@param[in] stream + Stream conceptually containing the event of the message to create. + +@returns + New event message reference, or \c NULL on memory error. + +@bt_pre_not_null{self_message_iterator} +@pre + The \bt_stream_cls of \bt_p{event_class} is also the class of + \bt_p{stream}, that is, + bt_event_class_borrow_stream_class_const(event_class) + and + bt_stream_borrow_class_const(stream) have the + same value. +@bt_pre_not_null{stream} +@pre + bt_stream_class_supports_packets(bt_stream_borrow_class_const(stream)) + returns #BT_FALSE. +@pre + bt_stream_class_borrow_default_clock_class_const(bt_stream_borrow_class_const(stream)) + returns \c NULL. + +@bt_post_success_frozen{event_class} +@bt_post_success_frozen{stream} +*/ +extern +bt_message *bt_message_event_create( + bt_self_message_iterator *self_message_iterator, + const bt_event_class *event_class, + const bt_stream *stream); + +/*! +@brief + Creates an \bt_ev_msg, having an instance of the \bt_ev_cls + \bt_p{event_class} and a default \bt_cs with the value + \bt_p{clock_snapshot_value}, for the \bt_stream \bt_p{stream} from + the \bt_msg_iter \bt_p{self_message_iterator}. + +@attention + @parblock + Only use this function if + + @code + bt_stream_class_supports_packets(bt_stream_borrow_class_const(stream)) + @endcode + + returns #BT_FALSE and + + @code + bt_stream_class_borrow_default_clock_class_const(bt_stream_borrow_class_const(stream)) + @endcode + + does \em not return \c NULL. + + Otherwise, use + bt_message_event_create(), + bt_message_event_create_with_packet(), or + bt_message_event_create_with_packet_and_default_clock_snapshot(). + @endparblock + +On success, the returned event message has the following property +values: + + + + + +
    Property + Value +
    \ref api-msg-ev-prop-ev "Event" + + An instance (with \bt_p_field that are not set) of + \bt_p{event_class}. +
    \ref api-msg-se-prop-cs "Default clock snapshot" + \bt_c_cs with the value \bt_p{clock_snapshot_value}. +
    + +@param[in] self_message_iterator + Self message iterator from which to create the event message. +@param[in] event_class + Class of the \bt_ev of the message to create. +@param[in] stream + Stream conceptually containing the event of the message to create. +@param[in] clock_snapshot_value + Value (clock cycles) of the default clock snapshot of + \bt_p{message}. + +@returns + New event message reference, or \c NULL on memory error. + +@bt_pre_not_null{self_message_iterator} +@pre + The \bt_stream_cls of \bt_p{event_class} is also the class of + \bt_p{stream}, that is, + bt_event_class_borrow_stream_class_const(event_class) + and + bt_stream_borrow_class_const(stream) have the + same value. +@bt_pre_not_null{stream} +@pre + bt_stream_class_supports_packets(bt_stream_borrow_class_const(stream)) + returns #BT_FALSE. +@pre + bt_stream_class_borrow_default_clock_class_const(bt_stream_borrow_class_const(stream)) + does \em not return \c NULL. + +@bt_post_success_frozen{event_class} +@bt_post_success_frozen{stream} +*/ +extern +bt_message *bt_message_event_create_with_default_clock_snapshot( + bt_self_message_iterator *self_message_iterator, + const bt_event_class *event_class, + const bt_stream *stream, uint64_t clock_snapshot_value); + +/*! +@brief + Creates an \bt_ev_msg, having an instance of the \bt_ev_cls + \bt_p{event_class}, for the \bt_pkt \bt_p{packet} from the + \bt_msg_iter \bt_p{self_message_iterator}. + +@attention + @parblock + Only use this function if + + @code + bt_stream_class_supports_packets( + bt_stream_borrow_class_const(bt_packet_borrow_stream_const(packet))) + @endcode + + returns #BT_TRUE and + + @code + bt_stream_class_borrow_default_clock_class_const( + bt_stream_borrow_class_const(bt_packet_borrow_stream_const(packet))) + @endcode + + returns \c NULL. + + Otherwise, use + bt_message_event_create(), + bt_message_event_create_with_default_clock_snapshot(), or + bt_message_event_create_with_packet_and_default_clock_snapshot(). + @endparblock + +On success, the returned event message has the following property +values: + + + + + +
    Property + Value +
    \ref api-msg-ev-prop-ev "Event" + + An instance (with \bt_p_field that are not set) of + \bt_p{event_class}. +
    \ref api-msg-se-prop-cs "Default clock snapshot" + \em None +
    + +@param[in] self_message_iterator + Self message iterator from which to create the event message. +@param[in] event_class + Class of the \bt_ev of the message to create. +@param[in] packet + Packet conceptually containing the event of the message to create. + +@returns + New event message reference, or \c NULL on memory error. + +@bt_pre_not_null{self_message_iterator} +@pre + The \bt_stream_cls of \bt_p{event_class} is also the stream class of + \bt_p{packet}, that is, + bt_event_class_borrow_stream_class_const(event_class) + and + bt_stream_borrow_class_const(bt_packet_borrow_stream_const(packet)) + have the same value. +@bt_pre_not_null{packet} +@pre + bt_stream_class_supports_packets(bt_stream_borrow_class_const(bt_packet_borrow_stream_const(packet))) + returns #BT_TRUE. +@pre + bt_stream_class_borrow_default_clock_class_const(bt_stream_borrow_class_const(bt_packet_borrow_stream_const(packet))) + returns \c NULL. +@pre + The \ref api-tir-pkt-prop-ctx "context field" of \bt_p{packet}, if + any, and all its contained \bt_p_field, recursively, are set. + +@bt_post_success_frozen{event_class} +@bt_post_success_frozen{packet} +*/ +extern +bt_message *bt_message_event_create_with_packet( + bt_self_message_iterator *self_message_iterator, + const bt_event_class *event_class, + const bt_packet *packet); + +/*! +@brief + Creates an \bt_ev_msg, having an instance of the \bt_ev_cls + \bt_p{event_class} and a default \bt_cs with the value + \bt_p{clock_snapshot_value}, for the \bt_pkt \bt_p{packet} from + the \bt_msg_iter \bt_p{self_message_iterator}. + +@attention + @parblock + Only use this function if + + @code + bt_stream_class_supports_packets( + bt_stream_borrow_class_const(bt_packet_borrow_stream_const(packet))) + @endcode + + returns #BT_TRUE and + + @code + bt_stream_class_borrow_default_clock_class_const( + bt_stream_borrow_class_const(bt_packet_borrow_stream_const(packet))) + @endcode + + does \em not return \c NULL. + + Otherwise, use + bt_message_event_create(), + bt_message_event_create_with_default_clock_snapshot(), or + bt_message_event_create_with_packet(). + @endparblock + +On success, the returned event message has the following property +values: + + + + + +
    Property + Value +
    \ref api-msg-ev-prop-ev "Event" + + An instance (with \bt_p_field that are not set) of + \bt_p{event_class}. +
    \ref api-msg-se-prop-cs "Default clock snapshot" + \bt_c_cs with the value \bt_p{clock_snapshot_value}. +
    + +@param[in] self_message_iterator + Self message iterator from which to create the event message. +@param[in] event_class + Class of the \bt_ev of the message to create. +@param[in] packet + Packet conceptually containing the event of the message to create. +@param[in] clock_snapshot_value + Value (clock cycles) of the default clock snapshot of + \bt_p{message}. + +@returns + New event message reference, or \c NULL on memory error. + +@bt_pre_not_null{self_message_iterator} +@pre + The \bt_stream_cls of \bt_p{event_class} is also the stream class of + \bt_p{packet}, that is, + bt_event_class_borrow_stream_class_const(event_class) + and + bt_stream_borrow_class_const(bt_packet_borrow_stream_const(packet)) + have the same value. +@bt_pre_not_null{packet} +@pre + bt_stream_class_supports_packets(bt_stream_borrow_class_const(bt_packet_borrow_stream_const(packet))) + returns #BT_TRUE. +@pre + bt_stream_class_borrow_default_clock_class_const(bt_stream_borrow_class_const(bt_packet_borrow_stream_const(packet))) + does \em not return \c NULL. +@pre + The \ref api-tir-pkt-prop-ctx "context field" of \bt_p{packet}, if + any, and all its contained \bt_p_field, recursively, are set. + +@bt_post_success_frozen{event_class} +@bt_post_success_frozen{stream} +*/ +extern +bt_message *bt_message_event_create_with_packet_and_default_clock_snapshot( + bt_self_message_iterator *self_message_iterator, + const bt_event_class *event_class, + const bt_packet *packet, uint64_t clock_snapshot_value); + +/*! +@brief + Borrows the \bt_ev of the \bt_ev_msg \bt_p{message}. + +See the \ref api-msg-ev-prop-ev "event" property. + +@param[in] message + Event message from which to borrow the event. + +@returns + @parblock + \em Borrowed reference of the event of \bt_p{message}. + + The returned pointer remains valid as long as \bt_p{message} exists. + @endparblock + +@bt_pre_not_null{message} +@bt_pre_is_ev_msg{message} + +@sa bt_message_event_borrow_event_const() — + \c const version of this function. +*/ +extern bt_event *bt_message_event_borrow_event( + bt_message *message); + +/*! +@brief + Borrows the \bt_ev of the \bt_ev_msg \bt_p{message} + (\c const version). + +See bt_message_event_borrow_event(). +*/ +extern const bt_event *bt_message_event_borrow_event_const( + const bt_message *message); + +/*! +@brief + Borrows the default \bt_cs of the \bt_ev_msg \bt_p{message}. + +See the \ref api-msg-ev-prop-cs "default clock snapshot" property. + +@param[in] message + Event message from which to borrow the default clock snapshot. + +@returns + Default clock snapshot of \bt_p{message}. + +@bt_pre_not_null{message} +@bt_pre_is_ev_msg{message} +@pre + The \bt_stream_cls of \bt_p{message} has a + \ref api-tir-stream-cls-prop-def-clock-cls "default clock class". +*/ +extern const bt_clock_snapshot * +bt_message_event_borrow_default_clock_snapshot_const(const bt_message *message); + +/*! +@brief + Borrows the default \bt_clock_cls of the \bt_stream_cls + of the \bt_ev_msg \bt_p{message}. + +See the stream class's +\ref api-tir-stream-cls-prop-def-clock-cls "default clock class" +property. + +This is a helper which is equivalent to + +@code +bt_stream_class_borrow_default_clock_class_const( + bt_stream_borrow_class_const( + bt_event_borrow_stream_const( + bt_message_event_borrow_event_const(message)))) +@endcode + +@param[in] message + Event message from which to borrow its stream's class's + default clock class. + +@returns + \em Borrowed reference of the default clock class of + the stream class of \bt_p{message}, or \c NULL if none. + +@bt_pre_not_null{message} +@bt_pre_is_ev_msg{message} +*/ +extern const bt_clock_class * +bt_message_event_borrow_stream_class_default_clock_class_const( + const bt_message *message); + +/*! @} */ + +/*! +@name Packet beginning message +@{ +*/ + +/*! +@brief + Creates a \bt_pb_msg for the \bt_pkt \bt_p{packet} from the + \bt_msg_iter \bt_p{self_message_iterator}. + +@attention + @parblock + Only use this function if + + @code + bt_stream_class_packets_have_beginning_default_clock_snapshot( + bt_stream_borrow_class_const(bt_packet_borrow_stream_const(packet))) + @endcode + + returns #BT_FALSE. + + Otherwise, use + bt_message_packet_beginning_create_with_default_clock_snapshot(). + @endparblock + +On success, the returned packet beginning message has the following +property values: + + + + + +
    Property + Value +
    \ref api-msg-pb-prop-pkt "Packet" + \bt_p{packet} +
    \ref api-msg-pb-prop-cs "Default clock snapshot" + \em None +
    + +@param[in] self_message_iterator + Self message iterator from which to create the packet beginning + message. +@param[in] packet + Packet of which the message to create indicates the beginning. + +@returns + New packet beginning message reference, or \c NULL on memory error. + +@bt_pre_not_null{self_message_iterator} +@bt_pre_not_null{packet} +@pre + bt_stream_class_packets_have_beginning_default_clock_snapshot() + returns #BT_FALSE for + bt_stream_borrow_class_const(bt_packet_borrow_stream_const(packet)). +@pre + The \ref api-tir-pkt-prop-ctx "context field" of \bt_p{packet}, if + any, and all its contained \bt_p_field, recursively, are set. + +@bt_post_success_frozen{packet} +*/ +extern +bt_message *bt_message_packet_beginning_create( + bt_self_message_iterator *self_message_iterator, + const bt_packet *packet); + +/*! +@brief + Creates a \bt_pb_msg having a default \bt_cs with the value + \bt_p{clock_snapshot_value} for the \bt_pkt \bt_p{packet} from the + \bt_msg_iter \bt_p{self_message_iterator}. + +@attention + @parblock + Only use this function if + + @code + bt_stream_class_packets_have_beginning_default_clock_snapshot( + bt_stream_borrow_class_const(bt_packet_borrow_stream_const(packet))) + @endcode + + returns #BT_TRUE. + + Otherwise, use + bt_message_packet_beginning_create(). + @endparblock + +On success, the returned packet beginning message has the following +property values: + + + + + +
    Property + Value +
    \ref api-msg-pb-prop-pkt "Packet" + \bt_p{packet} +
    \ref api-msg-pb-prop-cs "Default clock snapshot" + \bt_c_cs with the value \bt_p{clock_snapshot_value}. +
    + +@param[in] self_message_iterator + Self message iterator from which to create the packet beginning + message. +@param[in] packet + Packet of which the message to create indicates the beginning. +@param[in] clock_snapshot_value + Value (clock cycles) of the default clock snapshot of + \bt_p{message}. + +@returns + New packet beginning message reference, or \c NULL on memory error. + +@bt_pre_not_null{self_message_iterator} +@bt_pre_not_null{packet} +@pre + bt_stream_class_packets_have_beginning_default_clock_snapshot() + returns #BT_TRUE for + bt_stream_borrow_class_const(bt_packet_borrow_stream_const(packet)). +@pre + The \ref api-tir-pkt-prop-ctx "context field" of \bt_p{packet}, if + any, and all its contained \bt_p_field, recursively, are set. + +@bt_post_success_frozen{packet} +*/ +extern +bt_message *bt_message_packet_beginning_create_with_default_clock_snapshot( + bt_self_message_iterator *self_message_iterator, + const bt_packet *packet, uint64_t clock_snapshot_value); + +/*! +@brief + Borrows the \bt_pkt of the \bt_pb_msg \bt_p{message}. + +See the \ref api-msg-pb-prop-pkt "packet" property. + +@param[in] message + Packet beginning message from which to borrow the packet. + +@returns + @parblock + \em Borrowed reference of the packet of \bt_p{message}. + + The returned pointer remains valid as long as \bt_p{message} exists. + @endparblock + +@bt_pre_not_null{message} +@bt_pre_is_pb_msg{message} + +@sa bt_message_packet_beginning_borrow_packet_const() — + \c const version of this function. +*/ +extern bt_packet *bt_message_packet_beginning_borrow_packet( + bt_message *message); + +/*! +@brief + Borrows the \bt_pkt of the \bt_pb_msg \bt_p{message} + (\c const version). + +See bt_message_packet_beginning_borrow_packet(). +*/ +extern const bt_packet *bt_message_packet_beginning_borrow_packet_const( + const bt_message *message); + +/*! +@brief + Borrows the default \bt_cs of the \bt_pb_msg \bt_p{message}. + +See the \ref api-msg-pb-prop-cs "default clock snapshot" property. + +@param[in] message + Packet beginning message from which to borrow the default clock + snapshot. + +@returns + Default clock snapshot of \bt_p{message}. + +@bt_pre_not_null{message} +@bt_pre_is_pb_msg{message} +@pre + The packets of the \bt_stream_cls of \bt_p{message} + \ref api-tir-stream-cls-prop-pkt-beg-cs "have a beginning default clock snapshot". +*/ +extern const bt_clock_snapshot * +bt_message_packet_beginning_borrow_default_clock_snapshot_const( + const bt_message *message); + +/*! +@brief + Borrows the default \bt_clock_cls of the \bt_stream_cls + of the \bt_pb_msg \bt_p{message}. + +See the stream class's +\ref api-tir-stream-cls-prop-def-clock-cls "default clock class" +property. + +This is a helper which is equivalent to + +@code +bt_stream_class_borrow_default_clock_class_const( + bt_stream_borrow_class_const( + bt_packet_borrow_stream_const( + bt_message_packet_beginning_borrow_packet_const(message)))) +@endcode + +@param[in] message + Packet beginning message from which to borrow its stream's class's + default clock class. + +@returns + \em Borrowed reference of the default clock class of + the stream class of \bt_p{message}, or \c NULL if none. + +@bt_pre_not_null{message} +@bt_pre_is_pb_msg{message} +*/ +extern const bt_clock_class * +bt_message_packet_beginning_borrow_stream_class_default_clock_class_const( + const bt_message *message); + +/*! @} */ + +/*! +@name Packet end message +@{ +*/ + +/*! +@brief + Creates a \bt_pe_msg for the \bt_pkt \bt_p{packet} from the + \bt_msg_iter \bt_p{self_message_iterator}. + +@attention + @parblock + Only use this function if + + @code + bt_stream_class_packets_have_end_default_clock_snapshot( + bt_stream_borrow_class_const(bt_packet_borrow_stream_const(packet))) + @endcode + + returns #BT_FALSE. + + Otherwise, use + bt_message_packet_end_create_with_default_clock_snapshot(). + @endparblock + +On success, the returned packet end message has the following +property values: + + + + + +
    Property + Value +
    \ref api-msg-pe-prop-pkt "Packet" + \bt_p{packet} +
    \ref api-msg-pe-prop-cs "Default clock snapshot" + \em None +
    + +@param[in] self_message_iterator + Self message iterator from which to create the packet end message. +@param[in] packet + Packet of which the message to create indicates the end. + +@returns + New packet end message reference, or \c NULL on memory error. + +@bt_pre_not_null{self_message_iterator} +@bt_pre_not_null{packet} +@pre + bt_stream_class_packets_have_end_default_clock_snapshot() + returns #BT_FALSE for + bt_stream_borrow_class_const(bt_packet_borrow_stream_const(packet)). +@pre + The \ref api-tir-pkt-prop-ctx "context field" of \bt_p{packet}, if + any, and all its contained \bt_p_field, recursively, are set. + +@bt_post_success_frozen{packet} +*/ +extern +bt_message *bt_message_packet_end_create( + bt_self_message_iterator *self_message_iterator, + const bt_packet *packet); + +/*! +@brief + Creates a \bt_pe_msg having a default \bt_cs with the value + \bt_p{clock_snapshot_value} for the \bt_pkt \bt_p{packet} from the + \bt_msg_iter \bt_p{self_message_iterator}. + +@attention + @parblock + Only use this function if + + @code + bt_stream_class_packets_have_end_default_clock_snapshot( + bt_stream_borrow_class_const(bt_packet_borrow_stream_const(packet))) + @endcode + + returns #BT_TRUE. + + Otherwise, use + bt_message_packet_end_create(). + @endparblock + +On success, the returned packet end message has the following +property values: + + + + + +
    Property + Value +
    \ref api-msg-pe-prop-pkt "Packet" + \bt_p{packet} +
    \ref api-msg-pe-prop-cs "Default clock snapshot" + \bt_c_cs with the value \bt_p{clock_snapshot_value}. +
    + +@param[in] self_message_iterator + Self message iterator from which to create the packet end + message. +@param[in] packet + Packet of which the message to create indicates the end. +@param[in] clock_snapshot_value + Value (clock cycles) of the default clock snapshot of + \bt_p{message}. + +@returns + New packet end message reference, or \c NULL on memory error. + +@bt_pre_not_null{self_message_iterator} +@bt_pre_not_null{packet} +@pre + bt_stream_class_packets_have_end_default_clock_snapshot() + returns #BT_TRUE for + bt_stream_borrow_class_const(bt_packet_borrow_stream_const(packet)). +@pre + The \ref api-tir-pkt-prop-ctx "context field" of \bt_p{packet}, if + any, and all its contained \bt_p_field, recursively, are set. + +@bt_post_success_frozen{packet} +*/ +extern +bt_message *bt_message_packet_end_create_with_default_clock_snapshot( + bt_self_message_iterator *self_message_iterator, + const bt_packet *packet, uint64_t clock_snapshot_value); + +/*! +@brief + Borrows the \bt_pkt of the \bt_pe_msg \bt_p{message}. + +See the \ref api-msg-pe-prop-pkt "packet" property. + +@param[in] message + Packet end message from which to borrow the packet. + +@returns + @parblock + \em Borrowed reference of the packet of \bt_p{message}. + + The returned pointer remains valid as long as \bt_p{message} exists. + @endparblock + +@bt_pre_not_null{message} +@bt_pre_is_pe_msg{message} + +@sa bt_message_packet_end_borrow_packet_const() — + \c const version of this function. +*/ +extern bt_packet *bt_message_packet_end_borrow_packet( + bt_message *message); + +/*! +@brief + Borrows the \bt_pkt of the \bt_pe_msg \bt_p{message} + (\c const version). + +See bt_message_packet_end_borrow_packet(). +*/ +extern const bt_packet *bt_message_packet_end_borrow_packet_const( + const bt_message *message); + +/*! +@brief + Borrows the default \bt_cs of the \bt_pe_msg \bt_p{message}. + +See the \ref api-msg-pe-prop-cs "default clock snapshot" property. + +@param[in] message + Packet end message from which to borrow the default clock + snapshot. + +@returns + Default clock snapshot of \bt_p{message}. + +@bt_pre_not_null{message} +@bt_pre_is_pe_msg{message} +@pre + The packets of the \bt_stream_cls of \bt_p{message} + \ref api-tir-stream-cls-prop-pkt-end-cs "have an end default clock snapshot". +*/ +extern const bt_clock_snapshot * +bt_message_packet_end_borrow_default_clock_snapshot_const( + const bt_message *message); + +/*! +@brief + Borrows the default \bt_clock_cls of the \bt_stream_cls + of the \bt_pe_msg \bt_p{message}. + +See the stream class's +\ref api-tir-stream-cls-prop-def-clock-cls "default clock class" +property. + +This is a helper which is equivalent to + +@code +bt_stream_class_borrow_default_clock_class_const( + bt_stream_borrow_class_const( + bt_packet_borrow_stream_const( + bt_message_packet_end_borrow_packet_const(message)))) +@endcode + +@param[in] message + Packet end message from which to borrow its stream's class's + default clock class. + +@returns + \em Borrowed reference of the default clock class of + the stream class of \bt_p{message}, or \c NULL if none. + +@bt_pre_not_null{message} +@bt_pre_is_pe_msg{message} +*/ +extern const bt_clock_class * +bt_message_packet_end_borrow_stream_class_default_clock_class_const( + const bt_message *message); + +/*! @} */ + +/*! +@name Discarded events message +@{ +*/ + +/*! +@brief + Creates a \bt_disc_ev_msg for the \bt_stream \bt_p{stream} from the + \bt_msg_iter \bt_p{self_message_iterator}. + +@attention + @parblock + Only use this function if + + @code + bt_stream_class_discarded_events_have_default_clock_snapshots( + bt_stream_borrow_class_const(stream)) + @endcode + + returns #BT_FALSE. + + Otherwise, use + bt_message_discarded_events_create_with_default_clock_snapshots(). + @endparblock + +On success, the returned discarded events message has the following +property values: + + + + + + + +
    Property + Value +
    \ref api-msg-disc-ev-prop-stream "Stream" + \bt_p{stream} +
    \ref api-msg-disc-ev-prop-cs-beg "Beginning default clock snapshot" + \em None +
    \ref api-msg-disc-ev-prop-cs-end "End default clock snapshot" + \em None +
    \ref api-msg-disc-ev-prop-count "Discarded event count" + \em None +
    + +@param[in] self_message_iterator + Self message iterator from which to create the discarded events + message. +@param[in] stream + Stream from which the events were discarded. + +@returns + New discarded events message reference, or \c NULL on memory error. + +@bt_pre_not_null{self_message_iterator} +@bt_pre_not_null{stream} +@pre + bt_stream_class_discarded_events_have_default_clock_snapshots(bt_stream_borrow_class_const(stream)) + returns #BT_FALSE. + +@bt_post_success_frozen{stream} +*/ +extern bt_message *bt_message_discarded_events_create( + bt_self_message_iterator *self_message_iterator, + const bt_stream *stream); + +/*! +@brief + Creates a \bt_disc_ev_msg having the beginning and end default + \bt_p_cs with the values \bt_p{beginning_clock_snapshot_value} and + \bt_p{end_clock_snapshot_value} for the \bt_stream \bt_p{stream} + from the \bt_msg_iter \bt_p{self_message_iterator}. + +@attention + @parblock + Only use this function if + + @code + bt_stream_class_discarded_events_have_default_clock_snapshots( + bt_stream_borrow_class_const(stream)) + @endcode + + returns #BT_TRUE. + + Otherwise, use + bt_message_discarded_events_create(). + @endparblock + +On success, the returned discarded events message has the following +property values: + + + + + + + +
    Property + Value +
    \ref api-msg-disc-ev-prop-stream "Stream" + \bt_p{stream} +
    \ref api-msg-disc-ev-prop-cs-beg "Beginning default clock snapshot" + \bt_c_cs with the value \bt_p{beginning_clock_snapshot_value}. +
    \ref api-msg-disc-ev-prop-cs-end "End default clock snapshot" + \bt_c_cs with the value \bt_p{end_clock_snapshot_value}. +
    \ref api-msg-disc-ev-prop-count "Discarded event count" + \em None +
    + +@param[in] self_message_iterator + Self message iterator from which to create the discarded events + message. +@param[in] stream + Stream from which the events were discarded. +@param[in] beginning_clock_snapshot_value + Value (clock cycles) of the beginning default clock snapshot of + \bt_p{message}. +@param[in] end_clock_snapshot_value + Value (clock cycles) of the end default clock snapshot of + \bt_p{message}. + +@returns + New discarded events message reference, or \c NULL on memory error. + +@bt_pre_not_null{self_message_iterator} +@bt_pre_not_null{stream} +@pre + bt_stream_class_discarded_events_have_default_clock_snapshots(bt_stream_borrow_class_const(stream)) + returns #BT_TRUE. + +@bt_post_success_frozen{stream} +*/ +extern bt_message *bt_message_discarded_events_create_with_default_clock_snapshots( + bt_self_message_iterator *self_message_iterator, + const bt_stream *stream, + uint64_t beginning_clock_snapshot_value, + uint64_t end_clock_snapshot_value); + +/*! +@brief + Borrows the \bt_stream of the \bt_disc_ev_msg \bt_p{message}. + +See the \ref api-msg-disc-ev-prop-stream "stream" property. + +@param[in] message + Discarded events message from which to borrow the stream. + +@returns + @parblock + \em Borrowed reference of the stream of \bt_p{message}. + + The returned pointer remains valid as long as \bt_p{message} exists. + @endparblock + +@bt_pre_not_null{message} +@bt_pre_is_disc_ev_msg{message} + +@sa bt_message_discarded_events_borrow_stream_const() — + \c const version of this function. +*/ +extern bt_stream *bt_message_discarded_events_borrow_stream( + bt_message *message); + +/*! +@brief + Borrows the \bt_stream of the \bt_disc_ev_msg \bt_p{message} + (\c const version). + +See bt_message_discarded_events_borrow_stream(). +*/ +extern const bt_stream * +bt_message_discarded_events_borrow_stream_const(const bt_message *message); + +/*! +@brief + Borrows the beginning default \bt_cs of the \bt_disc_ev_msg + \bt_p{message}. + +See the +\ref api-msg-disc-ev-prop-cs-beg "beginning default clock snapshot" +property. + +@param[in] message + Discarded events message from which to borrow the beginning default + clock snapshot. + +@returns + Beginning default clock snapshot of \bt_p{message}. + +@bt_pre_not_null{message} +@bt_pre_is_disc_ev_msg{message} +@pre + The discarded packets messages of the \bt_stream_cls of + \bt_p{message} + \ref api-tir-stream-cls-prop-disc-pkt-cs "have default clock snapshots". +*/ +extern const bt_clock_snapshot * +bt_message_discarded_events_borrow_beginning_default_clock_snapshot_const( + const bt_message *message); + +/*! +@brief + Borrows the end default \bt_cs of the \bt_disc_ev_msg + \bt_p{message}. + +See the +\ref api-msg-disc-ev-prop-cs-end "end default clock snapshot" +property. + +@param[in] message + Discarded events message from which to borrow the end default clock + snapshot. + +@returns + End default clock snapshot of \bt_p{message}. + +@bt_pre_not_null{message} +@bt_pre_is_disc_ev_msg{message} +@pre + The discarded packets messages of the \bt_stream_cls of + \bt_p{message} + \ref api-tir-stream-cls-prop-disc-pkt-cs "have default clock snapshots". +*/ +extern const bt_clock_snapshot * +bt_message_discarded_events_borrow_end_default_clock_snapshot_const( + const bt_message *message); + +/*! +@brief + Borrows the default \bt_clock_cls of the \bt_stream_cls + of the \bt_disc_ev_msg \bt_p{message}. + +See the stream class's +\ref api-tir-stream-cls-prop-def-clock-cls "default clock class" +property. + +This is a helper which is equivalent to + +@code +bt_stream_class_borrow_default_clock_class_const( + bt_stream_borrow_class_const( + bt_message_discarded_events_borrow_stream_const(message))) +@endcode + +@param[in] message + Discarded events message from which to borrow its stream's class's + default clock class. + +@returns + \em Borrowed reference of the default clock class of + the stream class of \bt_p{message}, or \c NULL if none. + +@bt_pre_not_null{message} +@bt_pre_is_disc_ev_msg{message} +*/ +extern const bt_clock_class * +bt_message_discarded_events_borrow_stream_class_default_clock_class_const( + const bt_message *message); + +/*! +@brief + Sets the number of discarded events of the \bt_disc_ev_msg + \bt_p{message} to \bt_p{count}. + +See the \ref api-msg-disc-ev-prop-count "discarded event count" +property. + +@param[in] message + Discarded events message of which to set the number of discarded + events to \bt_p{count}. +@param[in] count + New number of discarded events of \bt_p{message}. + +@bt_pre_not_null{message} +@bt_pre_hot{message} +@bt_pre_is_disc_ev_msg{message} + +@sa bt_message_discarded_events_get_count() — + Returns the number of discarded events of a discarded events + message. +*/ +extern void bt_message_discarded_events_set_count(bt_message *message, + uint64_t count); + +/*! +@brief + Returns the number of discarded events of the \bt_disc_ev_msg + \bt_p{message}. + +See the \ref api-msg-disc-ev-prop-count "discarded event count" +property. + +@param[in] message + Discarded events message of which to get the number of discarded + events. +@param[out] count + If this function returns + #BT_PROPERTY_AVAILABILITY_AVAILABLE, \bt_p{*count} is + the number of discarded events of \bt_p{message}. + +@retval #BT_PROPERTY_AVAILABILITY_AVAILABLE + The number of discarded events of \bt_p{message} is available. +@retval #BT_PROPERTY_AVAILABILITY_NOT_AVAILABLE + The number of discarded events of \bt_p{message} is not available. + +@bt_pre_not_null{message} +@bt_pre_is_disc_ev_msg{message} +@bt_pre_not_null{count} + +@sa bt_message_discarded_events_set_count() — + Sets the number of discarded events of a discarded events message. +*/ +extern bt_property_availability bt_message_discarded_events_get_count( + const bt_message *message, uint64_t *count); + +/*! @} */ + +/*! +@name Discarded packets message +@{ +*/ + +/*! +@brief + Creates a \bt_disc_pkt_msg for the \bt_stream \bt_p{stream} from the + \bt_msg_iter \bt_p{self_message_iterator}. + +@attention + @parblock + Only use this function if + + @code + bt_stream_class_discarded_packets_have_default_clock_snapshots( + bt_stream_borrow_class_const(stream)) + @endcode + + returns #BT_FALSE. + + Otherwise, use + bt_message_discarded_packets_create_with_default_clock_snapshots(). + @endparblock + +On success, the returned discarded packets message has the following +property values: + + + + + + + +
    Property + Value +
    \ref api-msg-disc-pkt-prop-stream "Stream" + \bt_p{stream} +
    \ref api-msg-disc-pkt-prop-cs-beg "Beginning default clock snapshot" + \em None +
    \ref api-msg-disc-pkt-prop-cs-end "End default clock snapshot" + \em None +
    \ref api-msg-disc-pkt-prop-count "Discarded packet count" + \em None +
    + +@param[in] self_message_iterator + Self message iterator from which to create the discarded packets + message. +@param[in] stream + Stream from which the packets were discarded. + +@returns + New discarded packets message reference, or \c NULL on memory error. + +@bt_pre_not_null{self_message_iterator} +@bt_pre_not_null{stream} +@pre + bt_stream_class_discarded_packets_have_default_clock_snapshots(bt_stream_borrow_class_const(stream)) + returns #BT_FALSE. + +@bt_post_success_frozen{stream} +*/ +extern bt_message *bt_message_discarded_packets_create( + bt_self_message_iterator *self_message_iterator, + const bt_stream *stream); + +/*! +@brief + Creates a \bt_disc_pkt_msg having the beginning and end default + \bt_p_cs with the values \bt_p{beginning_clock_snapshot_value} and + \bt_p{end_clock_snapshot_value} for the \bt_stream \bt_p{stream} + from the \bt_msg_iter \bt_p{self_message_iterator}. + +@attention + @parblock + Only use this function if + + @code + bt_stream_class_discarded_packets_have_default_clock_snapshots( + bt_stream_borrow_class_const(stream)) + @endcode + + returns #BT_TRUE. + + Otherwise, use + bt_message_discarded_packets_create(). + @endparblock + +On success, the returned discarded packets message has the following +property values: + + + + + + + +
    Property + Value +
    \ref api-msg-disc-pkt-prop-stream "Stream" + \bt_p{stream} +
    \ref api-msg-disc-pkt-prop-cs-beg "Beginning default clock snapshot" + \bt_c_cs with the value \bt_p{beginning_clock_snapshot_value}. +
    \ref api-msg-disc-pkt-prop-cs-end "End default clock snapshot" + \bt_c_cs with the value \bt_p{end_clock_snapshot_value}. +
    \ref api-msg-disc-pkt-prop-count "Discarded packet count" + \em None +
    + +@param[in] self_message_iterator + Self message iterator from which to create the discarded packets + message. +@param[in] stream + Stream from which the packets were discarded. +@param[in] beginning_clock_snapshot_value + Value (clock cycles) of the beginning default clock snapshot of + \bt_p{message}. +@param[in] end_clock_snapshot_value + Value (clock cycles) of the end default clock snapshot of + \bt_p{message}. + +@returns + New discarded packets message reference, or \c NULL on memory error. + +@bt_pre_not_null{self_message_iterator} +@bt_pre_not_null{stream} +@pre + bt_stream_class_discarded_packets_have_default_clock_snapshots(bt_stream_borrow_class_const(stream)) + returns #BT_TRUE. + +@bt_post_success_frozen{stream} +*/ +extern bt_message *bt_message_discarded_packets_create_with_default_clock_snapshots( + bt_self_message_iterator *self_message_iterator, + const bt_stream *stream, uint64_t beginning_clock_snapshot_value, + uint64_t end_clock_snapshot_value); + +/*! +@brief + Borrows the \bt_stream of the \bt_disc_pkt_msg \bt_p{message}. + +See the \ref api-msg-disc-ev-prop-stream "stream" property. + +@param[in] message + Discarded packets message from which to borrow the stream. + +@returns + @parblock + \em Borrowed reference of the stream of \bt_p{message}. + + The returned pointer remains valid as long as \bt_p{message} exists. + @endparblock + +@bt_pre_not_null{message} +@bt_pre_is_disc_pkt_msg{message} + +@sa bt_message_discarded_packets_borrow_stream_const() — + \c const version of this function. +*/ +extern bt_stream *bt_message_discarded_packets_borrow_stream( + bt_message *message); + +/*! +@brief + Borrows the \bt_stream of the \bt_disc_pkt_msg \bt_p{message} + (\c const version). + +See bt_message_discarded_packets_borrow_stream(). +*/ +extern const bt_stream * +bt_message_discarded_packets_borrow_stream_const(const bt_message *message); + +/*! +@brief + Borrows the beginning default \bt_cs of the \bt_disc_pkt_msg + \bt_p{message}. + +See the +\ref api-msg-disc-pkt-prop-cs-beg "beginning default clock snapshot" +property. + +@param[in] message + Discarded packets message from which to borrow the beginning default + clock snapshot. + +@returns + Beginning default clock snapshot of \bt_p{message}. + +@bt_pre_not_null{message} +@bt_pre_is_disc_pkt_msg{message} +@pre + The discarded packets messages of the \bt_stream_cls of + \bt_p{message} + \ref api-tir-stream-cls-prop-disc-pkt-cs "have default clock snapshots". +*/ +extern const bt_clock_snapshot * +bt_message_discarded_packets_borrow_beginning_default_clock_snapshot_const( + const bt_message *message); + +/*! +@brief + Borrows the end default \bt_cs of the \bt_disc_pkt_msg + \bt_p{message}. + +See the +\ref api-msg-disc-pkt-prop-cs-end "end default clock snapshot" +property. + +@param[in] message + Discarded packets message from which to borrow the end default clock + snapshot. + +@returns + End default clock snapshot of \bt_p{message}. + +@bt_pre_not_null{message} +@bt_pre_is_disc_pkt_msg{message} +@pre + The discarded packets messages of the \bt_stream_cls of + \bt_p{message} + \ref api-tir-stream-cls-prop-disc-pkt-cs "have default clock snapshots". +*/ +extern const bt_clock_snapshot * +bt_message_discarded_packets_borrow_end_default_clock_snapshot_const( + const bt_message *message); + +/*! +@brief + Borrows the default \bt_clock_cls of the \bt_stream_cls + of the \bt_disc_pkt_msg \bt_p{message}. + +See the stream class's +\ref api-tir-stream-cls-prop-def-clock-cls "default clock class" +property. + +This is a helper which is equivalent to + +@code +bt_stream_class_borrow_default_clock_class_const( + bt_stream_borrow_class_const( + bt_message_discarded_packets_borrow_stream_const(message))) +@endcode + +@param[in] message + Discarded packets message from which to borrow its stream's class's + default clock class. + +@returns + \em Borrowed reference of the default clock class of + the stream class of \bt_p{message}, or \c NULL if none. + +@bt_pre_not_null{message} +@bt_pre_is_disc_pkt_msg{message} +*/ +extern const bt_clock_class * +bt_message_discarded_packets_borrow_stream_class_default_clock_class_const( + const bt_message *message); + +/*! +@brief + Sets the number of discarded packets of the \bt_disc_pkt_msg + \bt_p{message} to \bt_p{count}. + +See the \ref api-msg-disc-ev-prop-count "discarded packet count" +property. + +@param[in] message + Discarded packets message of which to set the number of discarded + packets to \bt_p{count}. +@param[in] count + New number of discarded packets of \bt_p{message}. + +@bt_pre_not_null{message} +@bt_pre_hot{message} +@bt_pre_is_disc_pkt_msg{message} + +@sa bt_message_discarded_packets_get_count() — + Returns the number of discarded packets of a discarded packets + message. +*/ +extern void bt_message_discarded_packets_set_count(bt_message *message, + uint64_t count); + +/*! +@brief + Returns the number of discarded packets of the \bt_disc_pkt_msg + \bt_p{message}. + +See the \ref api-msg-disc-ev-prop-count "discarded packet count" +property. + +@param[in] message + Discarded packets message of which to get the number of discarded + packets. +@param[out] count + If this function returns + #BT_PROPERTY_AVAILABILITY_AVAILABLE, \bt_p{*count} is + the number of discarded packets of \bt_p{message}. + +@retval #BT_PROPERTY_AVAILABILITY_AVAILABLE + The number of discarded packets of \bt_p{message} is available. +@retval #BT_PROPERTY_AVAILABILITY_NOT_AVAILABLE + The number of discarded packets of \bt_p{message} is not available. + +@bt_pre_not_null{message} +@bt_pre_is_disc_pkt_msg{message} +@bt_pre_not_null{count} + +@sa bt_message_discarded_packets_set_count() — + Sets the number of discarded packets of a discarded packets message. +*/ +extern bt_property_availability bt_message_discarded_packets_get_count( + const bt_message *message, uint64_t *count); + +/*! @} */ + +/*! +@name Message iterator inactivity message +@{ +*/ + +/*! +@brief + Creates a \bt_inac_msg having a \bt_cs of a fictitious instance of + the \bt_clock_cls \bt_p{clock_class} with the value + \bt_p{clock_snapshot_value} from the \bt_msg_iter + \bt_p{self_message_iterator}. + +On success, the returned message iterator inactivity message has the +following property values: + + + + +
    Property + Value +
    \ref api-msg-inac-prop-cs "Clock snapshot" + + \bt_c_cs (snapshot of a fictitious instance of \bt_p{clock_class}) + with the value \bt_p{clock_snapshot_value}. +
    + +@param[in] self_message_iterator + Self message iterator from which to create the message iterator + inactivity message. +@param[in] clock_class + Class of the fictitious instance of which + \bt_p{clock_snapshot_value} is the value of its snapshot. +@param[in] clock_snapshot_value + Value (clock cycles) of the clock snapshot of \bt_p{message}. + +@returns + New message iterator inactivity message reference, or \c NULL on + memory error. + +@bt_pre_not_null{self_message_iterator} +@bt_pre_not_null{clock_class} + +@bt_post_success_frozen{clock_class} +*/ +extern +bt_message *bt_message_message_iterator_inactivity_create( + bt_self_message_iterator *self_message_iterator, + const bt_clock_class *clock_class, + uint64_t clock_snapshot_value); + +/*! +@brief + Borrows the \bt_cs of the \bt_inac_msg \bt_p{message}. + +See the \ref api-msg-inac-prop-cs "clock snapshot" property. + +@param[in] message + Message iterator inactivity message from which to borrow the clock + snapshot. + +@returns + Clock snapshot of \bt_p{message}. + +@bt_pre_not_null{message} +@bt_pre_is_inac_msg{message} +*/ +extern const bt_clock_snapshot * +bt_message_message_iterator_inactivity_borrow_clock_snapshot_const( + const bt_message *message); + +/*! @} */ + +/*! +@name Message reference count +@{ +*/ + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the message \bt_p{message}. + +@param[in] message + @parblock + Message of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_message_put_ref() — + Decrements the reference count of a message. +*/ +extern void bt_message_get_ref(const bt_message *message); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the message \bt_p{message}. + +@param[in] message + @parblock + Message of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_message_get_ref() — + Increments the reference count of a message. +*/ +extern void bt_message_put_ref(const bt_message *message); + +/*! +@brief + Decrements the reference count of the message \bt_p{_message}, and + then sets \bt_p{_message} to \c NULL. + +@param _message + @parblock + Message of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_message} +*/ +#define BT_MESSAGE_PUT_REF_AND_RESET(_message) \ + do { \ + bt_message_put_ref(_message); \ + (_message) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the message \bt_p{_dst}, sets + \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} to \c NULL. + +This macro effectively moves a message reference from the expression +\bt_p{_src} to the expression \bt_p{_dst}, putting the existing +\bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_MESSAGE_MOVE_REF(_dst, _src) \ + do { \ + bt_message_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + + +/*! +@name Message Interchange Protocol version +@{ +*/ + +/*! +@brief + Status codes for bt_get_greatest_operative_mip_version(). +*/ +typedef enum bt_get_greatest_operative_mip_version_status { + /*! + @brief + Success. + */ + BT_GET_GREATEST_OPERATIVE_MIP_VERSION_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + No match found. + */ + BT_GET_GREATEST_OPERATIVE_MIP_VERSION_STATUS_NO_MATCH = __BT_FUNC_STATUS_NO_MATCH, + + /*! + @brief + Out of memory. + */ + BT_GET_GREATEST_OPERATIVE_MIP_VERSION_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + Other error. + */ + BT_GET_GREATEST_OPERATIVE_MIP_VERSION_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, +} bt_get_greatest_operative_mip_version_status; + +/*! +@brief + Computes the greatest \bt_mip version which + you can use to create a trace processing \bt_graph to which you + intend to \ref api-graph-lc-add "add components" described by the + component descriptors \bt_p{component_descriptors}, and sets + \bt_p{*mip_version} to the result. + +This function calls the +\link api-comp-cls-dev-meth-mip "get supported MIP versions"\endlink +method for each component descriptor in \bt_p{component_descriptors}, +and then returns the greatest common (operative) MIP version, if any. +The "get supported MIP versions" method receives \bt_p{logging_level} as +its \bt_p{logging_level} parameter. + +If this function does not find an operative MIP version for the +component descriptors of \bt_p{component_descriptors}, it returns +#BT_GET_GREATEST_OPERATIVE_MIP_VERSION_STATUS_NO_MATCH. + +@note + As of \bt_name_version_min_maj, because bt_get_maximal_mip_version() + returns 0, this function always sets \bt_p{*mip_version} to + 0 on success. + +@param[in] component_descriptors + Component descriptors for which to get the supported MIP versions + to compute the greatest operative MIP version. +@param[in] logging_level + Logging level to use when calling the "get supported MIP versions" + method for each component descriptor in + \bt_p{component_descriptors}. +@param[out] mip_version + On success, \bt_p{*mip_version} is the greatest + operative MIP version of all the component descriptors in + \bt_p{component_descriptors}. + +@retval #BT_GET_GREATEST_OPERATIVE_MIP_VERSION_STATUS_OK + Success. +@retval #BT_GET_GREATEST_OPERATIVE_MIP_VERSION_STATUS_NO_MATCH + No operative MIP version exists for the component descriptors of + \bt_p{component_descriptors}. +@retval #BT_GET_GREATEST_OPERATIVE_MIP_VERSION_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_GET_GREATEST_OPERATIVE_MIP_VERSION_STATUS_ERROR + Other error. + +@bt_pre_not_null{component_descriptors} +@pre + \bt_p{component_descriptors} contains one or more component + descriptors. +@bt_pre_not_null{mip_version} +*/ +extern bt_get_greatest_operative_mip_version_status +bt_get_greatest_operative_mip_version( + const bt_component_descriptor_set *component_descriptors, + bt_logging_level logging_level, uint64_t *mip_version); + +/*! +@brief + Returns the maximal available \bt_mip version as of + \bt_name_version_min_maj. + +As of \bt_name_version_min_maj, this function returns +\bt_max_mip_version. + +@returns + Maximal available MIP version (\bt_max_mip_version). +*/ +extern uint64_t bt_get_maximal_mip_version(void); + +/*! @} */ + +/*! @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* BABELTRACE2_GRAPH_MESSAGE_H */ diff --git a/include/babeltrace2/graph/mip.h b/include/babeltrace2/graph/mip.h deleted file mode 100644 index f5da87c5..00000000 --- a/include/babeltrace2/graph/mip.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_MIP_H -#define BABELTRACE2_GRAPH_MIP_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum bt_get_greatest_operative_mip_version_status { - BT_GET_GREATEST_OPERATIVE_MIP_VERSION_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_GET_GREATEST_OPERATIVE_MIP_VERSION_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, - BT_GET_GREATEST_OPERATIVE_MIP_VERSION_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, - BT_GET_GREATEST_OPERATIVE_MIP_VERSION_STATUS_NO_MATCH = __BT_FUNC_STATUS_NO_MATCH, -} bt_get_greatest_operative_mip_version_status; - -extern bt_get_greatest_operative_mip_version_status -bt_get_greatest_operative_mip_version( - const bt_component_descriptor_set *comp_descriptor_set, - bt_logging_level log_level, uint64_t *operative_mip_version); - -extern uint64_t bt_get_maximal_mip_version(void); - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_MIP_H */ diff --git a/include/babeltrace2/graph/port-const.h b/include/babeltrace2/graph/port-const.h deleted file mode 100644 index eda9ccb9..00000000 --- a/include/babeltrace2/graph/port-const.h +++ /dev/null @@ -1,88 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_PORT_CONST_H -#define BABELTRACE2_GRAPH_PORT_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum bt_port_type { - BT_PORT_TYPE_INPUT = 1 << 0, - BT_PORT_TYPE_OUTPUT = 1 << 1, -} bt_port_type; - -extern const char *bt_port_get_name(const bt_port *port); - -extern bt_port_type bt_port_get_type(const bt_port *port); - -extern const bt_connection *bt_port_borrow_connection_const( - const bt_port *port); - -extern const bt_component *bt_port_borrow_component_const( - const bt_port *port); - -extern bt_bool bt_port_is_connected(const bt_port *port); - -static inline -bt_bool bt_port_is_input(const bt_port *port) -{ - return bt_port_get_type(port) == BT_PORT_TYPE_INPUT; -} - -static inline -bt_bool bt_port_is_output(const bt_port *port) -{ - return bt_port_get_type(port) == BT_PORT_TYPE_OUTPUT; -} - -extern void bt_port_get_ref(const bt_port *port); - -extern void bt_port_put_ref(const bt_port *port); - -#define BT_PORT_PUT_REF_AND_RESET(_var) \ - do { \ - bt_port_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_PORT_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_port_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_PORT_CONST_H */ diff --git a/include/babeltrace2/graph/port-input-const.h b/include/babeltrace2/graph/port-input-const.h deleted file mode 100644 index c3eff668..00000000 --- a/include/babeltrace2/graph/port-input-const.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_PORT_INPUT_CONST_H -#define BABELTRACE2_GRAPH_PORT_INPUT_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -static inline -const bt_port *bt_port_input_as_port_const(const bt_port_input *port_input) -{ - return __BT_UPCAST_CONST(bt_port, port_input); -} - -extern void bt_port_input_get_ref(const bt_port_input *port_input); - -extern void bt_port_input_put_ref(const bt_port_input *port_input); - -#define BT_PORT_INPUT_PUT_REF_AND_RESET(_var) \ - do { \ - bt_port_input_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_PORT_INPUT_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_port_input_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_PORT_INPUT_CONST_H */ diff --git a/include/babeltrace2/graph/port-output-const.h b/include/babeltrace2/graph/port-output-const.h deleted file mode 100644 index 6d88926d..00000000 --- a/include/babeltrace2/graph/port-output-const.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_PORT_OUTPUT_CONST_H -#define BABELTRACE2_GRAPH_PORT_OUTPUT_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -static inline -const bt_port *bt_port_output_as_port_const(const bt_port_output *port_output) -{ - return __BT_UPCAST_CONST(bt_port, port_output); -} - -extern void bt_port_output_get_ref(const bt_port_output *port_output); - -extern void bt_port_output_put_ref(const bt_port_output *port_output); - -#define BT_PORT_OUTPUT_PUT_REF_AND_RESET(_var) \ - do { \ - bt_port_output_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_PORT_OUTPUT_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_port_output_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_PORT_OUTPUT_CONST_H */ diff --git a/include/babeltrace2/graph/port.h b/include/babeltrace2/graph/port.h new file mode 100644 index 00000000..5567d04d --- /dev/null +++ b/include/babeltrace2/graph/port.h @@ -0,0 +1,673 @@ +#ifndef BABELTRACE2_GRAPH_PORT_H +#define BABELTRACE2_GRAPH_PORT_H + +/* + * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef __BT_IN_BABELTRACE_H +# error "Please include instead." +#endif + +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*! +@defgroup api-port Ports +@ingroup api-comp + +@brief + \bt_c_comp input and output ports. + +A port is a point of \bt_conn between +\bt_p_comp: + +@image html component-zoom.png + +A port is a \ref api-fund-shared-object "shared object": get a new +reference with bt_port_get_ref() and put an existing reference with +bt_port_put_ref(). + +The common C type of a port is #bt_port. + +There are two types of ports: + +
    +
    \anchor api-port-in Input port
    +
    + Input connection point from which \bt_p_msg are received. + + Filter and sink components have input ports. + + An input port's specific type is #bt_port_input and its type + enumerator is #BT_PORT_TYPE_INPUT. + + \ref api-fund-c-typing "Upcast" the #bt_port_input type to the + #bt_port type with bt_port_input_as_port_const(). + + Get a new input port reference with bt_port_input_get_ref() and put + an existing one with bt_port_input_put_ref(). +
    + +
    \anchor api-port-out Output port
    +
    + Output connection point to which messages are sent. + + Source and filter components have output ports. + + An output port's specific type is #bt_port_output and its type + enumerator is #BT_PORT_TYPE_OUTPUT. + + \ref api-fund-c-typing "Upcast" the #bt_port_output type to the + #bt_port type with bt_port_output_as_port_const(). + + Get a new output port reference with bt_port_output_get_ref() and + put an existing one with bt_port_output_put_ref(). +
    +
    + +Get a port's type enumerator with bt_port_get_type(). You can also use +the bt_port_is_input() and bt_port_is_output() helper functions. + +A \bt_comp can add a port with: + +- bt_self_component_source_add_output_port() +- bt_self_component_filter_add_input_port() +- bt_self_component_filter_add_output_port() +- bt_self_component_sink_add_input_port() + +Borrow a port's \bt_conn, if any, with +bt_port_borrow_connection_const(). + +Borrow the component to which a port belongs with +bt_port_borrow_component_const(). + +

    Properties

    + +A port has the following common properties: + +
    +
    + \anchor api-port-prop-name + Name +
    +
    + Name of the port. + + For a given \bt_comp: + + - Each input port has a unique name. + - Each output port has a unique name. + + A port's name is set when the component adds it; you cannot change + it afterwards. + + Get a port's name with bt_port_get_name(). +
    + +
    + \anchor api-port-prop-is-connected + Is connected? +
    +
    + Whether or not the port is currently connected to another port. + + Get whether or not a port is connected with bt_port_is_connected(). + + When a port is unconnected, bt_port_borrow_connection_const() + returns \c NULL. +
    +
    +*/ + +/*! @{ */ + +/*! +@name Types +@{ + +@typedef struct bt_port bt_port; + +@brief + Port. + +@typedef struct bt_port_input bt_port_input; + +@brief + \bt_c_iport. + +@typedef struct bt_port_output bt_port_output; + +@brief + \bt_c_oport. + +@} +*/ + +/*! +@name Type query +@{ +*/ + +/*! +@brief + Port type enumerators. +*/ +typedef enum bt_port_type { + /*! + @brief + \bt_c_iport. + */ + BT_PORT_TYPE_INPUT = 1 << 0, + + /*! + @brief + \bt_c_oport. + */ + BT_PORT_TYPE_OUTPUT = 1 << 1, +} bt_port_type; + +/*! +@brief + Returns the type enumerator of the port \bt_p{port}. + +@param[in] port + Port of which to get the type enumerator + +@returns + Type enumerator of \bt_p{port}. + +@bt_pre_not_null{port} + +@sa bt_port_is_input() — + Returns whether or not a port is an \bt_iport. +@sa bt_port_is_output() — + Returns whether or not a port is an \bt_oport. +*/ +extern bt_port_type bt_port_get_type(const bt_port *port); + +/*! +@brief + Returns whether or not the port \bt_p{port} is an \bt_iport. + +@param[in] port + Port to check. + +@returns + #BT_TRUE if \bt_p{port} is an input port. + +@bt_pre_not_null{port} + +@sa bt_port_get_type() — + Returns the type enumerator of a port. +*/ +static inline +bt_bool bt_port_is_input(const bt_port *port) +{ + return bt_port_get_type(port) == BT_PORT_TYPE_INPUT; +} + +/*! +@brief + Returns whether or not the port \bt_p{port} is an \bt_oport. + +@param[in] port + Port to check. + +@returns + #BT_TRUE if \bt_p{port} is an output port. + +@bt_pre_not_null{port} + +@sa bt_port_get_type() — + Returns the type enumerator of a port. +*/ +static inline +bt_bool bt_port_is_output(const bt_port *port) +{ + return bt_port_get_type(port) == BT_PORT_TYPE_OUTPUT; +} + +/*! @} */ + +/*! +@name Connection access +@{ +*/ + +/*! +@brief + Borrows the \bt_conn of the port \bt_p{port}. + +This function returns \c NULL if \bt_p{port} is unconnected +(bt_port_is_connected() returns #BT_FALSE). + +@param[in] port + Port of which to borrow the connection. + +@returns + \em Borrowed reference of the connection of \bt_p{port}. + +@bt_pre_not_null{port} +*/ +extern const bt_connection *bt_port_borrow_connection_const( + const bt_port *port); + +/*! @} */ + +/*! +@name Component access +@{ +*/ + +/*! +@brief + Borrows the \bt_comp to which the port \bt_p{port} belongs. + +@param[in] port + Port of which to borrow the component which owns it. + +@returns + \em Borrowed reference of the component which owns \bt_p{port}. + +@bt_pre_not_null{port} +*/ +extern const bt_component *bt_port_borrow_component_const( + const bt_port *port); + +/*! @} */ + +/*! +@name Properties +@{ +*/ + +/*! +@brief + Returns the name of the port \bt_p{port}. + +See the \ref api-port-prop-name "name" property. + +@param[in] port + Port of which to get the name. + +@returns + @parblock + Name of \bt_p{port}, or \c NULL if none. + + The returned pointer remains valid as long as \bt_p{port} exists. + @endparblock + +@bt_pre_not_null{port} +*/ +extern const char *bt_port_get_name(const bt_port *port); + +/*! +@brief + Returns whether or not the port \bt_p{port} is connected. + +See the \ref api-port-prop-is-connected "is connected?" property. + +@param[in] port + Port of which to get whether or not it's connected. + +@returns + #BT_TRUE if \bt_p{port} is connected. + +@bt_pre_not_null{port} +*/ +extern bt_bool bt_port_is_connected(const bt_port *port); + +/*! @} */ + +/*! +@name Reference count (common) +@{ +*/ + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the port \bt_p{port}. + +@param[in] port + @parblock + Port of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_port_put_ref() — + Decrements the reference count of a port. +*/ +extern void bt_port_get_ref(const bt_port *port); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the port \bt_p{port}. + +@param[in] port + @parblock + Port of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_port_get_ref() — + Increments the reference count of a port. +*/ +extern void bt_port_put_ref(const bt_port *port); + +/*! +@brief + Decrements the reference count of the port + \bt_p{_port}, and then sets \bt_p{_port} to \c NULL. + +@param _port + @parblock + Port of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_port} +*/ +#define BT_PORT_PUT_REF_AND_RESET(_port) \ + do { \ + bt_port_put_ref(_port); \ + (_port) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the port \bt_p{_dst}, sets + \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} to \c NULL. + +This macro effectively moves a port reference from the +expression \bt_p{_src} to the expression \bt_p{_dst}, putting the +existing \bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_PORT_MOVE_REF(_dst, _src) \ + do { \ + bt_port_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! +@name Input port +@{ +*/ + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the \bt_iport \bt_p{port} to the + common #bt_port type. + +@param[in] port + @parblock + Input port to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{port} as a common port. +*/ +static inline +const bt_port *bt_port_input_as_port_const(const bt_port_input *port) +{ + return __BT_UPCAST_CONST(bt_port, port); +} + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the \bt_iport \bt_p{port}. + +@param[in] port + @parblock + Input port of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_port_input_put_ref() — + Decrements the reference count of an input port. +*/ +extern void bt_port_input_get_ref(const bt_port_input *port); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the \bt_iport \bt_p{port}. + +@param[in] port + @parblock + Input port of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_port_input_get_ref() — + Increments the reference count of an input port. +*/ +extern void bt_port_input_put_ref(const bt_port_input *port); + +/*! +@brief + Decrements the reference count of the \bt_iport + \bt_p{_port}, and then sets \bt_p{_port} to \c NULL. + +@param _port + @parblock + Input port of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_port} +*/ +#define BT_PORT_INPUT_PUT_REF_AND_RESET(_port) \ + do { \ + bt_port_input_put_ref(_port); \ + (_port) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the \bt_iport \bt_p{_dst}, sets + \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} to \c NULL. + +This macro effectively moves an \bt_iport reference from the +expression \bt_p{_src} to the expression \bt_p{_dst}, putting the +existing \bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_PORT_INPUT_MOVE_REF(_dst, _src) \ + do { \ + bt_port_input_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! +@name Output port +@{ +*/ + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the \bt_oport \bt_p{port} to the + common #bt_port type. + +@param[in] port + @parblock + Output port to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{port} as a common port. +*/ +static inline +const bt_port *bt_port_output_as_port_const(const bt_port_output *port) +{ + return __BT_UPCAST_CONST(bt_port, port); +} + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the \bt_oport \bt_p{port}. + +@param[in] port + @parblock + Output port of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_port_output_put_ref() — + Decrements the reference count of a \bt_oport. +*/ +extern void bt_port_output_get_ref(const bt_port_output *port); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the \bt_oport \bt_p{port}. + +@param[in] port + @parblock + Output port of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_port_output_get_ref() — + Increments the reference count of a \bt_oport. +*/ +extern void bt_port_output_put_ref(const bt_port_output *port); + +/*! +@brief + Decrements the reference count of the \bt_oport + \bt_p{_port}, and then sets \bt_p{_port} to \c NULL. + +@param _port + @parblock + Output port of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_port} +*/ +#define BT_PORT_OUTPUT_PUT_REF_AND_RESET(_port) \ + do { \ + bt_port_output_put_ref(_port); \ + (_port) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the \bt_oport \bt_p{_dst}, sets + \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} to \c NULL. + +This macro effectively moves an \bt_oport reference from the +expression \bt_p{_src} to the expression \bt_p{_dst}, putting the +existing \bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_PORT_OUTPUT_MOVE_REF(_dst, _src) \ + do { \ + bt_port_output_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* BABELTRACE2_GRAPH_PORT_H */ diff --git a/include/babeltrace2/graph/private-query-executor.h b/include/babeltrace2/graph/private-query-executor.h index 348d30d4..79b1f5f8 100644 --- a/include/babeltrace2/graph/private-query-executor.h +++ b/include/babeltrace2/graph/private-query-executor.h @@ -33,6 +33,63 @@ extern "C" { #endif +/*! +@defgroup api-priv-qexec Private query executor +@ingroup api-comp-cls-dev + +@brief + Private view of a \bt_qexec for a \bt_comp_cls + \ref api-comp-cls-dev-meth-query "query method". + +A private query executor is a private view, +from within a \bt_comp_cls +\ref api-comp-cls-dev-meth-query "query method", of a +\bt_qexec. + +A query method receives a private query executor as its +\bt_p{query_executor} parameter. + +As of \bt_name_version_min_maj, this module only offers the +bt_private_query_executor_as_query_executor_const() function to +\ref api-fund-c-typing "upcast" a private query executor to a +\c const query executor. You need this to get the query executor's +\ref api-qexec-prop-log-lvl "logging level". +*/ + +/*! @{ */ + +/*! +@name Type +@{ + +@typedef struct bt_private_query_executor bt_private_query_executor; + +@brief + Private query executor. + +@} +*/ + +/*! +@name Upcast +@{ +*/ + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the private query executor + \bt_p{query_executor} to the public #bt_query_executor type. + +@param[in] query_executor + @parblock + Private query executor to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{query_executor} as a public query executor. +*/ static inline const bt_query_executor * bt_private_query_executor_as_query_executor_const( @@ -41,6 +98,10 @@ bt_private_query_executor_as_query_executor_const( return __BT_UPCAST_CONST(bt_query_executor, query_executor); } +/*! @} */ + +/*! @} */ + #ifdef __cplusplus } #endif diff --git a/include/babeltrace2/graph/query-executor-const.h b/include/babeltrace2/graph/query-executor-const.h deleted file mode 100644 index a857ed70..00000000 --- a/include/babeltrace2/graph/query-executor-const.h +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_QUERY_EXECUTOR_CONST_H -#define BABELTRACE2_GRAPH_QUERY_EXECUTOR_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern bt_bool bt_query_executor_is_interrupted( - const bt_query_executor *query_executor); - -extern bt_logging_level bt_query_executor_get_logging_level( - const bt_query_executor *query_executor); - -extern void bt_query_executor_get_ref(const bt_query_executor *query_executor); - -extern void bt_query_executor_put_ref(const bt_query_executor *query_executor); - -#define BT_QUERY_EXECUTOR_PUT_REF_AND_RESET(_var) \ - do { \ - bt_query_executor_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_QUERY_EXECUTOR_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_query_executor_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_QUERY_EXECUTOR_CONST_H */ diff --git a/include/babeltrace2/graph/query-executor.h b/include/babeltrace2/graph/query-executor.h index c393e6ec..a3d1c637 100644 --- a/include/babeltrace2/graph/query-executor.h +++ b/include/babeltrace2/graph/query-executor.h @@ -34,47 +34,547 @@ extern "C" { #endif +/*! +@defgroup api-qexec Query executor +@ingroup api-graph + +@brief + Executor of \bt_comp_cls object queries. + +A query executor is an executor of +\bt_comp_cls object queries. + +A component class can implement a query method to offer one or more +\em objects depending on the query parameters. + +Both the query parameters and the returned objects are \bt_p_val. + +The query operation feature exists so that you can get benefit from a +component class's implementation to get information about a trace, a +stream, a distant server, and so on. For example, the +source.ctf.lttng-live component class (see +\bt_man{babeltrace2-source.ctf.lttng-live,7}) offers the \c sessions +object to list the available +LTTng live +tracing session names and other properties. + +The semantics of the query parameters and the returned object are +completely defined by the component class implementation: the library +does not enforce or suggest any layout. The best way to know which +objects you can query from a component class, what are the expected and +optional parameters, and what the returned object contains is to read +this component class's documentation. + +The purpose of the query executor itself is to keep some state for a +specific query operation. For example, you can set a query executor's +logging level with bt_query_executor_set_logging_level(); then a +component class's query method can get the executor's current logging +level with bt_query_executor_get_logging_level(). + +Also, the query executor is an interruptible object: a long or blocking +query operation can run, checking whether the executor is interrupted +periodically, while another thread or a signal handler can interrupt the +executor. + +A query executor is a +\ref api-fund-shared-object "shared object": get a new reference with +bt_query_executor_get_ref() and put an existing reference with +bt_query_executor_put_ref(). + +The type of a query executor is #bt_query_executor. + +Create a query executor with bt_query_executor_create() or +bt_query_executor_create_with_method_data(). When you do so, you set the +name of the object to query, from which component class to query the +object, and what are the query parameters. You cannot change those +properties once the query executor is created. With +bt_query_executor_create_with_method_data(), you can also pass +a custom, \bt_voidp pointer to the component class's +query method. + +Perform a query operation with bt_query_executor_query(). This function +can return #BT_QUERY_EXECUTOR_QUERY_STATUS_AGAIN, in which case you can +try to perform a query operation again later. It can also return +#BT_QUERY_EXECUTOR_QUERY_STATUS_UNKNOWN_OBJECT, which means the +component class does not offer the requested object. + +To interrupt a running query operation, either: + +- Borrow the query executor's default \bt_intr with + bt_query_executor_borrow_default_interrupter() and set it with + bt_interrupter_set(). + + When you call bt_query_executor_create() or + bt_query_executor_create_with_method_data(), the returned query + executor has a default interrupter. + +- Add your own interrupter with bt_query_executor_add_interrupter() + \em before you perform the query operation with + bt_query_executor_query(). + + Then, set the interrupter with bt_interrupter_set(). + +

    Property

    + +A query executor has the following property: + +
    +
    + \anchor api-qexec-prop-log-lvl + Logging level +
    +
    + Logging level of the query executor's query operations. + + Use bt_query_executor_set_logging_level() and + bt_query_executor_get_logging_level(). +
    +
    +*/ + +/*! @{ */ + +/*! +@name Type +@{ + +@typedef struct bt_query_executor bt_query_executor; + +@brief + Query executor. + +@} +*/ + +/*! +@name Creation +@{ +*/ + +/*! +@brief + Alias of bt_query_executor_create_with_method_data() + with the \bt_p{method_data} parameter set to \c NULL. +*/ extern bt_query_executor *bt_query_executor_create( - const bt_component_class *component_class, const char *object, - const bt_value *params); + const bt_component_class *component_class, + const char *object_name, const bt_value *params); + +/*! +@brief + Creates a query executor to query the object named + \bt_p{object_name} from the \bt_comp_cls \bt_p{component_class} with + the parameters \bt_p{params} and the query user data + \bt_p{method_data}. + +When you call bt_query_executor_query() with the returned query +executor, the query method of \bt_p{component_class} receives: + +- \bt_p{object_name} as its own \bt_p{object_name} parameter. +- \bt_p{params} as its own \bt_p{params} parameter + (or #bt_value_null if \bt_p{params} is \c NULL). + +- \bt_p{method_data} as its own \bt_p{method_data} parameter. + +@param[in] component_class + Component class from which to query the object named + \bt_p{object_name}. +@param[in] object_name + Name of the object to query from \bt_p{component_class}. +@param[in] params + @parblock + Parameters for the query operation performed by the query executor + to create. + + Unlike the \bt_p{params} parameter of + the bt_graph_add_*_component_*_port_added_listener() + functions (see \ref api-graph), this parameter does not need to + be a \bt_map_val. + + Can be \c NULL (equivalent to passing #bt_value_null). + @endparblock +@param[in] method_data + User data passed as is to the query method of \bt_p{component_class} + when you call bt_query_executor_query(). + +@returns + New query executor reference, or \c NULL on memory error. + +@bt_pre_not_null{component_class} +@bt_pre_not_null{object} + +@bt_post_success_frozen{component_class} +@bt_post_success_frozen{params} +*/ extern bt_query_executor *bt_query_executor_create_with_method_data( - const bt_component_class *component_class, const char *object, - const bt_value *params, void *method_data); + const bt_component_class *component_class, + const char *object_name, const bt_value *params, + void *method_data); + +/*! @} */ +/*! +@name Query operation +@{ +*/ + +/*! +@brief + Status codes for bt_query_executor_query(). +*/ typedef enum bt_query_executor_query_status { + /*! + @brief + Success. + */ BT_QUERY_EXECUTOR_QUERY_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Unknown object to query. + */ + BT_QUERY_EXECUTOR_QUERY_STATUS_UNKNOWN_OBJECT = __BT_FUNC_STATUS_UNKNOWN_OBJECT, + + /*! + @brief + Try again. + */ BT_QUERY_EXECUTOR_QUERY_STATUS_AGAIN = __BT_FUNC_STATUS_AGAIN, - BT_QUERY_EXECUTOR_QUERY_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, + + /*! + @brief + Out of memory. + */ BT_QUERY_EXECUTOR_QUERY_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, - BT_QUERY_EXECUTOR_QUERY_STATUS_UNKNOWN_OBJECT = __BT_FUNC_STATUS_UNKNOWN_OBJECT, + + /*! + @brief + Other error. + */ + BT_QUERY_EXECUTOR_QUERY_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, } bt_query_executor_query_status; +/*! +@brief + Performs a query operation using the query executor + \bt_p{query_executor}, setting \bt_p{*result} to the operation's + result on success. + +This function calls the query executor's target \bt_comp_cls's +query method, passing: + +- The object name of \bt_p{query_executor} as the + \bt_p{object_name} parameter. + +- The query parameters of \bt_p{query_executor} as the + \bt_p{params} parameter. + +- The query user data of \bt_p{query_executor} as the \bt_p{method_data} + parameter. + +The three items above were set when you created \bt_p{query_executor} +with bt_query_executor_create() or +bt_query_executor_create_with_method_data(). + +@param[in] query_executor + Query executor to use to execute the query operation. +@param[out] result + On success, \bt_p{*result} is a \em strong + reference of the query operation's result. + +@retval #BT_QUERY_EXECUTOR_QUERY_STATUS_OK + Success. +@retval #BT_QUERY_EXECUTOR_QUERY_STATUS_UNKNOWN_OBJECT + Unknown object to query. +@retval #BT_QUERY_EXECUTOR_QUERY_STATUS_AGAIN + Try again. +@retval #BT_QUERY_EXECUTOR_QUERY_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_QUERY_EXECUTOR_QUERY_STATUS_ERROR + Other error. + +@bt_pre_not_null{query_executor} +@bt_pre_not_null{result} +*/ extern bt_query_executor_query_status bt_query_executor_query( bt_query_executor *query_executor, const bt_value **result); +/*! @} */ + +/*! +@name Property +@{ +*/ + +/*! +@brief + Status codes for bt_query_executor_set_logging_level(). +*/ +typedef enum bt_query_executor_set_logging_level_status { + /*! + @brief + Success. + */ + BT_QUERY_EXECUTOR_SET_LOGGING_LEVEL_STATUS_OK = __BT_FUNC_STATUS_OK, +} bt_query_executor_set_logging_level_status; + +/*! +@brief + Sets the logging level of the query executor \bt_p{query_executor} + to \bt_p{logging_level}. + +See the \ref api-qexec-prop-log-lvl "logging level" property. + +@param[in] query_executor + Query executor of which to set the logging level to + \bt_p{logging_level}. +@param[in] logging_level + New logging level of \bt_p{query_executor}. + +@retval #BT_QUERY_EXECUTOR_SET_LOGGING_LEVEL_STATUS_OK + Success. + +@bt_pre_not_null{query_executor} + +@sa bt_stream_class_get_logging_level() — + Returns the logging level of a query executor. +*/ +extern bt_query_executor_set_logging_level_status +bt_query_executor_set_logging_level(bt_query_executor *query_executor, + bt_logging_level logging_level); + +/*! +@brief + Returns the logging level of the query executor + \bt_p{query_executor}. + +See the \ref api-qexec-prop-log-lvl "logging level" property. + +@param[in] query_executor + Query executor of which to get the logging level. + +@returns + Logging level of \bt_p{query_executor}. + +@bt_pre_not_null{query_executor} + +@sa bt_query_executor_set_logging_level() — + Sets the logging level of a query executor. +*/ +extern bt_logging_level bt_query_executor_get_logging_level( + const bt_query_executor *query_executor); + +/*! @} */ + +/*! +@name Interruption +@{ +*/ + +/*! +@brief + Status codes for bt_query_executor_add_interrupter(). +*/ typedef enum bt_query_executor_add_interrupter_status { + /*! + @brief + Success. + */ BT_QUERY_EXECUTOR_ADD_INTERRUPTER_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ BT_QUERY_EXECUTOR_ADD_INTERRUPTER_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, } bt_query_executor_add_interrupter_status; +/*! +@brief + Adds the \bt_intr \bt_p{interrupter} to the query executor + \bt_p{query_executor}. + +A \bt_comp_cls query method can check whether or not its executor is +interrupted (any of its interrupters, including its default interrupter, +is set) with bt_query_executor_is_interrupted(). + +@note + @parblock + bt_query_executor_create() and + bt_query_executor_create_with_method_data() return a query executor + which comes with its own default interrupter. + + Instead of adding your own interrupter to \bt_p{query_executor}, you + can set its default interrupter with + + @code + bt_interrupter_set(bt_query_executor_borrow_default_interrupter()); + @endcode + @endparblock + +@param[in] query_executor + Query executor to which to add \bt_p{interrupter}. +@param[in] interrupter + Interrupter to add to \bt_p{query_executor}. + +@retval #BT_QUERY_EXECUTOR_ADD_INTERRUPTER_STATUS_OK + Success. +@retval #BT_QUERY_EXECUTOR_ADD_INTERRUPTER_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{query_executor} +@bt_pre_not_null{interrupter} + +@sa bt_query_executor_borrow_default_interrupter() — + Borrows the default interrupter from a query executor. +*/ extern bt_query_executor_add_interrupter_status bt_query_executor_add_interrupter(bt_query_executor *query_executor, const bt_interrupter *interrupter); +/*! +@brief + Borrows the default \bt_intr from the query executor + \bt_p{query_executor}. + +@param[in] query_executor + Query executor from which to borrow the default interrupter. + +@returns + @parblock + \em Borrowed reference of the default interrupter of + \bt_p{query_executor}. + + The returned pointer remains valid as long as \bt_p{query_executor} + exists. + @endparblock + +@bt_pre_not_null{query_executor} + +@sa bt_query_executor_add_interrupter() — + Adds an interrupter to a query executor. +*/ extern bt_interrupter *bt_query_executor_borrow_default_interrupter( bt_query_executor *query_executor); -typedef enum bt_query_executor_set_logging_level_status { - BT_QUERY_EXECUTOR_SET_LOGGING_LEVEL_STATUS_OK = __BT_FUNC_STATUS_OK, -} bt_query_executor_set_logging_level_status; +/*! +@brief + Returns whether or not the query executor \bt_p{query_executor} + is interrupted, that is, whether or not any of its \bt_p_intr, + including its default interrupter, is set. -extern bt_query_executor_set_logging_level_status -bt_query_executor_set_logging_level(bt_query_executor *query_executor, - bt_logging_level logging_level); +@param[in] query_executor + Query executor to check. + +@returns + #BT_TRUE if \bt_p{query_executor} is interrupted (any of its + interrupters is set). + +@bt_pre_not_null{query_executor} +*/ +extern bt_bool bt_query_executor_is_interrupted( + const bt_query_executor *query_executor); + +/*! @} */ + +/*! +@name Reference count +@{ +*/ + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the query executor \bt_p{query_executor}. + +@param[in] query_executor + @parblock + Query executor of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_query_executor_put_ref() — + Decrements the reference count of a query executor. +*/ +extern void bt_query_executor_get_ref(const bt_query_executor *query_executor); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the query executor \bt_p{query_executor}. + +@param[in] query_executor + @parblock + Query executor of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_query_executor_get_ref() — + Increments the reference count of a query executor. +*/ +extern void bt_query_executor_put_ref(const bt_query_executor *query_executor); + +/*! +@brief + Decrements the reference count of the query executor + \bt_p{_query_executor}, and then sets \bt_p{_query_executor} to \c NULL. + +@param _query_executor + @parblock + Query executor of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_query_executor} +*/ +#define BT_QUERY_EXECUTOR_PUT_REF_AND_RESET(_query_executor) \ + do { \ + bt_query_executor_put_ref(_query_executor); \ + (_query_executor) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the query executor \bt_p{_dst}, sets + \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} to \c NULL. + +This macro effectively moves a query executor reference from the expression +\bt_p{_src} to the expression \bt_p{_dst}, putting the existing +\bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_QUERY_EXECUTOR_MOVE_REF(_dst, _src) \ + do { \ + bt_query_executor_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! @} */ #ifdef __cplusplus } diff --git a/include/babeltrace2/graph/self-component-class-filter.h b/include/babeltrace2/graph/self-component-class-filter.h deleted file mode 100644 index f2f96ceb..00000000 --- a/include/babeltrace2/graph/self-component-class-filter.h +++ /dev/null @@ -1,57 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_SELF_COMPONENT_CLASS_FILTER_H -#define BABELTRACE2_GRAPH_SELF_COMPONENT_CLASS_FILTER_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -static inline -const bt_component_class_filter * -bt_self_component_class_filter_as_component_class_filter( - bt_self_component_class_filter *self_comp_cls_filter) -{ - return __BT_UPCAST_CONST(bt_component_class_filter, - self_comp_cls_filter); -} - -static inline -bt_self_component_class* -bt_self_component_class_filter_as_self_component_class( - bt_self_component_class_filter *self_comp_cls_filter) -{ - return __BT_UPCAST(bt_self_component_class, self_comp_cls_filter); -} - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_SELF_COMPONENT_CLASS_FILTER_H */ diff --git a/include/babeltrace2/graph/self-component-class-sink.h b/include/babeltrace2/graph/self-component-class-sink.h deleted file mode 100644 index 00f6841c..00000000 --- a/include/babeltrace2/graph/self-component-class-sink.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_SELF_COMPONENT_CLASS_SINK_H -#define BABELTRACE2_GRAPH_SELF_COMPONENT_CLASS_SINK_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -static inline -const bt_component_class_sink * -bt_self_component_class_sink_as_component_class_sink( - bt_self_component_class_sink *self_comp_cls_sink) -{ - return __BT_UPCAST_CONST(bt_component_class_sink, self_comp_cls_sink); -} - -static inline -bt_self_component_class* -bt_self_component_class_sink_as_self_component_class( - bt_self_component_class_sink *self_comp_cls_sink) -{ - return __BT_UPCAST(bt_self_component_class, self_comp_cls_sink); -} - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_SELF_COMPONENT_CLASS_SINK_H */ diff --git a/include/babeltrace2/graph/self-component-class-source.h b/include/babeltrace2/graph/self-component-class-source.h deleted file mode 100644 index fb025f0c..00000000 --- a/include/babeltrace2/graph/self-component-class-source.h +++ /dev/null @@ -1,57 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_SELF_COMPONENT_CLASS_SOURCE_H -#define BABELTRACE2_GRAPH_SELF_COMPONENT_CLASS_SOURCE_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -static inline -const bt_component_class_source * -bt_self_component_class_source_as_component_class_source( - bt_self_component_class_source *self_comp_cls_source) -{ - return __BT_UPCAST_CONST(bt_component_class_source, - self_comp_cls_source); -} - -static inline -bt_self_component_class* -bt_self_component_class_source_as_self_component_class( - bt_self_component_class_source *self_comp_cls_source) -{ - return __BT_UPCAST(bt_self_component_class, self_comp_cls_source); -} - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_SELF_COMPONENT_CLASS_SOURCE_H */ diff --git a/include/babeltrace2/graph/self-component-class.h b/include/babeltrace2/graph/self-component-class.h index 7cdd441e..33fda7b0 100644 --- a/include/babeltrace2/graph/self-component-class.h +++ b/include/babeltrace2/graph/self-component-class.h @@ -33,6 +33,73 @@ extern "C" { #endif +/*! +@defgroup api-self-comp-cls Self component classes +@ingroup api-comp-cls-dev + +@brief + Private views of \bt_p_comp_cls for class methods. + +The #bt_self_component_class, #bt_self_component_class_source, +#bt_self_component_class_filter, #bt_self_component_class_sink types are +private views of a \bt_comp_cls from within a component class +\ref api-comp-cls-dev-class-meth "class method". + +As of \bt_name_version_min_maj, this module only contains functions +to \ref api-fund-c-typing "upcast" the "self" (private) types to their +public #bt_component_class, #bt_component_class_source, +#bt_component_class_filter, and #bt_component_class_sink counterparts. +*/ + +/*! @{ */ + +/*! +@name Types +@{ + +@typedef struct bt_self_component_class bt_self_component_class; + +@brief + Self \bt_comp_cls. + +@typedef struct bt_self_component_class_source bt_self_component_class_source; + +@brief + Self \bt_src_comp_cls. + +@typedef struct bt_self_component_class_filter bt_self_component_class_filter; + +@brief + Self \bt_flt_comp_cls. + +@typedef struct bt_self_component_class_sink bt_self_component_class_sink; + +@brief + Self \bt_sink_comp_cls. + +@} +*/ + +/*! +@name Self to public upcast +@{ +*/ + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the self \bt_comp_cls + \bt_p{self_component_class} to the public #bt_component_class type. + +@param[in] self_component_class + @parblock + Component class to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{self_component_class} as a public component class. +*/ static inline const bt_component_class *bt_self_component_class_as_component_class( bt_self_component_class *self_component_class) @@ -40,6 +107,163 @@ const bt_component_class *bt_self_component_class_as_component_class( return __BT_UPCAST(bt_component_class, self_component_class); } +/*! +@brief + \ref api-fund-c-typing "Upcasts" the self \bt_src_comp_cls + \bt_p{self_component_class} to the public #bt_component_class_source + type. + +@param[in] self_component_class + @parblock + Source component class to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{self_component_class} as a public source component class. +*/ +static inline +const bt_component_class_source * +bt_self_component_class_source_as_component_class_source( + bt_self_component_class_source *self_component_class) +{ + return __BT_UPCAST_CONST(bt_component_class_source, + self_component_class); +} + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the self \bt_flt_comp_cls + \bt_p{self_component_class} to the public #bt_component_class_filter + type. + +@param[in] self_component_class + @parblock + Filter component class to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{self_component_class} as a public filter component class. +*/ +static inline +const bt_component_class_filter * +bt_self_component_class_filter_as_component_class_filter( + bt_self_component_class_filter *self_component_class) +{ + return __BT_UPCAST_CONST(bt_component_class_filter, + self_component_class); +} + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the self \bt_sink_comp_cls + \bt_p{self_component_class} to the public #bt_component_class_sink + type. + +@param[in] self_component_class + @parblock + Sink component class to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{self_component_class} as a public sink component class. +*/ +static inline +const bt_component_class_sink * +bt_self_component_class_sink_as_component_class_sink( + bt_self_component_class_sink *self_component_class) +{ + return __BT_UPCAST_CONST(bt_component_class_sink, self_component_class); +} + +/*! @} */ + +/*! +@name Self to common self upcast +@{ +*/ + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the self \bt_src_comp_cls + \bt_p{self_component_class} to the common #bt_self_component_class + type. + +@param[in] self_component_class + @parblock + Source component class to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{self_component_class} as a common self component class. +*/ +static inline +bt_self_component_class* +bt_self_component_class_source_as_self_component_class( + bt_self_component_class_source *self_component_class) +{ + return __BT_UPCAST(bt_self_component_class, self_component_class); +} + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the self \bt_flt_comp_cls + \bt_p{self_component_class} to the common #bt_self_component_class + type. + +@param[in] self_component_class + @parblock + Filter component class to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{self_component_class} as a common self component class. +*/ +static inline +bt_self_component_class* +bt_self_component_class_filter_as_self_component_class( + bt_self_component_class_filter *self_component_class) +{ + return __BT_UPCAST(bt_self_component_class, self_component_class); +} + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the self \bt_sink_comp_cls + \bt_p{self_component_class} to the common #bt_self_component_class + type. + +@param[in] self_component_class + @parblock + Sink component class to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{self_component_class} as a common self component class. +*/ +static inline +bt_self_component_class* +bt_self_component_class_sink_as_self_component_class( + bt_self_component_class_sink *self_component_class) +{ + return __BT_UPCAST(bt_self_component_class, self_component_class); +} + +/*! @} */ + +/*! @} */ + #ifdef __cplusplus } #endif diff --git a/include/babeltrace2/graph/self-component-filter.h b/include/babeltrace2/graph/self-component-filter.h deleted file mode 100644 index ec49b6f9..00000000 --- a/include/babeltrace2/graph/self-component-filter.h +++ /dev/null @@ -1,90 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_SELF_COMPONENT_FILTER_H -#define BABELTRACE2_GRAPH_SELF_COMPONENT_FILTER_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -static inline -bt_self_component *bt_self_component_filter_as_self_component( - bt_self_component_filter *self_comp_filter) -{ - return __BT_UPCAST(bt_self_component, self_comp_filter); -} - -static inline -const bt_component_filter * -bt_self_component_filter_as_component_filter( - bt_self_component_filter *self_comp_filter) -{ - return __BT_UPCAST_CONST(bt_component_filter, self_comp_filter); -} - -extern bt_self_component_port_output * -bt_self_component_filter_borrow_output_port_by_name( - bt_self_component_filter *self_component, - const char *name); - -extern bt_self_component_port_output * -bt_self_component_filter_borrow_output_port_by_index( - bt_self_component_filter *self_component, - uint64_t index); - -extern bt_self_component_add_port_status -bt_self_component_filter_add_output_port( - bt_self_component_filter *self_component, - const char *name, void *user_data, - bt_self_component_port_output **self_component_port); - -extern bt_self_component_port_input * -bt_self_component_filter_borrow_input_port_by_name( - bt_self_component_filter *self_component, - const char *name); - -extern bt_self_component_port_input * -bt_self_component_filter_borrow_input_port_by_index( - bt_self_component_filter *self_component, - uint64_t index); - -extern bt_self_component_add_port_status -bt_self_component_filter_add_input_port( - bt_self_component_filter *self_component, - const char *name, void *user_data, - bt_self_component_port_input **self_component_port); - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_SELF_COMPONENT_FILTER_H */ diff --git a/include/babeltrace2/graph/self-component-port-input.h b/include/babeltrace2/graph/self-component-port-input.h deleted file mode 100644 index 0c13c015..00000000 --- a/include/babeltrace2/graph/self-component-port-input.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_SELF_COMPONENT_PORT_INPUT_H -#define BABELTRACE2_GRAPH_SELF_COMPONENT_PORT_INPUT_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -static inline -bt_self_component_port * -bt_self_component_port_input_as_self_component_port( - bt_self_component_port_input *self_component_port) -{ - return __BT_UPCAST(bt_self_component_port, self_component_port); -} - -static inline -const bt_port_input *bt_self_component_port_input_as_port_input( - const bt_self_component_port_input *self_component_port) -{ - return __BT_UPCAST_CONST(bt_port_input, self_component_port); -} - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_SELF_COMPONENT_PORT_INPUT_H */ diff --git a/include/babeltrace2/graph/self-component-port-output.h b/include/babeltrace2/graph/self-component-port-output.h deleted file mode 100644 index b3daa62a..00000000 --- a/include/babeltrace2/graph/self-component-port-output.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_SELF_COMPONENT_PORT_OUTPUT_H -#define BABELTRACE2_GRAPH_SELF_COMPONENT_PORT_OUTPUT_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -static inline -bt_self_component_port * -bt_self_component_port_output_as_self_component_port( - bt_self_component_port_output *self_component_port) -{ - return __BT_UPCAST(bt_self_component_port, self_component_port); -} - -static inline -const bt_port_output *bt_self_component_port_output_as_port_output( - bt_self_component_port_output *self_component_port) -{ - return __BT_UPCAST_CONST(bt_port_output, self_component_port); -} - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_SELF_COMPONENT_PORT_OUTPUT_H */ diff --git a/include/babeltrace2/graph/self-component-port.h b/include/babeltrace2/graph/self-component-port.h index db08e2c7..0ab59ac3 100644 --- a/include/babeltrace2/graph/self-component-port.h +++ b/include/babeltrace2/graph/self-component-port.h @@ -33,18 +33,235 @@ extern "C" { #endif +/*! +@defgroup api-self-comp-port Self component ports +@ingroup api-self-comp + +@brief + Private views of \bt_p_port for \bt_comp_cls instance methods. + +The #bt_self_component_port, #bt_self_component_port_input, and +#bt_self_component_port_output types are private views of a \bt_port +from within a component class +\ref api-comp-cls-dev-instance-meth "instance method". + +Borrow the \bt_self_comp of a port with +bt_self_component_port_borrow_component(). + +Get the user data attached to a port with +bt_self_component_port_get_data(). + +\ref api-fund-c-typing "Upcast" the "self" (private) types to the +public and common self component port types with the +bt_self_component_port*_as_port*() and +bt_self_component_port_*_as_self_component_port() +functions. +*/ + +/*! @{ */ + +/*! +@name Types +@{ + +@typedef struct bt_self_component_port bt_self_component_port; + +@brief + Self component \bt_comp. + +@typedef struct bt_self_component_port_input bt_self_component_port_input; + +@brief + Self component \bt_iport. + +@typedef struct bt_self_component_port_output bt_self_component_port_output; + +@brief + Self component \bt_oport. + +@} +*/ + +/*! +@name Component access +@{ +*/ + +/*! +@brief + Borrows the \bt_comp of the \bt_port \bt_p{self_component_port}. + +@param[in] self_component_port + Port from which to borrow the component which owns it. + +@returns + Component which owns \bt_p{self_component_port}. + +@bt_pre_not_null{self_component_port} +*/ +extern bt_self_component *bt_self_component_port_borrow_component( + bt_self_component_port *self_component_port); + +/*! @} */ + +/*! +@name User data access +@{ +*/ + +/*! +@brief + Returns the user data of the \bt_port \bt_p{self_component_port}. + +You can attach user data to a port when you add it to a component with +bt_self_component_source_add_output_port(), +bt_self_component_filter_add_input_port(), +bt_self_component_filter_add_output_port(), and +bt_self_component_sink_add_input_port(). + +@param[in] self_component_port + Port of which to get the user data. + +@returns + User data of \bt_p{self_component_port}. + +@bt_pre_not_null{self_component_port} +*/ +extern void *bt_self_component_port_get_data( + const bt_self_component_port *self_component_port); + + +/*! @} */ + +/*! +@name Self to public upcast +@{ +*/ + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the self component port + \bt_p{self_component_port} to the public #bt_port type. + +@param[in] self_component_port + @parblock + Port to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{self_component_port} as a public port. +*/ static inline const bt_port *bt_self_component_port_as_port( - bt_self_component_port *self_port) + bt_self_component_port *self_component_port) { - return __BT_UPCAST_CONST(bt_port, self_port); + return __BT_UPCAST_CONST(bt_port, self_component_port); } -extern bt_self_component *bt_self_component_port_borrow_component( - bt_self_component_port *self_port); +/*! +@brief + \ref api-fund-c-typing "Upcasts" the self component \bt_iport + \bt_p{self_component_port} to the public #bt_port_input type. -extern void *bt_self_component_port_get_data( - const bt_self_component_port *self_port); +@param[in] self_component_port + @parblock + Input port to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{self_component_port} as a public input port. +*/ +static inline +const bt_port_input *bt_self_component_port_input_as_port_input( + const bt_self_component_port_input *self_component_port) +{ + return __BT_UPCAST_CONST(bt_port_input, self_component_port); +} + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the self component \bt_oport + \bt_p{self_component_port} to the public #bt_port_output type. + +@param[in] self_component_port + @parblock + Output port to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{self_component_port} as a public output port. +*/ +static inline +const bt_port_output *bt_self_component_port_output_as_port_output( + bt_self_component_port_output *self_component_port) +{ + return __BT_UPCAST_CONST(bt_port_output, self_component_port); +} + +/*! @} */ + +/*! +@name Self to common self upcast +@{ +*/ + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the self \bt_iport + \bt_p{self_component_port} to the common #bt_self_component_port + type. + +@param[in] self_component_port + @parblock + Input port to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{self_component_port} as a common self component port. +*/ +static inline +bt_self_component_port * +bt_self_component_port_input_as_self_component_port( + bt_self_component_port_input *self_component_port) +{ + return __BT_UPCAST(bt_self_component_port, self_component_port); +} + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the self \bt_oport + \bt_p{self_component_port} to the common #bt_self_component_port + type. + +@param[in] self_component_port + @parblock + Output port to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{self_component_port} as a common self component port. +*/ +static inline +bt_self_component_port * +bt_self_component_port_output_as_self_component_port( + bt_self_component_port_output *self_component_port) +{ + return __BT_UPCAST(bt_self_component_port, self_component_port); +} + +/*! @} */ + +/*! @} */ #ifdef __cplusplus } diff --git a/include/babeltrace2/graph/self-component-sink.h b/include/babeltrace2/graph/self-component-sink.h deleted file mode 100644 index 224c6781..00000000 --- a/include/babeltrace2/graph/self-component-sink.h +++ /dev/null @@ -1,76 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_SELF_COMPONENT_SINK_H -#define BABELTRACE2_GRAPH_SELF_COMPONENT_SINK_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -static inline -bt_self_component *bt_self_component_sink_as_self_component( - bt_self_component_sink *self_comp_sink) -{ - return __BT_UPCAST(bt_self_component, self_comp_sink); -} - -static inline -const bt_component_sink * -bt_self_component_sink_as_component_sink( - bt_self_component_sink *self_comp_sink) -{ - return __BT_UPCAST_CONST(bt_component_sink, self_comp_sink); -} - -extern bt_self_component_port_input * -bt_self_component_sink_borrow_input_port_by_name( - bt_self_component_sink *self_component, - const char *name); - -extern bt_self_component_port_input * -bt_self_component_sink_borrow_input_port_by_index( - bt_self_component_sink *self_component, uint64_t index); - -extern bt_self_component_add_port_status -bt_self_component_sink_add_input_port( - bt_self_component_sink *self_component, - const char *name, void *user_data, - bt_self_component_port_input **self_component_port); - -extern bt_bool bt_self_component_sink_is_interrupted( - const bt_self_component_sink *self_component); - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_SELF_COMPONENT_SINK_H */ diff --git a/include/babeltrace2/graph/self-component-source.h b/include/babeltrace2/graph/self-component-source.h deleted file mode 100644 index ec022fd3..00000000 --- a/include/babeltrace2/graph/self-component-source.h +++ /dev/null @@ -1,74 +0,0 @@ -#ifndef BABELTRACE2_GRAPH_SELF_COMPONENT_SOURCE_H -#define BABELTRACE2_GRAPH_SELF_COMPONENT_SOURCE_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -static inline -bt_self_component *bt_self_component_source_as_self_component( - bt_self_component_source *self_comp_source) -{ - return __BT_UPCAST(bt_self_component, self_comp_source); -} - -static inline -const bt_component_source * -bt_self_component_source_as_component_source( - bt_self_component_source *self_comp_source) -{ - return __BT_UPCAST_CONST(bt_component_source, self_comp_source); -} - -extern bt_self_component_port_output * -bt_self_component_source_borrow_output_port_by_name( - bt_self_component_source *self_component, - const char *name); - -extern bt_self_component_port_output * -bt_self_component_source_borrow_output_port_by_index( - bt_self_component_source *self_component, - uint64_t index); - -extern bt_self_component_add_port_status -bt_self_component_source_add_output_port( - bt_self_component_source *self_component, - const char *name, void *user_data, - bt_self_component_port_output **self_component_port); - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_GRAPH_SELF_COMPONENT_SOURCE_H */ diff --git a/include/babeltrace2/graph/self-component.h b/include/babeltrace2/graph/self-component.h index ba722d98..b995c088 100644 --- a/include/babeltrace2/graph/self-component.h +++ b/include/babeltrace2/graph/self-component.h @@ -33,12 +33,690 @@ extern "C" { #endif +/*! +@defgroup api-self-comp Self components +@ingroup api-comp-cls-dev + +@brief + Private views of \bt_p_comp for instance methods. + +The #bt_self_component, #bt_self_component_source, +#bt_self_component_filter, #bt_self_component_sink types are +private views of a \bt_comp from within a component class +\ref api-comp-cls-dev-instance-meth "instance method". + +Add a \bt_port to a component with +bt_self_component_source_add_output_port(), +bt_self_component_filter_add_input_port(), +bt_self_component_filter_add_output_port(), and +bt_self_component_sink_add_input_port(). + +When you add a port to a component, you can attach custom user data +to it (\bt_voidp). You can retrieve this user data +afterwards with bt_self_component_port_get_data(). + +Borrow a \bt_self_comp_port from a component by index with +bt_self_component_source_borrow_output_port_by_index(), +bt_self_component_filter_borrow_input_port_by_index(), +bt_self_component_filter_borrow_output_port_by_index(), and +bt_self_component_sink_borrow_input_port_by_index(). + +Borrow a \bt_self_comp_port from a component by name with +bt_self_component_source_borrow_output_port_by_name(), +bt_self_component_filter_borrow_input_port_by_name(), +bt_self_component_filter_borrow_output_port_by_name(), and +bt_self_component_sink_borrow_input_port_by_name(). + +Set and get user data attached to a component with +bt_self_component_set_data() and bt_self_component_get_data(). + +Get a component's owning trace processing \bt_graph's effective +\bt_mip version with bt_self_component_get_graph_mip_version(). + +Check whether or not a \bt_sink_comp is interrupted with +bt_self_component_sink_is_interrupted(). + +\ref api-fund-c-typing "Upcast" the "self" (private) types to the +public and common self component types with the +bt_self_component*_as_component*() and +bt_self_component_*_as_self_component() functions. +*/ + +/*! @{ */ + +/*! +@name Types +@{ + +@typedef struct bt_self_component bt_self_component; + +@brief + Self \bt_comp. + +@typedef struct bt_self_component_source bt_self_component_source; + +@brief + Self \bt_src_comp. + +@typedef struct bt_self_component_filter bt_self_component_filter; + +@brief + Self \bt_flt_comp. + +@typedef struct bt_self_component_sink bt_self_component_sink; + +@brief + Self \bt_sink_comp. + +@typedef struct bt_self_component_source_configuration bt_self_component_source_configuration; + +@brief + Self \bt_src_comp configuration. + +@typedef struct bt_self_component_filter_configuration bt_self_component_filter_configuration; + +@brief + Self \bt_flt_comp configuration. + +@typedef struct bt_self_component_sink_configuration bt_self_component_sink_configuration; + +@brief + Self \bt_sink_comp configuration. + +@} +*/ + +/*! +@name Port adding +@{ +*/ + +/*! +@brief + Status codes for bt_self_component_source_add_output_port(), + bt_self_component_filter_add_input_port(), + bt_self_component_filter_add_output_port(), and + bt_self_component_sink_add_input_port(). +*/ typedef enum bt_self_component_add_port_status { + /*! + @brief + Success. + */ BT_SELF_COMPONENT_ADD_PORT_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_SELF_COMPONENT_ADD_PORT_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, + + /*! + @brief + Out of memory. + */ BT_SELF_COMPONENT_ADD_PORT_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + Other error. + */ + BT_SELF_COMPONENT_ADD_PORT_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, } bt_self_component_add_port_status; +/*! +@brief + Adds an \bt_oport named \bt_p{name} and having the user data + \bt_p{user_data} to the \bt_src_comp \bt_p{self_component}, + and sets \bt_p{*self_component_port} to the resulting port. + +@attention + You can only call this function from within the + \ref api-comp-cls-dev-meth-init "initialization", + \link api-comp-cls-dev-meth-iport-connected "input port connected"\endlink, + and + \link api-comp-cls-dev-meth-oport-connected "output port connected"\endlink + methods. + +@param[in] self_component + Source component instance. +@param[in] name + Name of the output port to add to \bt_p{self_component} (copied). +@param[in] user_data + User data of the output port to add to \bt_p{self_component}. +@param[out] self_component_port + On success, if not \c NULL, + \bt_p{*self_component_port} is a \em borrowed reference of the + created port. + +@retval #BT_SELF_COMPONENT_ADD_PORT_STATUS_OK + Success. +@retval #BT_SELF_COMPONENT_ADD_PORT_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_SELF_COMPONENT_ADD_PORT_STATUS_ERROR + Other error. + +@bt_pre_not_null{self_component} +@bt_pre_not_null{name} +@pre + No other output port within \bt_p{self_component} has the name + \bt_p{name}. +*/ +extern bt_self_component_add_port_status +bt_self_component_source_add_output_port( + bt_self_component_source *self_component, + const char *name, void *user_data, + bt_self_component_port_output **self_component_port); + +/*! +@brief + Adds an \bt_iport named \bt_p{name} and having the user data + \bt_p{user_data} to the \bt_flt_comp \bt_p{self_component}, + and sets \bt_p{*self_component_port} to the resulting port. + +@attention + You can only call this function from within the + \ref api-comp-cls-dev-meth-init "initialization", + \link api-comp-cls-dev-meth-iport-connected "input port connected"\endlink, + and + \link api-comp-cls-dev-meth-oport-connected "output port connected"\endlink + methods. + +@param[in] self_component + Filter component instance. +@param[in] name + Name of the input port to add to \bt_p{self_component} (copied). +@param[in] user_data + User data of the input port to add to \bt_p{self_component}. +@param[out] self_component_port + On success, if not \c NULL, + \bt_p{*self_component_port} is a \em borrowed reference of the + created port. + +@retval #BT_SELF_COMPONENT_ADD_PORT_STATUS_OK + Success. +@retval #BT_SELF_COMPONENT_ADD_PORT_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_SELF_COMPONENT_ADD_PORT_STATUS_ERROR + Other error. + +@bt_pre_not_null{self_component} +@bt_pre_not_null{name} +@pre + No other input port within \bt_p{self_component} has the name + \bt_p{name}. +*/ +extern bt_self_component_add_port_status +bt_self_component_filter_add_input_port( + bt_self_component_filter *self_component, + const char *name, void *user_data, + bt_self_component_port_input **self_component_port); + +/*! +@brief + Adds an \bt_oport named \bt_p{name} and having the user data + \bt_p{user_data} to the \bt_flt_comp \bt_p{self_component}, + and sets \bt_p{*self_component_port} to the resulting port. + +@attention + You can only call this function from within the + \ref api-comp-cls-dev-meth-init "initialization", + \link api-comp-cls-dev-meth-iport-connected "input port connected"\endlink, + and + \link api-comp-cls-dev-meth-oport-connected "output port connected"\endlink + methods. + +@param[in] self_component + Filter component instance. +@param[in] name + Name of the output port to add to \bt_p{self_component} (copied). +@param[in] user_data + User data of the output port to add to \bt_p{self_component}. +@param[out] self_component_port + On success, if not \c NULL, + \bt_p{*self_component_port} is a \em borrowed reference of the + created port. + +@retval #BT_SELF_COMPONENT_ADD_PORT_STATUS_OK + Success. +@retval #BT_SELF_COMPONENT_ADD_PORT_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_SELF_COMPONENT_ADD_PORT_STATUS_ERROR + Other error. + +@bt_pre_not_null{self_component} +@bt_pre_not_null{name} +@pre + No other output port within \bt_p{self_component} has the name + \bt_p{name}. +*/ +extern bt_self_component_add_port_status +bt_self_component_filter_add_output_port( + bt_self_component_filter *self_component, + const char *name, void *user_data, + bt_self_component_port_output **self_component_port); + +/*! +@brief + Adds an \bt_iport named \bt_p{name} and having the user data + \bt_p{user_data} to the \bt_sink_comp \bt_p{self_component}, + and sets \bt_p{*self_component_port} to the resulting port. + +@attention + You can only call this function from within the + \ref api-comp-cls-dev-meth-init "initialization", + \link api-comp-cls-dev-meth-iport-connected "input port connected"\endlink, + and + \link api-comp-cls-dev-meth-oport-connected "output port connected"\endlink + methods. + +@param[in] self_component + Sink component instance. +@param[in] name + Name of the input port to add to \bt_p{self_component} (copied). +@param[in] user_data + User data of the input port to add to \bt_p{self_component}. +@param[out] self_component_port + On success, if not \c NULL, + \bt_p{*self_component_port} is a \em borrowed reference of the + created port. + +@retval #BT_SELF_COMPONENT_ADD_PORT_STATUS_OK + Success. +@retval #BT_SELF_COMPONENT_ADD_PORT_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_SELF_COMPONENT_ADD_PORT_STATUS_ERROR + Other error. + +@bt_pre_not_null{self_component} +@bt_pre_not_null{name} +@pre + No other input port within \bt_p{self_component} has the name + \bt_p{name}. +*/ + +extern bt_self_component_add_port_status +bt_self_component_sink_add_input_port( + bt_self_component_sink *self_component, + const char *name, void *user_data, + bt_self_component_port_input **self_component_port); + +/*! @} */ + +/*! +@name Port access +@{ +*/ + +/*! +@brief + Borrows the \bt_self_comp_oport at index \bt_p{index} from the + \bt_src_comp \bt_p{self_component}. + +@param[in] self_component + Source component instance. +@param[in] index + Index of the output port to borrow from \bt_p{self_component}. + +@returns + @parblock + \em Borrowed reference of the output port of + \bt_p{self_component} at index \bt_p{index}. + + The returned pointer remains valid as long as \bt_p{self_component} + exists. + @endparblock + +@bt_pre_not_null{self_component} +@pre + \bt_p{index} is less than the number of output ports + \bt_p{self_component} has (as returned by + bt_component_source_get_output_port_count()). + +@sa bt_component_source_get_output_port_count() — + Returns the number of output ports that a source component has. +*/ +extern bt_self_component_port_output * +bt_self_component_source_borrow_output_port_by_index( + bt_self_component_source *self_component, + uint64_t index); + +/*! +@brief + Borrows the \bt_self_comp_iport at index \bt_p{index} from the + \bt_flt_comp \bt_p{self_component}. + +@param[in] self_component + Filter component instance. +@param[in] index + Index of the input port to borrow from \bt_p{self_component}. + +@returns + @parblock + \em Borrowed reference of the input port of + \bt_p{self_component} at index \bt_p{index}. + + The returned pointer remains valid as long as \bt_p{self_component} + exists. + @endparblock + +@bt_pre_not_null{self_component} +@pre + \bt_p{index} is less than the number of input ports + \bt_p{self_component} has (as returned by + bt_component_filter_get_input_port_count()). + +@sa bt_component_filter_get_input_port_count() — + Returns the number of input ports that a filter component has. +*/ +extern bt_self_component_port_input * +bt_self_component_filter_borrow_input_port_by_index( + bt_self_component_filter *self_component, + uint64_t index); + +/*! +@brief + Borrows the \bt_self_comp_oport at index \bt_p{index} from the + \bt_flt_comp \bt_p{self_component}. + +@param[in] self_component + Filter component instance. +@param[in] index + Index of the output port to borrow from \bt_p{self_component}. + +@returns + @parblock + \em Borrowed reference of the output port of + \bt_p{self_component} at index \bt_p{index}. + + The returned pointer remains valid as long as \bt_p{self_component} + exists. + @endparblock + +@bt_pre_not_null{self_component} +@pre + \bt_p{index} is less than the number of output ports + \bt_p{self_component} has (as returned by + bt_component_filter_get_output_port_count()). + +@sa bt_component_filter_get_output_port_count() — + Returns the number of output ports that a filter component has. +*/ +extern bt_self_component_port_output * +bt_self_component_filter_borrow_output_port_by_index( + bt_self_component_filter *self_component, + uint64_t index); + +/*! +@brief + Borrows the \bt_self_comp_iport at index \bt_p{index} from the + \bt_sink_comp \bt_p{self_component}. + +@param[in] self_component + Sink component instance. +@param[in] index + Index of the input port to borrow from \bt_p{self_component}. + +@returns + @parblock + \em Borrowed reference of the input port of + \bt_p{self_component} at index \bt_p{index}. + + The returned pointer remains valid as long as \bt_p{self_component} + exists. + @endparblock + +@bt_pre_not_null{self_component} +@pre + \bt_p{index} is less than the number of input ports + \bt_p{self_component} has (as returned by + bt_component_sink_get_input_port_count()). + +@sa bt_component_sink_get_input_port_count() — + Returns the number of input ports that a sink component has. +*/ +extern bt_self_component_port_input * +bt_self_component_sink_borrow_input_port_by_index( + bt_self_component_sink *self_component, uint64_t index); + +/*! +@brief + Borrows the \bt_self_comp_oport named \bt_p{name} from the + \bt_src_comp \bt_p{self_component}. + +If \bt_p{self_component} has no output port named \bt_p{name}, this +function returns \c NULL. + +@param[in] self_component + Source component instance. +@param[in] name + Name of the output port to borrow from \bt_p{self_component}. + +@returns + @parblock + \em Borrowed reference of the output port of + \bt_p{self_component} named \bt_p{name}, or \c NULL if none. + + The returned pointer remains valid as long as \bt_p{self_component} + exists. + @endparblock + +@bt_pre_not_null{self_component} +@bt_pre_not_null{name} +*/ +extern bt_self_component_port_output * +bt_self_component_source_borrow_output_port_by_name( + bt_self_component_source *self_component, + const char *name); + +/*! +@brief + Borrows the \bt_self_comp_iport named \bt_p{name} from the + \bt_flt_comp \bt_p{self_component}. + +If \bt_p{self_component} has no input port named \bt_p{name}, this +function returns \c NULL. + +@param[in] self_component + Filter component instance. +@param[in] name + Name of the input port to borrow from \bt_p{self_component}. + +@returns + @parblock + \em Borrowed reference of the input port of + \bt_p{self_component} named \bt_p{name}, or \c NULL if none. + + The returned pointer remains valid as long as \bt_p{self_component} + exists. + @endparblock + +@bt_pre_not_null{self_component} +@bt_pre_not_null{name} +*/ +extern bt_self_component_port_input * +bt_self_component_filter_borrow_input_port_by_name( + bt_self_component_filter *self_component, + const char *name); + +/*! +@brief + Borrows the \bt_self_comp_oport named \bt_p{name} from the + \bt_flt_comp \bt_p{self_component}. + +If \bt_p{self_component} has no output port named \bt_p{name}, this +function returns \c NULL. + +@param[in] self_component + Filter component instance. +@param[in] name + Name of the output port to borrow from \bt_p{self_component}. + +@returns + @parblock + \em Borrowed reference of the output port of + \bt_p{self_component} named \bt_p{name}, or \c NULL if none. + + The returned pointer remains valid as long as \bt_p{self_component} + exists. + @endparblock + +@bt_pre_not_null{self_component} +@bt_pre_not_null{name} +*/ +extern bt_self_component_port_output * +bt_self_component_filter_borrow_output_port_by_name( + bt_self_component_filter *self_component, + const char *name); + +/*! +@brief + Borrows the \bt_self_comp_iport named \bt_p{name} from the + \bt_sink_comp \bt_p{self_component}. + +If \bt_p{self_component} has no input port named \bt_p{name}, this +function returns \c NULL. + +@param[in] self_component + Sink component instance. +@param[in] name + Name of the input port to borrow from \bt_p{self_component}. + +@returns + @parblock + \em Borrowed reference of the input port of + \bt_p{self_component} named \bt_p{name}, or \c NULL if none. + + The returned pointer remains valid as long as \bt_p{self_component} + exists. + @endparblock + +@bt_pre_not_null{self_component} +@bt_pre_not_null{name} +*/ +extern bt_self_component_port_input * +bt_self_component_sink_borrow_input_port_by_name( + bt_self_component_sink *self_component, + const char *name); + +/*! @} */ + +/*! +@name User data +@{ +*/ + +/*! +@brief + Sets the user data of the \bt_comp \bt_p{self_component} to + \bt_p{data}. + +@param[in] self_component + Component instance. +@param[in] user_data + New user data of \bt_p{self_component}. + +@bt_pre_not_null{self_component} + +@sa bt_self_component_get_data() — + Returns the user data of a component. +*/ +extern void bt_self_component_set_data( + bt_self_component *self_component, void *user_data); + +/*! +@brief + Returns the user data of the \bt_comp \bt_p{self_component}. + +@param[in] self_component + Component instance. + +@returns + User data of \bt_p{self_component}. + +@bt_pre_not_null{self_component} + +@sa bt_self_component_set_data() — + Sets the user data of a component. +*/ +extern void *bt_self_component_get_data( + const bt_self_component *self_component); + +/*! @} */ + +/*! +@name Trace processing graph's effective MIP version access +@{ +*/ + +/*! +@brief + Returns the effective \bt_mip (MIP) version of the trace processing + \bt_graph which contains the \bt_comp \bt_p{self_component}. + +@note + As of \bt_name_version_min_maj, because bt_get_maximal_mip_version() + returns 0, this function always returns 0. + +@param[in] self_component + Component instance. + +@returns + Effective MIP version of the trace processing graph which + contains \bt_p{self_component}. + +@bt_pre_not_null{self_component} +*/ +extern +uint64_t bt_self_component_get_graph_mip_version( + bt_self_component *self_component); + +/*! @} */ + +/*! +@name Sink component's interruption query +@{ +*/ + +/*! +@brief + Returns whether or not the \bt_sink_comp \bt_p{self_component} + is interrupted, that is, whether or not any of its \bt_p_intr + is set. + +@param[in] self_component + Component instance. + +@returns + #BT_TRUE if \bt_p{self_component} is interrupted (any of its + interrupters is set). + +@bt_pre_not_null{self_component} + +@sa bt_graph_borrow_default_interrupter() — + Borrows a trace processing graph's default interrupter. +@sa bt_graph_add_interrupter() — + Adds an interrupter to a graph. +*/ +extern bt_bool bt_self_component_sink_is_interrupted( + const bt_self_component_sink *self_component); + +/*! @} */ + +/*! +@name Self to public upcast +@{ +*/ + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the self \bt_comp + \bt_p{self_component} to the public #bt_component type. + +@param[in] self_component + @parblock + Component to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{self_component} as a public component. +*/ static inline const bt_component *bt_self_component_as_component( bt_self_component *self_component) @@ -46,14 +724,157 @@ const bt_component *bt_self_component_as_component( return __BT_UPCAST(bt_component, self_component); } -extern -uint64_t bt_self_component_get_graph_mip_version(bt_self_component *self_component); +/*! +@brief + \ref api-fund-c-typing "Upcasts" the self \bt_src_comp + \bt_p{self_component} to the public #bt_component_source + type. -extern void *bt_self_component_get_data( - const bt_self_component *self_component); +@param[in] self_component + @parblock + Source component to upcast. -extern void bt_self_component_set_data( - bt_self_component *self_component, void *data); + Can be \c NULL. + @endparblock + +@returns + \bt_p{self_component} as a public source component. +*/ +static inline +const bt_component_source * +bt_self_component_source_as_component_source( + bt_self_component_source *self_component) +{ + return __BT_UPCAST_CONST(bt_component_source, self_component); +} + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the self \bt_flt_comp + \bt_p{self_component} to the public #bt_component_filter + type. + +@param[in] self_component + @parblock + Filter component to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{self_component} as a public filter component. +*/ +static inline +const bt_component_filter * +bt_self_component_filter_as_component_filter( + bt_self_component_filter *self_component) +{ + return __BT_UPCAST_CONST(bt_component_filter, self_component); +} + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the self \bt_sink_comp + \bt_p{self_component} to the public #bt_component_sink + type. + +@param[in] self_component + @parblock + Sink component to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{self_component} as a public sink component. +*/ +static inline +const bt_component_sink * +bt_self_component_sink_as_component_sink( + bt_self_component_sink *self_component) +{ + return __BT_UPCAST_CONST(bt_component_sink, self_component); +} + +/*! @} */ + +/*! +@name Self to common self upcast +@{ +*/ + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the self \bt_src_comp + \bt_p{self_component} to the common #bt_self_component + type. + +@param[in] self_component + @parblock + Source component to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{self_component} as a common self component. +*/ +static inline +bt_self_component *bt_self_component_source_as_self_component( + bt_self_component_source *self_component) +{ + return __BT_UPCAST(bt_self_component, self_component); +} + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the self \bt_flt_comp + \bt_p{self_component} to the common #bt_self_component + type. + +@param[in] self_component + @parblock + Filter component to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{self_component} as a common self component. +*/ +static inline +bt_self_component *bt_self_component_filter_as_self_component( + bt_self_component_filter *self_component) +{ + return __BT_UPCAST(bt_self_component, self_component); +} + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the self \bt_sink_comp + \bt_p{self_component} to the common #bt_self_component + type. + +@param[in] self_component + @parblock + Sink component to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{self_component} as a common self component. +*/ +static inline +bt_self_component *bt_self_component_sink_as_self_component( + bt_self_component_sink *self_component) +{ + return __BT_UPCAST(bt_self_component, self_component); +} + +/*! @} */ + +/*! @} */ #ifdef __cplusplus } diff --git a/include/babeltrace2/graph/self-message-iterator.h b/include/babeltrace2/graph/self-message-iterator.h index 9aaa2767..0a6697d1 100644 --- a/include/babeltrace2/graph/self-message-iterator.h +++ b/include/babeltrace2/graph/self-message-iterator.h @@ -33,28 +33,214 @@ extern "C" { #endif -extern bt_bool bt_self_message_iterator_is_interrupted( - const bt_self_message_iterator *message_iterator); +/*! +@defgroup api-self-msg-iter Self message iterator +@ingroup api-msg-iter-cls + +@brief + Private view of a \bt_msg_iter for methods. + +The #bt_self_message_iterator type is a private view of a \bt_msg_iter +from within a \bt_msg_iter_cls method. + +Borrow the \bt_comp which provides a message iterator with +bt_self_message_iterator_borrow_component(). + +Borrow the \bt_oport on which a message iterator operates with +bt_self_message_iterator_borrow_port(). + +Set and get user data attached to a message iterator with +bt_self_message_iterator_set_data() and +bt_self_message_iterator_get_data(). + +Check whether or not a message iterator is interrupted with +bt_self_message_iterator_is_interrupted(). + +Set whether or not a message iterator can seek forward with +bt_self_message_iterator_configuration_set_can_seek_forward(). +*/ + +/*! @{ */ + +/*! +@name Types +@{ + +@typedef struct bt_self_message_iterator bt_self_message_iterator; + +@brief + Self \bt_msg_iter. + +@typedef struct bt_self_message_iterator_configuration bt_self_message_iterator_configuration; +@brief + Self \bt_msg_iter configuration. + +@} +*/ + +/*! +@name Component access +@{ +*/ + +/*! +@brief + Borrows the \bt_comp which provides the \bt_msg_iter + \bt_p{self_message_iterator}. + +@param[in] self_message_iterator + Message iterator instance. + +@returns + Component which provides \bt_p{self_message_iterator}. + +@bt_pre_not_null{self_message_iterator} +*/ extern bt_self_component * bt_self_message_iterator_borrow_component( - bt_self_message_iterator *message_iterator); + bt_self_message_iterator *self_message_iterator); +/*! @} */ + +/*! +@name Output port access +@{ +*/ + +/*! +@brief + Borrows the \bt_oport on which the \bt_msg_iter + \bt_p{self_message_iterator} operates. + +@param[in] self_message_iterator + Message iterator instance. + +@returns + Output port on which \bt_p{self_message_iterator} operates. + +@bt_pre_not_null{self_message_iterator} +*/ extern bt_self_component_port_output * bt_self_message_iterator_borrow_port( - bt_self_message_iterator *message_iterator); + bt_self_message_iterator *self_message_iterator); + +/*! @} */ +/*! +@name User data +@{ +*/ + +/*! +@brief + Sets the user data of the \bt_msg_iter \bt_p{self_message_iterator} + to \bt_p{data}. + +@param[in] self_message_iterator + Message iterator instance. +@param[in] user_data + New user data of \bt_p{self_message_iterator}. + +@bt_pre_not_null{self_message_iterator} + +@sa bt_self_message_iterator_get_data() — + Returns the user data of a message iterator. +*/ extern void bt_self_message_iterator_set_data( - bt_self_message_iterator *message_iterator, + bt_self_message_iterator *self_message_iterator, void *user_data); -extern void *bt_self_message_iterator_get_data( - const bt_self_message_iterator *message_iterator); +/*! +@brief + Returns the user data of the \bt_msg_iter + \bt_p{self_message_iterator}. + +@param[in] self_message_iterator + Message iterator instance. + +@returns + User data of \bt_p{self_message_iterator}. + +@bt_pre_not_null{self_message_iterator} + +@sa bt_self_message_iterator_set_data() — + Sets the user data of a message iterator. +*/ +extern +void *bt_self_message_iterator_get_data( + const bt_self_message_iterator *self_message_iterator); + +/*! @} */ + +/*! +@name Interruption query +@{ +*/ + +/*! +@brief + Returns whether or not the \bt_msg_iter \bt_p{self_message_iterator} + is interrupted, that is, whether or not any of its \bt_p_intr + is set. + +@param[in] self_message_iterator + Message iterator instance. + +@returns + #BT_TRUE if \bt_p{self_message_iterator} is interrupted (any of its + interrupters is set). +@bt_pre_not_null{self_message_iterator} + +@sa bt_graph_borrow_default_interrupter() — + Borrows a trace processing graph's default interrupter. +@sa bt_graph_add_interrupter() — + Adds an interrupter to a graph. +*/ +extern bt_bool bt_self_message_iterator_is_interrupted( + const bt_self_message_iterator *self_message_iterator); + +/*! @} */ + +/*! +@name Configuration +@{ +*/ + +/*! +@brief + Sets whether or not the \bt_msg_iter of which the configuration + is \bt_p{configuration} can seek forward. + +A message iterator can seek forward if all the \bt_p_msg of its +message sequence have some \bt_cs. + +@attention + You can only call this function during the execution of a + message iterator's + \ref api-msg-iter-cls-meth-init "initialization method". + +@param[in] configuration + Configuration of the message iterator of which to set whether or + not it can seek forward. +@param[in] can_seek_forward + #BT_TRUE to make the message iterator of which the configuration is + \bt_p{configuration} forward-seekable. + +@bt_pre_not_null{configuration} + +@sa bt_message_iterator_can_seek_forward() — + Returns whether or not a message iterator can seek forward. +*/ extern void bt_self_message_iterator_configuration_set_can_seek_forward( - bt_self_message_iterator_configuration *config, + bt_self_message_iterator_configuration *configuration, bt_bool can_seek_forward); +/*! @} */ + +/*! @} */ + #ifdef __cplusplus } #endif diff --git a/include/babeltrace2/integer-range-set-const.h b/include/babeltrace2/integer-range-set-const.h deleted file mode 100644 index cbf9f33a..00000000 --- a/include/babeltrace2/integer-range-set-const.h +++ /dev/null @@ -1,133 +0,0 @@ -#ifndef BABELTRACE2_INTEGER_RANGE_SET_CONST_H -#define BABELTRACE2_INTEGER_RANGE_SET_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern uint64_t bt_integer_range_unsigned_get_lower( - const bt_integer_range_unsigned *range); - -extern uint64_t bt_integer_range_unsigned_get_upper( - const bt_integer_range_unsigned *range); - -extern int64_t bt_integer_range_signed_get_lower( - const bt_integer_range_signed *range); - -extern int64_t bt_integer_range_signed_get_upper( - const bt_integer_range_signed *range); - -extern bt_bool bt_integer_range_unsigned_is_equal( - const bt_integer_range_unsigned *range_a, - const bt_integer_range_unsigned *range_b); - -extern bt_bool bt_integer_range_signed_is_equal( - const bt_integer_range_signed *range_a, - const bt_integer_range_signed *range_b); - -static inline -const bt_integer_range_set *bt_integer_range_set_unsigned_as_range_set_const( - const bt_integer_range_set_unsigned *range_set) -{ - return __BT_UPCAST_CONST(bt_integer_range_set, range_set); -} - -static inline -const bt_integer_range_set *bt_integer_range_set_signed_as_range_set_const( - const bt_integer_range_set_signed *range_set) -{ - return __BT_UPCAST_CONST(bt_integer_range_set, range_set); -} - -extern uint64_t bt_integer_range_set_get_range_count(const bt_integer_range_set *range_set); - -extern const bt_integer_range_unsigned * -bt_integer_range_set_unsigned_borrow_range_by_index_const( - const bt_integer_range_set_unsigned *range_set, uint64_t index); - -extern const bt_integer_range_signed * -bt_integer_range_set_signed_borrow_range_by_index_const( - const bt_integer_range_set_signed *range_set, uint64_t index); - -extern bt_bool bt_integer_range_set_unsigned_is_equal( - const bt_integer_range_set_unsigned *range_set_a, - const bt_integer_range_set_unsigned *range_set_b); - -extern bt_bool bt_integer_range_set_signed_is_equal( - const bt_integer_range_set_signed *range_set_a, - const bt_integer_range_set_signed *range_set_b); - -extern void bt_integer_range_set_unsigned_get_ref( - const bt_integer_range_set_unsigned *range_set); - -extern void bt_integer_range_set_unsigned_put_ref( - const bt_integer_range_set_unsigned *range_set); - -#define BT_INTEGER_RANGE_SET_UNSIGNED_PUT_REF_AND_RESET(_var) \ - do { \ - bt_integer_range_set_unsigned_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_INTEGER_RANGE_SET_UNSIGNED_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_integer_range_set_unsigned_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - -extern void bt_integer_range_set_signed_get_ref( - const bt_integer_range_set_signed *range_set); - -extern void bt_integer_range_set_signed_put_ref( - const bt_integer_range_set_signed *range_set); - -#define BT_INTEGER_RANGE_SET_SIGNED_PUT_REF_AND_RESET(_var) \ - do { \ - bt_integer_range_set_signed_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_INTEGER_RANGE_SET_SIGNED_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_integer_range_set_signed_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_INTEGER_RANGE_SET_CONST_H */ diff --git a/include/babeltrace2/integer-range-set.h b/include/babeltrace2/integer-range-set.h index f1d9a56c..8eb13434 100644 --- a/include/babeltrace2/integer-range-set.h +++ b/include/babeltrace2/integer-range-set.h @@ -31,29 +31,757 @@ #include #include -#include #ifdef __cplusplus extern "C" { #endif -extern bt_integer_range_set_unsigned *bt_integer_range_set_unsigned_create(void); +/*! +@defgroup api-int-rs Integer range sets + +@brief + Sets of unsigned and signed 64-bit integer ranges. + +An integer range set +is an \em unordered set of integer ranges. + +An integer range represents all the +integers \b 𝑥 which satisfy +(lower value â‰¤ ð‘¥ â‰¤ upper value). + +For example, an unsigned integer range set could contain the ranges +[5, 14], [199, 2001], and [1976, 3000]. + +This integer range set API offers unsigned and signed 64-bit integer +ranges and integer range sets with dedicated C types: + +- #bt_integer_range_unsigned +- #bt_integer_range_signed +- #bt_integer_range_set_unsigned +- #bt_integer_range_set_signed + +This API uses the \em abstract #bt_integer_range_set type for common +properties and operations (for example, +bt_integer_range_set_get_range_count()). +\ref api-fund-c-typing "Upcast" a specific +integer range set to the #bt_integer_range_set type with +bt_integer_range_set_unsigned_as_range_set_const() or +bt_integer_range_set_signed_as_range_set_const(). + +An integer range set is a \ref api-fund-shared-object "shared object": +get a new reference with bt_integer_range_set_unsigned_get_ref() or +bt_integer_range_set_signed_get_ref() and put an existing reference with +bt_integer_range_set_unsigned_put_ref() or +bt_integer_range_set_signed_put_ref(). + +An integer range is a \ref api-fund-unique-object "unique object": it +belongs to the integer range set which contains it. + +Some library functions \ref api-fund-freezing "freeze" integer range +sets on success. The documentation of those functions indicate this +postcondition. + +Create an empty integer range set with +bt_integer_range_set_unsigned_create() or +bt_integer_range_set_signed_create(). + +Add an integer range to an integer range set with +bt_integer_range_set_unsigned_add_range() or +bt_integer_range_set_signed_add_range(). Although integer ranges can +overlap, specific functions of the \bt_api expect an integer range set +with non-overlapping integer ranges. + +As of \bt_name_version_min_maj, you cannot remove an existing +integer range from an integer range set. + +Check that two integer ranges are equal with +bt_integer_range_unsigned_is_equal() or +bt_integer_range_signed_is_equal(). + +Check that two integer range sets are equal with +bt_integer_range_set_unsigned_is_equal() or +bt_integer_range_set_signed_is_equal(). +*/ + +/*! @{ */ + +/*! +@name Types +@{ + +@typedef struct bt_integer_range_unsigned bt_integer_range_unsigned + +@brief + Unsigned 64-bit integer range. + + +@typedef struct bt_integer_range_signed bt_integer_range_signed + +@brief + Signed 64-bit integer range. + + +@typedef struct bt_integer_range_set bt_integer_range_set + +@brief + Set of 64-bit integer ranges. + +This is an abstract type for common properties and operations. See \ref +api-fund-c-typing to learn more about conceptual object type +inheritance. + + +@typedef struct bt_integer_range_set_unsigned bt_integer_range_set_unsigned; + +@brief + Set of unsigned 64-bit integer ranges. + + +@typedef struct bt_integer_range_set_signed bt_integer_range_set_signed; + +@brief + Set of signed 64-bit integer ranges. + +@} +*/ + +/*! +@name Unsigned integer range +@{ +*/ + +/*! +@brief + Returns the lower value of the unsigned integer range + \bt_p{int_range}. + +The returned lower value is included in \bt_p{int_range}. + +@param[in] int_range + Unsigned integer range of which to get the lower value. + +@returns + Lower value of \bt_p{int_range}. + +@bt_pre_not_null{int_range} +@bt_pre_is_bool_val{int_range} +*/ +extern uint64_t bt_integer_range_unsigned_get_lower( + const bt_integer_range_unsigned *int_range); +/*! +@brief + Returns the upper value of the unsigned integer range + \bt_p{int_range}. + +The returned upper value is included in \bt_p{int_range}. + +@param[in] int_range + Unsigned integer range of which to get the upper value. + +@returns + Upper value of \bt_p{int_range}. + +@bt_pre_not_null{int_range} +@bt_pre_is_bool_val{int_range} +*/ +extern uint64_t bt_integer_range_unsigned_get_upper( + const bt_integer_range_unsigned *int_range); + +/*! +@brief + Returns whether or not the unsigned integer range + \bt_p{a_int_range} is equal to \bt_p{b_int_range}. + +Two unsigned integer ranges are considered equal if they have the same +lower and upper values. + +@param[in] a_int_range + Unsigned integer range A. +@param[in] b_int_range + Unsigned integer range B. + +@returns + #BT_TRUE if \bt_p{a_int_range} is equal to + \bt_p{b_int_range}. + +@bt_pre_not_null{a_int_range} +@bt_pre_not_null{b_int_range} +*/ +extern bt_bool bt_integer_range_unsigned_is_equal( + const bt_integer_range_unsigned *a_int_range, + const bt_integer_range_unsigned *b_int_range); + +/*! @} */ + +/*! +@name Signed integer range +@{ +*/ + +/*! +@brief + Returns the lower value of the signed integer range + \bt_p{int_range}. + +The returned lower value is included in \bt_p{int_range}. + +@param[in] int_range + Signed integer range of which to get the lower value. + +@returns + Lower value of \bt_p{int_range}. + +@bt_pre_not_null{int_range} +@bt_pre_is_bool_val{int_range} +*/ +extern int64_t bt_integer_range_signed_get_lower( + const bt_integer_range_signed *int_range); + +/*! +@brief + Returns the upper value of the signed integer range + \bt_p{int_range}. + +The returned upper value is included in \bt_p{int_range}. + +@param[in] int_range + Signed integer range of which to get the upper value. + +@returns + Upper value of \bt_p{int_range}. + +@bt_pre_not_null{int_range} +@bt_pre_is_bool_val{int_range} +*/ +extern int64_t bt_integer_range_signed_get_upper( + const bt_integer_range_signed *int_range); + +/*! +@brief + Returns whether or not the signed integer range + \bt_p{a_int_range} is equal to \bt_p{b_int_range}. + +Two signed integer ranges are considered equal if they have the same +lower and upper values. + +@param[in] a_int_range + Signed integer range A. +@param[in] b_int_range + Signed integer range B. + +@returns + #BT_TRUE if \bt_p{a_int_range} is equal to + \bt_p{b_int_range}. + +@bt_pre_not_null{a_int_range} +@bt_pre_not_null{b_int_range} +*/ +extern bt_bool bt_integer_range_signed_is_equal( + const bt_integer_range_signed *a_int_range, + const bt_integer_range_signed *b_int_range); + +/*! @} */ + +/*! +@name Integer range set: common +@{ +*/ + +/*! +@brief + Status codes for bt_integer_range_set_unsigned_add_range() and + bt_integer_range_set_signed_add_range(). +*/ typedef enum bt_integer_range_set_add_range_status { - BT_INTEGER_RANGE_SET_ADD_RANGE_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, - BT_INTEGER_RANGE_SET_ADD_RANGE_STATUS_OK = __BT_FUNC_STATUS_OK, + /*! + @brief + Success. + */ + BT_INTEGER_RANGE_SET_ADD_RANGE_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_INTEGER_RANGE_SET_ADD_RANGE_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, } bt_integer_range_set_add_range_status; -extern bt_integer_range_set_add_range_status bt_integer_range_set_unsigned_add_range( - bt_integer_range_set_unsigned *range_set, +/*! +@brief + Returns the number of integer ranges contained in the integer + range set \bt_p{int_range_set}. + +@note + The parameter \bt_p{int_range_set} has the abstract type + #bt_integer_range_set: use + bt_integer_range_set_unsigned_as_range_set_const() or + bt_integer_range_set_signed_as_range_set_const() to upcast a + specific integer range set to this type. + +@param[in] int_range_set + Integer range set of which to get the number of contained integer + ranges. + +@returns + Number of contained integer ranges in \bt_p{int_range_set}. + +@bt_pre_not_null{int_range_set} +*/ +extern uint64_t bt_integer_range_set_get_range_count( + const bt_integer_range_set *int_range_set); + +/*! @} */ + +/*! +@name Unsigned integer range set +@{ +*/ + +/*! +@brief + Creates and returns an empty set of unsigned 64-bit integer ranges. + +@returns + New unsigned integer range set, or \c NULL on memory error. +*/ +extern bt_integer_range_set_unsigned *bt_integer_range_set_unsigned_create(void); + +/*! +@brief + Adds an unsigned 64-bit integer range having the lower value + \bt_p{lower} and the upper value \bt_p{upper} to the unsigned + integer range set + \bt_p{int_range_set}. + +The values \bt_p{lower} and \bt_p{upper} are included in the unsigned +integer range to add to \bt_p{int_range_set}. + +@param[in] int_range_set + Unsigned integer range set to which to add an unsigned integer + range. +@param[in] lower + Lower value (included) of the unsigned integer range to add to + \bt_p{int_range_set}. +@param[in] upper + Upper value (included) of the unsigned integer range to add to + \bt_p{int_range_set}. + +@retval #BT_INTEGER_RANGE_SET_ADD_RANGE_STATUS_OK + Success. +@retval #BT_INTEGER_RANGE_SET_ADD_RANGE_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{int_range_set} +@bt_pre_hot{int_range_set} +@pre + \bt_p{lower} ≤ \bt_p{upper}. +*/ +extern bt_integer_range_set_add_range_status +bt_integer_range_set_unsigned_add_range( + bt_integer_range_set_unsigned *int_range_set, uint64_t lower, uint64_t upper); +/*! +@brief + Borrows the unsigned integer range at index \bt_p{index} from the + unsigned integer range set \bt_p{int_range_set}. + +@param[in] int_range_set + Unsigned integer range set from which to borrow the unsigned integer + range at index \bt_p{index}. +@param[in] index + Index of the unsigned integer range to borrow from + \bt_p{int_range_set}. + +@returns + @parblock + \em Borrowed reference of the unsigned integer range of + \bt_p{int_range_set} at index \bt_p{index}. + + The returned pointer remains valid until \bt_p{int_range_set} is + modified. + @endparblock + +@bt_pre_not_null{int_range_set} +@pre + \bt_p{index} is less than the number of unsigned integer ranges in + \bt_p{int_range_set} (as returned by + bt_integer_range_set_get_range_count()). +*/ +extern const bt_integer_range_unsigned * +bt_integer_range_set_unsigned_borrow_range_by_index_const( + const bt_integer_range_set_unsigned *int_range_set, + uint64_t index); + +/*! +@brief + Returns whether or not the unsigned integer range set + \bt_p{int_range_set_a} is equal to \bt_p{int_range_set_b}. + +Two unsigned integer range sets are considered equal if they contain the +exact same unsigned integer ranges, whatever the order. In other words, +an unsigned integer range set containing [2, 9] and [10, 15] +is \em not equal to an unsigned integer range containing [2, 15]. + +@param[in] int_range_set_a + Unsigned integer range set A. +@param[in] int_range_set_b + Unsigned integer range set B. + +@returns + #BT_TRUE if \bt_p{int_range_set_a} is equal to + \bt_p{int_range_set_b}. + +@bt_pre_not_null{int_range_set_a} +@bt_pre_not_null{int_range_set_b} +*/ +extern bt_bool bt_integer_range_set_unsigned_is_equal( + const bt_integer_range_set_unsigned *int_range_set_a, + const bt_integer_range_set_unsigned *int_range_set_b); + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the unsigned integer range set + \bt_p{int_range_set} to the abstract #bt_integer_range_set type. + +@param[in] int_range_set + @parblock + Unsigned integer range set to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{int_range_set} as an abstract integer range set. +*/ +static inline +const bt_integer_range_set *bt_integer_range_set_unsigned_as_range_set_const( + const bt_integer_range_set_unsigned *int_range_set) +{ + return __BT_UPCAST_CONST(bt_integer_range_set, int_range_set); +} + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the unsigned integer range set \bt_p{int_range_set}. + +@param[in] int_range_set + @parblock + Unsigned integer range set of which to increment the reference + count. + + Can be \c NULL. + @endparblock + +@sa bt_integer_range_set_unsigned_put_ref() — + Decrements the reference count of an unsigned integer range set. +*/ +extern void bt_integer_range_set_unsigned_get_ref( + const bt_integer_range_set_unsigned *int_range_set); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the unsigned integer range set \bt_p{int_range_set}. + +@param[in] int_range_set + @parblock + Unsigned integer range set of which to decrement the reference + count. + + Can be \c NULL. + @endparblock + +@sa bt_integer_range_set_unsigned_get_ref() — + Increments the reference count of an unsigned integer range set. +*/ +extern void bt_integer_range_set_unsigned_put_ref( + const bt_integer_range_set_unsigned *int_range_set); + +/*! +@brief + Decrements the reference count of the unsigned integer range set + \bt_p{_int_range_set}, and then sets \bt_p{_int_range_set} to \c + NULL. + +@param _int_range_set + @parblock + Unsigned integer range set of which to decrement the reference + count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_int_range_set} +*/ +#define BT_INTEGER_RANGE_SET_UNSIGNED_PUT_REF_AND_RESET(_int_range_set) \ + do { \ + bt_integer_range_set_unsigned_put_ref(_int_range_set); \ + (_int_range_set) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the unsigned integer range set + \bt_p{_dst}, sets \bt_p{_dst} to \bt_p{_src}, and then sets + \bt_p{_src} to \c NULL. + +This macro effectively moves an unsigned integer range set reference +from the expression \bt_p{_src} to the expression \bt_p{_dst}, putting +the existing \bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_INTEGER_RANGE_SET_UNSIGNED_MOVE_REF(_dst, _src) \ + do { \ + bt_integer_range_set_unsigned_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! +@name Signed integer range set +@{ +*/ + +/*! +@brief + Creates and returns an empty set of signed 64-bit integer ranges. + +@returns + New signed integer range set, or \c NULL on memory error. +*/ extern bt_integer_range_set_signed *bt_integer_range_set_signed_create(void); -extern bt_integer_range_set_add_range_status bt_integer_range_set_signed_add_range( - bt_integer_range_set_signed *range_set, +/*! +@brief + Adds a signed 64-bit integer range having the lower value + \bt_p{lower} and the upper value \bt_p{upper} to the signed + integer range set + \bt_p{int_range_set}. + +The values \bt_p{lower} and \bt_p{upper} are included in the signed +integer range to add to \bt_p{int_range_set}. + +@param[in] int_range_set + Signed integer range set to which to add a signed integer + range. +@param[in] lower + Lower value (included) of the signed integer range to add to + \bt_p{int_range_set}. +@param[in] upper + Upper value (included) of the signed integer range to add to + \bt_p{int_range_set}. + +@retval #BT_INTEGER_RANGE_SET_ADD_RANGE_STATUS_OK + Success. +@retval #BT_INTEGER_RANGE_SET_ADD_RANGE_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{int_range_set} +@bt_pre_hot{int_range_set} +@pre + \bt_p{lower} ≤ \bt_p{upper}. +*/ +extern bt_integer_range_set_add_range_status +bt_integer_range_set_signed_add_range( + bt_integer_range_set_signed *int_range_set, int64_t lower, int64_t upper); +/*! +@brief + Borrows the signed integer range at index \bt_p{index} from the + signed integer range set \bt_p{int_range_set}. + +@param[in] int_range_set + Signed integer range set from which to borrow the signed integer + range at index \bt_p{index}. +@param[in] index + Index of the signed integer range to borrow from + \bt_p{int_range_set}. + +@returns + @parblock + \em Borrowed reference of the signed integer range of + \bt_p{int_range_set} at index \bt_p{index}. + + The returned pointer remains valid until \bt_p{int_range_set} is + modified. + @endparblock + +@bt_pre_not_null{int_range_set} +@pre + \bt_p{index} is less than the number of signed integer ranges in + \bt_p{int_range_set} (as returned by + bt_integer_range_set_get_range_count()). +*/ +extern const bt_integer_range_signed * +bt_integer_range_set_signed_borrow_range_by_index_const( + const bt_integer_range_set_signed *int_range_set, uint64_t index); + +/*! +@brief + Returns whether or not the signed integer range set + \bt_p{int_range_set_a} is equal to \bt_p{int_range_set_b}. + +Two signed integer range sets are considered equal if they contain the +exact same signed integer ranges, whatever the order. In other words, +a signed integer range set containing [-57, 23] and [24, 42] +is \em not equal to a signed integer range containing [-57, 42]. + +@param[in] int_range_set_a + Signed integer range set A. +@param[in] int_range_set_b + Signed integer range set B. + +@returns + #BT_TRUE if \bt_p{int_range_set_a} is equal to + \bt_p{int_range_set_b}. + +@bt_pre_not_null{int_range_set_a} +@bt_pre_not_null{int_range_set_b} +*/ +extern bt_bool bt_integer_range_set_signed_is_equal( + const bt_integer_range_set_signed *int_range_set_a, + const bt_integer_range_set_signed *int_range_set_b); + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the signed integer range set + \bt_p{int_range_set} to the abstract #bt_integer_range_set type. + +@param[in] int_range_set + @parblock + Signed integer range set to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{int_range_set} as an abstract integer range set. +*/ +static inline +const bt_integer_range_set *bt_integer_range_set_signed_as_range_set_const( + const bt_integer_range_set_signed *int_range_set) +{ + return __BT_UPCAST_CONST(bt_integer_range_set, int_range_set); +} + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the signed integer range set \bt_p{int_range_set}. + +@param[in] int_range_set + @parblock + Signed integer range set of which to increment the reference + count. + + Can be \c NULL. + @endparblock + +@sa bt_integer_range_set_signed_put_ref() — + Decrements the reference count of a signed integer range set. +*/ +extern void bt_integer_range_set_signed_get_ref( + const bt_integer_range_set_signed *int_range_set); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the signed integer range set \bt_p{int_range_set}. + +@param[in] int_range_set + @parblock + Signed integer range set of which to decrement the reference + count. + + Can be \c NULL. + @endparblock + +@sa bt_integer_range_set_signed_get_ref() — + Increments the reference count of a signed integer range set. +*/ +extern void bt_integer_range_set_signed_put_ref( + const bt_integer_range_set_signed *int_range_set); + +/*! +@brief + Decrements the reference count of the signed integer range set + \bt_p{_int_range_set}, and then sets \bt_p{_int_range_set} to \c + NULL. + +@param _int_range_set + @parblock + Signed integer range set of which to decrement the reference + count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_int_range_set} +*/ +#define BT_INTEGER_RANGE_SET_SIGNED_PUT_REF_AND_RESET(_int_range_set) \ + do { \ + bt_integer_range_set_signed_put_ref(_int_range_set); \ + (_int_range_set) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the signed integer range set + \bt_p{_dst}, sets \bt_p{_dst} to \bt_p{_src}, and then sets + \bt_p{_src} to \c NULL. + +This macro effectively moves a signed integer range set reference +from the expression \bt_p{_src} to the expression \bt_p{_dst}, putting +the existing \bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_INTEGER_RANGE_SET_SIGNED_MOVE_REF(_dst, _src) \ + do { \ + bt_integer_range_set_signed_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! @} */ + #ifdef __cplusplus } #endif diff --git a/include/babeltrace2/logging.h b/include/babeltrace2/logging.h index 8091ec43..1c931743 100644 --- a/include/babeltrace2/logging.h +++ b/include/babeltrace2/logging.h @@ -33,116 +33,210 @@ extern "C" { #endif -/** -@defgroup logging Logging -@ingroup apiref -@brief Logging. +/*! +@defgroup api-logging Logging -@code -#include -@endcode +@brief + Logging level enumerators and library logging control. + +The logging API offers logging level enumerators (#bt_logging_level) +as well as functions to control libbabeltrace2's internal logging. + +@note + This API does \em not offer macros and functions to write logging + statements: as of \bt_name_version_min_maj, the actual mechanism to + log is implementation-defined for each user \bt_plugin. + +libbabeltrace2 contains many hundreds of logging statements to help you +follow and debug your plugin or program. + +The library's initial logging level is controlled by the +\c LIBBABELTRACE2_INIT_LOG_LEVEL environment variable. If this +environment variable is not set at library load time, the library's +initial logging level is #BT_LOGGING_LEVEL_NONE. See +\ref api-fund-logging to learn more. + +Set libbabeltrace2's current logging level with +bt_logging_set_global_level(). + +\anchor api-logging-extra-lib bt_logging_set_global_level() only +controls libbabeltrace2's logging level; it does \em +not control the logging level of: + +- Individual \bt_p_comp: bt_graph_add_source_component(), + bt_graph_add_source_component_with_initialize_method_data(), + bt_graph_add_filter_component(), + bt_graph_add_filter_component_with_initialize_method_data(), + bt_graph_add_sink_component(), and + bt_graph_add_sink_component_with_initialize_method_data() control + this. -The functions in this module control the Babeltrace library's logging -behaviour. +- A \ref api-qexec "query operation": + bt_query_executor_set_logging_level() controls this. -You can set the current global log level of the library with -bt_logging_set_global_level(). Note that, if the level you set is below -the minimal logging level (configured at build time, which you can get -with bt_logging_get_minimal_level()), the logging statement between the -current global log level and the minimal log level are not executed. +- The bt_get_greatest_operative_mip_version() operation: its + \bt_p{logging_level} parameter controls this. -@file -@brief Logging functions. -@sa logging +As of \bt_name_version_min_maj, there's no module-specific logging level +control: bt_logging_set_global_level() sets the logging level of all the +library's modules. -@addtogroup logging -@{ +libbabeltrace2 writes its logging statements to the standard error +stream. A logging line looks like this: + +@code{.unparsed} +05-11 00:58:03.691 23402 23402 D VALUES bt_value_destroy@values.c:498 Destroying value: addr=0xb9c3eb0 +@endcode + +See \ref api-fund-logging to learn more about the logging statement +line's format. + +You can set a \em minimal logging level at the \bt_name project's build +time (see \ref api-fund-logging to learn how). The logging statements +with a level that's less severe than the minimal logging level are \em +not built. For example, if the minimal logging level is +#BT_LOGGING_LEVEL_INFO, the #BT_LOGGING_LEVEL_TRACE and +#BT_LOGGING_LEVEL_DEBUG logging statements are not built. Use +bt_logging_get_minimal_level() to get the library's minimal logging +level. */ -/** -@brief Log levels. +/*! @{ */ + +/*! +@brief + Logging level enumerators. */ typedef enum bt_logging_level { - /// Additional, low-level debugging context information. + /*! + @brief + \em TRACE level. + + Low-level debugging context information. + + The \em TRACE logging statements can significantly + impact performance. + */ BT_LOGGING_LEVEL_TRACE = __BT_LOGGING_LEVEL_TRACE, - /** - Debugging information, only useful when searching for the - cause of a bug. + /*! + @brief + \em DEBUG level. + + Debugging information, with a higher level of details than the + \em TRACE level. + + The \em DEBUG logging statements do not significantly + impact performance. */ BT_LOGGING_LEVEL_DEBUG = __BT_LOGGING_LEVEL_DEBUG, - /** - Non-debugging information and failure to load optional - subsystems. + /*! + @brief + \em INFO level. + + Informational messages that highlight progress or important + states of the application, plugins, or library. + + The \em INFO logging statements do not significantly + impact performance. */ BT_LOGGING_LEVEL_INFO = __BT_LOGGING_LEVEL_INFO, - /** - Errors caused by a bad usage of the library, that is, a - non-observance of the documented function preconditions. + /*! + @brief + \em WARNING level. - The library's and object's states remain consistent when a - warning is issued. + Unexpected situations which still allow the execution to + continue. + + The \em WARNING logging statements do not significantly + impact performance. */ BT_LOGGING_LEVEL_WARNING = __BT_LOGGING_LEVEL_WARNING, - /** - An important error from which the library cannot recover, but - the executed stack of functions can still return cleanly. + /*! + @brief + \em ERROR level. + + Errors that might still allow the execution to continue. + + Usually, once one or more errors are reported at this level, the + application, plugin, or library won't perform any more useful + task, but it should still exit cleanly. + + The \em ERROR logging statements do not significantly + impact performance. */ BT_LOGGING_LEVEL_ERROR = __BT_LOGGING_LEVEL_ERROR, - /** - The library cannot continue to work in this condition: it must - terminate immediately, without even returning to the user's - execution. + /*! + @brief + \em FATAL level. + + Severe errors that lead the execution to abort immediately. + + The \em FATAL logging statements do not significantly + impact performance. */ BT_LOGGING_LEVEL_FATAL = __BT_LOGGING_LEVEL_FATAL, - /// Logging is disabled. + /*! + @brief + Logging is disabled. + */ BT_LOGGING_LEVEL_NONE = __BT_LOGGING_LEVEL_NONE, } bt_logging_level; -/** -@brief Returns the minimal log level of the Babeltrace library. +/*! +@brief + Sets the logging level of all the libbabeltrace2 modules to + \bt_p{logging_level}. -The minimal log level is defined at the library's build time. Any -logging statement with a level below the minimal log level is not -compiled. This means that it is useless, although possible, to set the -global log level with bt_logging_set_global_level() below this level. +The library's global logging level +\ref api-logging-extra-lib "does not affect" the logging level of +individual components and query operations. -@returns Minimal, build time log level. +@param[in] logging_level + New library's global logging level. -@sa bt_logging_get_global_level(): Returns the current global log level. +@sa bt_logging_get_global_level() — + Returns the current library's global logging level. */ -extern bt_logging_level bt_logging_get_minimal_level(void); +extern void bt_logging_set_global_level(bt_logging_level logging_level); -/** -@brief Returns the current global log level of the Babeltrace library. +/*! +@brief + Returns the current logging level of all the libbabeltrace2 modules. -@returns Current global log level. +@returns + Library's current global logging level. -@sa bt_logging_set_global_level(): Sets the current global log level. -@sa bt_logging_get_minimal_level(): Returns the minimal log level. +@sa bt_logging_set_global_level() — + Sets the current library's global logging level. */ extern bt_logging_level bt_logging_get_global_level(void); -/** -@brief Sets the current global log level of the Babeltrace library - to \p log_level. +/*! +@brief + Returns the library's minimal (build-time) logging level. + +The library logging statements with a level that's less severe than the +minimal logging level are \em not built. -If \p log_level is below what bt_logging_get_minimal_level() returns, -the logging statements with a level between \p log_level and the minimal -log level cannot be executed. +For example, if the minimal logging level is #BT_LOGGING_LEVEL_INFO, the +#BT_LOGGING_LEVEL_TRACE and #BT_LOGGING_LEVEL_DEBUG logging statements +are not built. -@param[in] log_level Library's new global log level. +@returns + Library's minimal logging level. -@sa bt_logging_get_global_level(): Returns the global log level. +@sa bt_logging_get_global_level() — + Returns the current library's global logging level. */ -extern void bt_logging_set_global_level(bt_logging_level log_level); +extern bt_logging_level bt_logging_get_minimal_level(void); -/** @} */ +/*! @} */ #ifdef __cplusplus } diff --git a/include/babeltrace2/plugin/plugin-const.h b/include/babeltrace2/plugin/plugin-const.h deleted file mode 100644 index 65b66def..00000000 --- a/include/babeltrace2/plugin/plugin-const.h +++ /dev/null @@ -1,164 +0,0 @@ -#ifndef BABELTRACE2_PLUGIN_PLUGIN_CONST_H -#define BABELTRACE2_PLUGIN_PLUGIN_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include -#include - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum bt_plugin_find_status { - BT_PLUGIN_FIND_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_PLUGIN_FIND_STATUS_NOT_FOUND = __BT_FUNC_STATUS_NOT_FOUND, - BT_PLUGIN_FIND_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, - BT_PLUGIN_FIND_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, -} bt_plugin_find_status; - -extern bt_plugin_find_status bt_plugin_find(const char *plugin_name, - bt_bool find_in_std_env_var, bt_bool find_in_user_dir, - bt_bool find_in_sys_dir, bt_bool find_in_static, - bt_bool fail_on_load_error, const bt_plugin **plugin); - -typedef enum bt_plugin_find_all_status { - BT_PLUGIN_FIND_ALL_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_PLUGIN_FIND_ALL_STATUS_NOT_FOUND = __BT_FUNC_STATUS_NOT_FOUND, - BT_PLUGIN_FIND_ALL_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, - BT_PLUGIN_FIND_ALL_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, -} bt_plugin_find_all_status; - -bt_plugin_find_all_status bt_plugin_find_all(bt_bool find_in_std_env_var, - bt_bool find_in_user_dir, bt_bool find_in_sys_dir, - bt_bool find_in_static, bt_bool fail_on_load_error, - const bt_plugin_set **plugin_set); - -typedef enum bt_plugin_find_all_from_file_status { - BT_PLUGIN_FIND_ALL_FROM_FILE_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_PLUGIN_FIND_ALL_FROM_FILE_STATUS_NOT_FOUND = __BT_FUNC_STATUS_NOT_FOUND, - BT_PLUGIN_FIND_ALL_FROM_FILE_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, - BT_PLUGIN_FIND_ALL_FROM_FILE_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, -} bt_plugin_find_all_from_file_status; - -extern bt_plugin_find_all_from_file_status bt_plugin_find_all_from_file( - const char *path, bt_bool fail_on_load_error, - const bt_plugin_set **plugin_set); - -typedef enum bt_plugin_find_all_from_dir_status { - BT_PLUGIN_FIND_ALL_FROM_DIR_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_PLUGIN_FIND_ALL_FROM_DIR_STATUS_NOT_FOUND = __BT_FUNC_STATUS_NOT_FOUND, - BT_PLUGIN_FIND_ALL_FROM_DIR_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, - BT_PLUGIN_FIND_ALL_FROM_DIR_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, -} bt_plugin_find_all_from_dir_status; - -extern bt_plugin_find_all_from_dir_status bt_plugin_find_all_from_dir( - const char *path, bt_bool recurse, bt_bool fail_on_load_error, - const bt_plugin_set **plugin_set); - -typedef enum bt_plugin_find_all_from_static_status { - BT_PLUGIN_FIND_ALL_FROM_STATIC_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_PLUGIN_FIND_ALL_FROM_STATIC_STATUS_NOT_FOUND = __BT_FUNC_STATUS_NOT_FOUND, - BT_PLUGIN_FIND_ALL_FROM_STATIC_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, - BT_PLUGIN_FIND_ALL_FROM_STATIC_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, -} bt_plugin_find_all_from_static_status; - -extern bt_plugin_find_all_from_static_status bt_plugin_find_all_from_static( - bt_bool fail_on_load_error, const bt_plugin_set **plugin_set); - -extern const char *bt_plugin_get_name(const bt_plugin *plugin); - -extern const char *bt_plugin_get_author(const bt_plugin *plugin); - -extern const char *bt_plugin_get_license(const bt_plugin *plugin); - -extern const char *bt_plugin_get_description(const bt_plugin *plugin); - -extern const char *bt_plugin_get_path(const bt_plugin *plugin); - -extern bt_property_availability bt_plugin_get_version( - const bt_plugin *plugin, unsigned int *major, - unsigned int *minor, unsigned int *patch, const char **extra); - -extern uint64_t bt_plugin_get_source_component_class_count( - const bt_plugin *plugin); - -extern uint64_t bt_plugin_get_filter_component_class_count( - const bt_plugin *plugin); - -extern uint64_t bt_plugin_get_sink_component_class_count( - const bt_plugin *plugin); - -extern const bt_component_class_source * -bt_plugin_borrow_source_component_class_by_index_const( - const bt_plugin *plugin, uint64_t index); - -extern const bt_component_class_filter * -bt_plugin_borrow_filter_component_class_by_index_const( - const bt_plugin *plugin, uint64_t index); - -extern const bt_component_class_sink * -bt_plugin_borrow_sink_component_class_by_index_const( - const bt_plugin *plugin, uint64_t index); - -extern const bt_component_class_source * -bt_plugin_borrow_source_component_class_by_name_const( - const bt_plugin *plugin, const char *name); - -extern const bt_component_class_filter * -bt_plugin_borrow_filter_component_class_by_name_const( - const bt_plugin *plugin, const char *name); - -extern const bt_component_class_sink * -bt_plugin_borrow_sink_component_class_by_name_const( - const bt_plugin *plugin, const char *name); - -extern void bt_plugin_get_ref(const bt_plugin *plugin); - -extern void bt_plugin_put_ref(const bt_plugin *plugin); - -#define BT_PLUGIN_PUT_REF_AND_RESET(_var) \ - do { \ - bt_plugin_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_PLUGIN_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_plugin_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_PLUGIN_PLUGIN_CONST_H */ diff --git a/include/babeltrace2/plugin/plugin-dev.h b/include/babeltrace2/plugin/plugin-dev.h index c78288b8..71372536 100644 --- a/include/babeltrace2/plugin/plugin-dev.h +++ b/include/babeltrace2/plugin/plugin-dev.h @@ -29,10 +29,7 @@ #include -#include -#include -#include -#include +#include #include #include @@ -51,19 +48,2386 @@ extern "C" { #endif -/* Plugin initialization function type */ +/*! +@defgroup api-plugin-dev Plugin development + +@brief + Shared object plugin development. + +This module offers macros to create a \bt_name shared object plugin. + +Behind the scenes, the BT_PLUGIN_*() macros of this module +create and fill global tables which are located in sections of the +shared object with specific names. The \ref api-plugin functions can +load the resulting shared object file and create corresponding +\bt_plugin objects. + +See \ref guide-comp-link-plugin-so. + +

    Plugin definition C file structure

    + +The structure of a \bt_name plugin definition C file is as such: + +
      +
    1. + Start with + + @code + BT_PLUGIN_MODULE(); + @endcode +
    2. + +
    3. + Define a \bt_name plugin with BT_PLUGIN() if the plugin's name is a + valid C identifier, or with BT_PLUGIN_WITH_ID() otherwise. + + See \ref api-plugin-dev-custom-plugin-id "Custom plugin ID" to + learn more about plugin IDs. + + @note + When you use BT_PLUGIN(), the plugin's ID is auto. +
    4. + +
    5. + \bt_dt_opt Use any of the following macros (or their + *_WITH_ID() counterpart) \em once to set the properties + of the plugin: + + - BT_PLUGIN_AUTHOR() + - BT_PLUGIN_DESCRIPTION() + - BT_PLUGIN_LICENSE() + - BT_PLUGIN_VERSION() +
    6. + +
    7. + \bt_dt_opt Use any of the following macros (or their + *_WITH_ID() counterpart) \em once to set the + initialization and finalization functions of the plugin: + + - BT_PLUGIN_INITIALIZE_FUNC() + - BT_PLUGIN_FINALIZE_FUNC() + + A plugin's initialization function is executed when the shared + object is loaded (see \ref api-plugin). + + A plugin's finalization function is executed when the \bt_plugin + object is destroyed, if the initialization function (if any) + succeeded. +
    8. + +
    9. + Use any of the following macros (or their *_WITH_ID() + counterpart) to add a component class to the plugin: + + - BT_PLUGIN_SOURCE_COMPONENT_CLASS() + - BT_PLUGIN_FILTER_COMPONENT_CLASS() + - BT_PLUGIN_SINK_COMPONENT_CLASS() +
    10. + +
    11. + \bt_dt_opt Depending on the type of the component class of step 5, + use any of the following macros (or their *_WITH_ID() + counterpart) + \em once to set its properties: + +
      +
      \bt_c_src_comp_cls
      +
      + - BT_PLUGIN_SOURCE_COMPONENT_CLASS_DESCRIPTION() + - BT_PLUGIN_SOURCE_COMPONENT_CLASS_HELP() +
      + +
      \bt_c_flt_comp_cls
      +
      + - BT_PLUGIN_FILTER_COMPONENT_CLASS_DESCRIPTION() + - BT_PLUGIN_FILTER_COMPONENT_CLASS_HELP() +
      + +
      \bt_c_sink_comp_cls
      +
      + - BT_PLUGIN_SINK_COMPONENT_CLASS_DESCRIPTION() + - BT_PLUGIN_SINK_COMPONENT_CLASS_HELP() +
      +
      +
    12. + +
    13. + \bt_dt_opt Depending on the type of the component class of step 5, + use any of the following macros (or their *_WITH_ID() + counterpart) to set its optional methods: + +
      +
      Source component class
      +
      + - BT_PLUGIN_SOURCE_COMPONENT_CLASS_FINALIZE_METHOD() + - BT_PLUGIN_SOURCE_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD() + - BT_PLUGIN_SOURCE_COMPONENT_CLASS_INITIALIZE_METHOD() + - BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_FINALIZE_METHOD() + - BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD() + - BT_PLUGIN_SOURCE_COMPONENT_CLASS_OUTPUT_PORT_CONNECTED_METHOD() + - BT_PLUGIN_SOURCE_COMPONENT_CLASS_QUERY_METHOD() +
      + +
      Filter component class
      +
      + - BT_PLUGIN_FILTER_COMPONENT_CLASS_FINALIZE_METHOD() + - BT_PLUGIN_FILTER_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD() + - BT_PLUGIN_FILTER_COMPONENT_CLASS_INITIALIZE_METHOD() + - BT_PLUGIN_FILTER_COMPONENT_CLASS_INPUT_PORT_CONNECTED_METHOD() + - BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_FINALIZE_METHOD() + - BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD() + - BT_PLUGIN_FILTER_COMPONENT_CLASS_OUTPUT_PORT_CONNECTED_METHOD() + - BT_PLUGIN_FILTER_COMPONENT_CLASS_QUERY_METHOD() +
      + +
      Sink component class
      +
      + - BT_PLUGIN_SINK_COMPONENT_CLASS_FINALIZE_METHOD() + - BT_PLUGIN_SINK_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD() + - BT_PLUGIN_SINK_COMPONENT_CLASS_GRAPH_IS_CONFIGURED_METHOD() + - BT_PLUGIN_SINK_COMPONENT_CLASS_INITIALIZE_METHOD() + - BT_PLUGIN_SINK_COMPONENT_CLASS_INPUT_PORT_CONNECTED_METHOD() + - BT_PLUGIN_SINK_COMPONENT_CLASS_QUERY_METHOD() +
      +
      +
    14. +
    + +You can repeat steps 5 to 7 to add more than one component class to a +given plugin. + +See \ref example-simple-plugin-def-file for a concrete example of how +to use the macros of this module. + +

    \anchor api-plugin-dev-custom-plugin-id Custom plugin ID

    + +The BT_PLUGIN() macro defines a plugin with a specific name and the +ID auto. + +All the BT_PLUGIN_*() macros which do not end with +_WITH_ID refer to the auto plugin. + +There are two situations which demand that you use a custom plugin ID: + +- You want more than one plugin contained in your shared object file. + + Although the \bt_name project does not recommend this, it is possible. + This is why bt_plugin_find_all_from_file() returns a \bt_plugin_set + instead of a single \bt_plugin. + + In this case, each plugin of the shared object needs its own, unique + ID. + +- You want to give the plugin a name which is not a valid C identifier. + + The BT_PLUGIN() macro accepts a C identifier as the plugin name, while + the BT_PLUGIN_WITH_ID() accepts a C identifier for the ID and a C + string for the name. + +To define a plugin with a specific ID, use BT_PLUGIN_WITH_ID(), for +example: + +@code +BT_PLUGIN_WITH_ID(my_plugin_id, "my-plugin-name"); +@endcode + +Then, use the BT_PLUGIN_*_WITH_ID() macros to refer to +this specific plugin, for example: + +@code +BT_PLUGIN_AUTHOR_WITH_ID(my_plugin_id, "Patrick Bouchard"); +@endcode + +@note + @parblock + You can still use the auto ID with BT_PLUGIN_WITH_ID() + to use the simpler macros afterwards while still giving the plugin a + name which is not a valid C identifier, for example: + + @code + BT_PLUGIN_WITH_ID(auto, "my-plugin-name"); + BT_PLUGIN_AUTHOR("Patrick Bouchard"); + @endcode + @endparblock + +

    Custom component class ID

    + +The BT_PLUGIN_SOURCE_COMPONENT_CLASS(), +BT_PLUGIN_FILTER_COMPONENT_CLASS(), and +BT_PLUGIN_SINK_COMPONENT_CLASS() add a component class with a specific +name to the plugin having the ID auto. + +The name you pass to those macros must be a valid C identifier and it +also serves as the component class's ID within the auto +plugin. + +There are two situations which demand that you use a custom component +class ID: + +- You want to add the component class to a specific plugin (other than + auto, if you have more than one). + +- You want to give the component class a name which is not a valid C + identifier. + + The BT_PLUGIN_*_COMPONENT_CLASS_WITH_ID() macros accept a + C identifier for the component class ID and a string for its name. + +For a given plugin and for a given component class type, all component +class IDs must be unique. + +To add a component class having a specific ID to a plugin, +use the BT_PLUGIN_SOURCE_COMPONENT_CLASS_WITH_ID(), +BT_PLUGIN_FILTER_COMPONENT_CLASS_WITH_ID(), and +BT_PLUGIN_SINK_COMPONENT_CLASS_WITH_ID() macros, for example: + +@code +BT_PLUGIN_SOURCE_COMPONENT_CLASS_WITH_ID(my_plugin_id, my_comp_class_id, + "my-source", my_source_iter_next); +@endcode + +@note + @parblock + The BT_PLUGIN_*_COMPONENT_CLASS_WITH_ID() macros + specify the ID of the plugin to which to add the component class. + + If you use the BT_PLUGIN() macro to define your plugin, then its + ID is auto: + + @code + BT_PLUGIN_SOURCE_COMPONENT_CLASS_WITH_ID(auto, my_comp_class_id, + "my-source", my_source_iter_next); + @endcode + @endparblock + +Then, use the BT_PLUGIN_*_COMPONENT_CLASS_*_WITH_ID() +macros to refer to this specific component class, for example: + +@code +BT_PLUGIN_SOURCE_COMPONENT_CLASS_FINALIZE_METHOD_WITH_ID(my_plugin_id, + my_comp_class_id, my_source_finalize); +@endcode +*/ + +/*! @{ */ + +/*! +@name Type +@{ + +@typedef struct bt_self_plugin bt_self_plugin; + +@brief + Self plugin. + +@} +*/ + +/*! +@name Plugin module +@{ +*/ + +/*! +@brief + Defines a plugin module. + +In a plugin define C file, you must use this macro before you use any +other BT_PLUGIN*() macro. +*/ +#define BT_PLUGIN_MODULE() \ + static struct __bt_plugin_descriptor const * const __bt_plugin_descriptor_dummy __BT_PLUGIN_DESCRIPTOR_ATTRS = NULL; \ + _BT_HIDDEN extern struct __bt_plugin_descriptor const *__BT_PLUGIN_DESCRIPTOR_BEGIN_SYMBOL __BT_PLUGIN_DESCRIPTOR_BEGIN_EXTRA; \ + _BT_HIDDEN extern struct __bt_plugin_descriptor const *__BT_PLUGIN_DESCRIPTOR_END_SYMBOL __BT_PLUGIN_DESCRIPTOR_END_EXTRA; \ + \ + static struct __bt_plugin_descriptor_attribute const * const __bt_plugin_descriptor_attribute_dummy __BT_PLUGIN_DESCRIPTOR_ATTRIBUTES_ATTRS = NULL; \ + _BT_HIDDEN extern struct __bt_plugin_descriptor_attribute const *__BT_PLUGIN_DESCRIPTOR_ATTRIBUTES_BEGIN_SYMBOL __BT_PLUGIN_DESCRIPTOR_ATTRIBUTES_BEGIN_EXTRA; \ + _BT_HIDDEN extern struct __bt_plugin_descriptor_attribute const *__BT_PLUGIN_DESCRIPTOR_ATTRIBUTES_END_SYMBOL __BT_PLUGIN_DESCRIPTOR_ATTRIBUTES_END_EXTRA; \ + \ + static struct __bt_plugin_component_class_descriptor const * const __bt_plugin_component_class_descriptor_dummy __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRS = NULL; \ + _BT_HIDDEN extern struct __bt_plugin_component_class_descriptor const *__BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_BEGIN_SYMBOL __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_BEGIN_EXTRA; \ + _BT_HIDDEN extern struct __bt_plugin_component_class_descriptor const *__BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_END_SYMBOL __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_END_EXTRA; \ + \ + static struct __bt_plugin_component_class_descriptor_attribute const * const __bt_plugin_component_class_descriptor_attribute_dummy __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTES_ATTRS = NULL; \ + _BT_HIDDEN extern struct __bt_plugin_component_class_descriptor_attribute const *__BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTES_BEGIN_SYMBOL __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTES_BEGIN_EXTRA; \ + _BT_HIDDEN extern struct __bt_plugin_component_class_descriptor_attribute const *__BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTES_END_SYMBOL __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTES_END_EXTRA; \ + \ + struct __bt_plugin_descriptor const * const *__bt_get_begin_section_plugin_descriptors(void) \ + { \ + return &__BT_PLUGIN_DESCRIPTOR_BEGIN_SYMBOL; \ + } \ + struct __bt_plugin_descriptor const * const *__bt_get_end_section_plugin_descriptors(void) \ + { \ + return &__BT_PLUGIN_DESCRIPTOR_END_SYMBOL; \ + } \ + struct __bt_plugin_descriptor_attribute const * const *__bt_get_begin_section_plugin_descriptor_attributes(void) \ + { \ + return &__BT_PLUGIN_DESCRIPTOR_ATTRIBUTES_BEGIN_SYMBOL; \ + } \ + struct __bt_plugin_descriptor_attribute const * const *__bt_get_end_section_plugin_descriptor_attributes(void) \ + { \ + return &__BT_PLUGIN_DESCRIPTOR_ATTRIBUTES_END_SYMBOL; \ + } \ + struct __bt_plugin_component_class_descriptor const * const *__bt_get_begin_section_component_class_descriptors(void) \ + { \ + return &__BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_BEGIN_SYMBOL; \ + } \ + struct __bt_plugin_component_class_descriptor const * const *__bt_get_end_section_component_class_descriptors(void) \ + { \ + return &__BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_END_SYMBOL; \ + } \ + struct __bt_plugin_component_class_descriptor_attribute const * const *__bt_get_begin_section_component_class_descriptor_attributes(void) \ + { \ + return &__BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTES_BEGIN_SYMBOL; \ + } \ + struct __bt_plugin_component_class_descriptor_attribute const * const *__bt_get_end_section_component_class_descriptor_attributes(void) \ + { \ + return &__BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTES_END_SYMBOL; \ + } + +/*! @} */ + +/*! +@name Plugin definition +@{ +*/ + +/*! +@brief + Defines a plugin named \bt_p{_name} and having the ID \bt_p{_id}. + +@param[in] _id + @parblock + C identifier. + + Plugin's ID, unique amongst all the plugin IDs of the same shared + object. + @endparblock +@param[in] _name + @parblock + const char * + + Plugin's name. + @endparblock + +@bt_pre_not_null{_name} +*/ +#define BT_PLUGIN_WITH_ID(_id, _name) \ + struct __bt_plugin_descriptor __bt_plugin_descriptor_##_id = { \ + .name = _name, \ + }; \ + static struct __bt_plugin_descriptor const * const __bt_plugin_descriptor_##_id##_ptr __BT_PLUGIN_DESCRIPTOR_ATTRS = &__bt_plugin_descriptor_##_id + +/*! +@brief + Alias of BT_PLUGIN_WITH_ID() with the \bt_p{_id} parameter set to + auto. +*/ +#define BT_PLUGIN(_name) static BT_PLUGIN_WITH_ID(auto, #_name) + +/*! @} */ + +/*! +@name Plugin properties +@{ +*/ + +/*! +@brief + Sets the description of the plugin having the ID \bt_p{_id} to + \bt_p{_description}. + +See the \ref api-comp-cls-prop-descr "description" property. + +@param[in] _id + @parblock + C identifier. + + ID of the plugin of which to set the description. + @endparblock +@param[in] _description + @parblock + const char * + + Plugin's description. + @endparblock + +@bt_pre_not_null{_description} +*/ +#define BT_PLUGIN_DESCRIPTION_WITH_ID(_id, _description) \ + __BT_PLUGIN_DESCRIPTOR_ATTRIBUTE(description, BT_PLUGIN_DESCRIPTOR_ATTRIBUTE_TYPE_DESCRIPTION, _id, _description) + +/*! +@brief + Alias of BT_PLUGIN_DESCRIPTION_WITH_ID() with the \bt_p{_id} + parameter set to auto. +*/ +#define BT_PLUGIN_DESCRIPTION(_description) BT_PLUGIN_DESCRIPTION_WITH_ID(auto, _description) + + +/*! +@brief + Sets the name(s) of the author(s) of the plugin having the ID + \bt_p{_id} to \bt_p{_author}. + +See the \ref api-plugin-prop-author "author name(s)" property. + +@param[in] _id + @parblock + C identifier. + + ID of the plugin of which to set the author(s). + @endparblock +@param[in] _author + @parblock + const char * + + Plugin's author(s). + @endparblock + +@bt_pre_not_null{_author} +*/ +#define BT_PLUGIN_AUTHOR_WITH_ID(_id, _author) \ + __BT_PLUGIN_DESCRIPTOR_ATTRIBUTE(author, BT_PLUGIN_DESCRIPTOR_ATTRIBUTE_TYPE_AUTHOR, _id, _author) + +/*! +@brief + Alias of BT_PLUGIN_AUTHOR_WITH_ID() with the \bt_p{_id} + parameter set to auto. +*/ +#define BT_PLUGIN_AUTHOR(_author) BT_PLUGIN_AUTHOR_WITH_ID(auto, _author) + +/*! +@brief + Sets the license (name or full) of the plugin having the ID + \bt_p{_id} to \bt_p{_license}. + +See the \ref api-plugin-prop-license "license" property. + +@param[in] _id + @parblock + C identifier. + + ID of the plugin of which to set the license. + @endparblock +@param[in] _license + @parblock + const char * + + Plugin's license. + @endparblock + +@bt_pre_not_null{_license} +*/ +#define BT_PLUGIN_LICENSE_WITH_ID(_id, _license) \ + __BT_PLUGIN_DESCRIPTOR_ATTRIBUTE(license, BT_PLUGIN_DESCRIPTOR_ATTRIBUTE_TYPE_LICENSE, _id, _license) + +/*! +@brief + Alias of BT_PLUGIN_LICENSE_WITH_ID() with the \bt_p{_id} + parameter set to auto. +*/ +#define BT_PLUGIN_LICENSE(_license) BT_PLUGIN_LICENSE_WITH_ID(auto, _license) + +/*! +@brief + Sets the version of the plugin having the ID \bt_p{_id} to + \bt_p{_version}. + +See the \ref api-plugin-prop-version "version" property. + +@param[in] _id + @parblock + C identifier. + + ID of the plugin of which to set the version. + @endparblock +@param[in] _major + @parblock + unsigned int + + Plugin's major version. + @endparblock +@param[in] _minor + @parblock + unsigned int + + Plugin's minor version. + @endparblock +@param[in] _patch + @parblock + unsigned int + + Plugin's patch version. + @endparblock +@param[in] _extra + @parblock + const char * + + Plugin's version's extra information. + + Can be \c NULL if the plugin's version has no extra information. + @endparblock +*/ +#define BT_PLUGIN_VERSION_WITH_ID(_id, _major, _minor, _patch, _extra) \ + __BT_PLUGIN_DESCRIPTOR_ATTRIBUTE(version, BT_PLUGIN_DESCRIPTOR_ATTRIBUTE_TYPE_VERSION, _id, __BT_PLUGIN_VERSION_STRUCT_VALUE(_major, _minor, _patch, _extra)) + +/*! +@brief + Alias of BT_PLUGIN_VERSION_WITH_ID() with the \bt_p{_id} + parameter set to auto. +*/ +#define BT_PLUGIN_VERSION(_major, _minor, _patch, _extra) BT_PLUGIN_VERSION_WITH_ID(auto, _major, _minor, _patch, _extra) + +/*! @} */ + +/*! +@name Plugin functions +@{ +*/ + +/*! +@brief + Status codes for #bt_plugin_initialize_func. +*/ typedef enum bt_plugin_initialize_func_status { + /*! + @brief + Success. + */ BT_PLUGIN_INITIALIZE_FUNC_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ BT_PLUGIN_INITIALIZE_FUNC_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + Error. + */ BT_PLUGIN_INITIALIZE_FUNC_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, } bt_plugin_initialize_func_status; -typedef bt_plugin_initialize_func_status (*bt_plugin_initialize_func)( - bt_self_plugin *plugin); +/*! +@brief + User plugin initialization function. + +@param[in] self_plugin + @parblock + Plugin instance. + + This parameter is a private view of the \bt_plugin object for + this function. + + As of \bt_name_version_min_maj, there's no self plugin API. + @endparblock + +@retval #BT_PLUGIN_INITIALIZE_FUNC_STATUS_OK + Success. +@retval #BT_PLUGIN_INITIALIZE_FUNC_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_PLUGIN_INITIALIZE_FUNC_STATUS_ERROR + Error. -/* Plugin exit function type */ +@bt_pre_not_null{self_plugin} +*/ +typedef bt_plugin_initialize_func_status (*bt_plugin_initialize_func)( + bt_self_plugin *self_plugin); + +/*! +@brief + Sets the initialization function of the plugin having the ID + \bt_p{_id} to \bt_p{_func}. + +@param[in] _id + @parblock + C identifier. + + ID of the plugin of which to set the initialization function. + @endparblock +@param[in] _func + @parblock + #bt_plugin_initialize_func + + Plugin's initialization function. + @endparblock + +@bt_pre_not_null{_func} +*/ +#define BT_PLUGIN_INITIALIZE_FUNC_WITH_ID(_id, _func) \ + __BT_PLUGIN_DESCRIPTOR_ATTRIBUTE(init, BT_PLUGIN_DESCRIPTOR_ATTRIBUTE_TYPE_INIT, _id, _func) + +/*! +@brief + Alias of BT_PLUGIN_INITIALIZE_FUNC_WITH_ID() with the \bt_p{_id} + parameter set to auto. +*/ +#define BT_PLUGIN_INITIALIZE_FUNC(_func) BT_PLUGIN_INITIALIZE_FUNC_WITH_ID(auto, _func) + +/*! +@brief + User plugin finalization function. +*/ typedef void (*bt_plugin_finalize_func)(void); +/*! +@brief + Sets the finalization function of the plugin having the ID + \bt_p{_id} to \bt_p{_func}. + +@param[in] _id + @parblock + C identifier. + + ID of the plugin of which to set the finalization function. + @endparblock +@param[in] _func + @parblock + #bt_plugin_finalize_func + + Plugin's finalization function. + @endparblock + +@bt_pre_not_null{_func} +*/ +#define BT_PLUGIN_FINALIZE_FUNC_WITH_ID(_id, _func) \ + __BT_PLUGIN_DESCRIPTOR_ATTRIBUTE(exit, BT_PLUGIN_DESCRIPTOR_ATTRIBUTE_TYPE_EXIT, _id, _func) + +/*! +@brief + Alias of BT_PLUGIN_FINALIZE_FUNC_WITH_ID() with the \bt_p{_id} + parameter set to auto. +*/ +#define BT_PLUGIN_FINALIZE_FUNC(_func) BT_PLUGIN_FINALIZE_FUNC_WITH_ID(auto, _func) + +/*! @} */ + +/*! +@name Component class adding +@{ +*/ + +/*! +@brief + Adds a \bt_src_comp_cls named \bt_p{_name}, having the ID + \bt_p{_component_class_id} and the message iterator class's "next" + method \bt_p{_message_iterator_class_next_method}, to the plugin + having the ID \bt_p{_plugin_id}. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin to which to add the source component class. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + Source component class's ID, unique amongst all the source component + class IDs of the same plugin. + @endparblock +@param[in] _name + @parblock + const char * + + Source component class's name, unique amongst all the source + component class names of the same plugin. + @endparblock +@param[in] _message_iterator_class_next_method + @parblock + #bt_message_iterator_class_next_method + + Source component class's message iterator class's "next" method. + @endparblock + +@bt_pre_not_null{_name} +@bt_pre_not_null{_message_iterator_class_next_method} +*/ +#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_WITH_ID(_plugin_id, _component_class_id, _name, _message_iterator_class_next_method) \ + static struct __bt_plugin_component_class_descriptor __bt_plugin_source_component_class_descriptor_##_plugin_id##_##_component_class_id = { \ + .plugin_descriptor = &__bt_plugin_descriptor_##_plugin_id, \ + .name = _name, \ + .type = BT_COMPONENT_CLASS_TYPE_SOURCE, \ + .methods = { .source = { .msg_iter_next = _message_iterator_class_next_method } }, \ + }; \ + static struct __bt_plugin_component_class_descriptor const * const __bt_plugin_source_component_class_descriptor_##_plugin_id##_##_component_class_id##_ptr __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRS = &__bt_plugin_source_component_class_descriptor_##_plugin_id##_##_component_class_id + +/*! +@brief + Alias of BT_PLUGIN_SOURCE_COMPONENT_CLASS_WITH_ID() with the + \bt_p{_plugin_id} parameter set to auto, the + \bt_p{_component_class_id} parameter set to \bt_p{_name}, and + the \bt_p{_name} parameter set to a string version of \bt_p{_name}. + +@param[in] _name + @parblock + C identifier + + Passed as both the \bt_p{_component_class_id} and the + \bt_p{_name} (once converted to a string) parameters of + BT_PLUGIN_SOURCE_COMPONENT_CLASS_WITH_ID(). + @endparblock +*/ +#define BT_PLUGIN_SOURCE_COMPONENT_CLASS(_name, _message_iterator_class_next_method) \ + BT_PLUGIN_SOURCE_COMPONENT_CLASS_WITH_ID(auto, _name, #_name, _message_iterator_class_next_method) + +/*! +@brief + Adds a \bt_flt_comp_cls named \bt_p{_name}, having the ID + \bt_p{_component_class_id} and the message iterator class's "next" + method \bt_p{_message_iterator_class_next_method}, to the plugin + having the ID \bt_p{_plugin_id}. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin to which to add the filter component class. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + Filter component class's ID, unique amongst all the filter component + class IDs of the same plugin. + @endparblock +@param[in] _name + @parblock + const char * + + Filter component class's name, unique amongst all the filter + component class names of the same plugin. + @endparblock +@param[in] _message_iterator_class_next_method + @parblock + #bt_message_iterator_class_next_method + + Filter component class's message iterator class's "next" method. + @endparblock + +@bt_pre_not_null{_name} +@bt_pre_not_null{_message_iterator_class_next_method} +*/ +#define BT_PLUGIN_FILTER_COMPONENT_CLASS_WITH_ID(_plugin_id, _component_class_id, _name, _message_iterator_class_next_method) \ + static struct __bt_plugin_component_class_descriptor __bt_plugin_filter_component_class_descriptor_##_plugin_id##_##_component_class_id = { \ + .plugin_descriptor = &__bt_plugin_descriptor_##_plugin_id, \ + .name = _name, \ + .type = BT_COMPONENT_CLASS_TYPE_FILTER, \ + .methods = { .filter = { .msg_iter_next = _message_iterator_class_next_method } }, \ + }; \ + static struct __bt_plugin_component_class_descriptor const * const __bt_plugin_filter_component_class_descriptor_##_plugin_id##_##_component_class_id##_ptr __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRS = &__bt_plugin_filter_component_class_descriptor_##_plugin_id##_##_component_class_id + +/*! +@brief + Alias of BT_PLUGIN_FILTER_COMPONENT_CLASS_WITH_ID() with the + \bt_p{_plugin_id} parameter set to auto, the + \bt_p{_component_class_id} parameter set to \bt_p{_name}, and + the \bt_p{_name} parameter set to a string version of \bt_p{_name}. + +@param[in] _name + @parblock + C identifier + + Passed as both the \bt_p{_component_class_id} and the + \bt_p{_name} (once converted to a string) parameters of + BT_PLUGIN_FILTER_COMPONENT_CLASS_WITH_ID(). + @endparblock +*/ +#define BT_PLUGIN_FILTER_COMPONENT_CLASS(_name, _message_iterator_class_next_method) \ + BT_PLUGIN_FILTER_COMPONENT_CLASS_WITH_ID(auto, _name, #_name, _message_iterator_class_next_method) + +/*! +@brief + Adds a \bt_sink_comp_cls named \bt_p{_name}, having the ID + \bt_p{_component_class_id} and the consuming method + \bt_p{_consume_method}, to the plugin + having the ID \bt_p{_plugin_id}. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin to which to add the sink component class. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + Sink component class's ID, unique amongst all the sink component + class IDs of the same plugin. + @endparblock +@param[in] _name + @parblock + const char * + + Sink component class's name, unique amongst all the sink + component class names of the same plugin. + @endparblock +@param[in] _consume_method + @parblock + #bt_component_class_sink_consume_method + + Sink component class's message iterator class's "next" method. + @endparblock + +@bt_pre_not_null{_name} +@bt_pre_not_null{_consume_method} +*/ +#define BT_PLUGIN_SINK_COMPONENT_CLASS_WITH_ID(_plugin_id, _component_class_id, _name, _consume_method) \ + static struct __bt_plugin_component_class_descriptor __bt_plugin_sink_component_class_descriptor_##_plugin_id##_##_component_class_id = { \ + .plugin_descriptor = &__bt_plugin_descriptor_##_plugin_id, \ + .name = _name, \ + .type = BT_COMPONENT_CLASS_TYPE_SINK, \ + .methods = { .sink = { .consume = _consume_method } }, \ + }; \ + static struct __bt_plugin_component_class_descriptor const * const __bt_plugin_sink_component_class_descriptor_##_plugin_id##_##_component_class_id##_ptr __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRS = &__bt_plugin_sink_component_class_descriptor_##_plugin_id##_##_component_class_id + +/*! +@brief + Alias of BT_PLUGIN_SINK_COMPONENT_CLASS_WITH_ID() with the + \bt_p{_plugin_id} parameter set to auto, the + \bt_p{_component_class_id} parameter set to \bt_p{_name}, and + the \bt_p{_name} parameter set to a string version of \bt_p{_name}. + +@param[in] _name + @parblock + C identifier + + Passed as both the \bt_p{_component_class_id} and the + \bt_p{_name} (once converted to a string) parameters of + BT_PLUGIN_SINK_COMPONENT_CLASS_WITH_ID(). + @endparblock +*/ +#define BT_PLUGIN_SINK_COMPONENT_CLASS(_name, _consume_method) \ + BT_PLUGIN_SINK_COMPONENT_CLASS_WITH_ID(auto, _name, #_name, _consume_method) + +/*! @} */ + +/*! +@name Source component class properties +@{ +*/ + +/*! +@brief + Sets the description of the \bt_src_comp_cls having the ID + \bt_p{_component_class_id} in the plugin having the ID + \bt_p{_plugin_id} to \bt_p{_description}. + +See the \ref api-comp-cls-prop-descr "description" property. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the source component class of which + to set the description. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the source component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the description to + \bt_p{_description}. + @endparblock +@param[in] _description + @parblock + const char * + + Source component class's description. + @endparblock + +@bt_pre_not_null{_description} +*/ +#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_DESCRIPTION_WITH_ID(_plugin_id, _component_class_id, _description) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(description, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_DESCRIPTION, _plugin_id, _component_class_id, source, _description) + +/*! +@brief + Alias of BT_PLUGIN_SOURCE_COMPONENT_CLASS_DESCRIPTION_WITH_ID() with + the \bt_p{_plugin_id} parameter set to auto and the + \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_DESCRIPTION(_name, _description) \ + BT_PLUGIN_SOURCE_COMPONENT_CLASS_DESCRIPTION_WITH_ID(auto, _name, _description) + +/*! +@brief + Sets the help text of the \bt_src_comp_cls having the ID + \bt_p{_component_class_id} in the plugin having the ID + \bt_p{_plugin_id} to \bt_p{_help_text}. + +See the \ref api-comp-cls-prop-help "help text" property. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the source component class of which + to set the help text. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the source component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the help text to + \bt_p{_help_text}. + @endparblock +@param[in] _help_text + @parblock + const char * + + Source component class's help text. + @endparblock + +@bt_pre_not_null{_help_text} +*/ +#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_HELP_WITH_ID(_plugin_id, _component_class_id, _help_text) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(help, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_HELP, _plugin_id, _component_class_id, source, _help_text) + +/*! +@brief + Alias of BT_PLUGIN_SOURCE_COMPONENT_CLASS_HELP_WITH_ID() with the + \bt_p{_plugin_id} parameter set to auto and the + \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_HELP(_name, _help_text) \ + BT_PLUGIN_SOURCE_COMPONENT_CLASS_HELP_WITH_ID(auto, _name, _help_text) + +/*! @} */ + +/*! +@name Filter component class properties +@{ +*/ + +/*! +@brief + Sets the description of the \bt_flt_comp_cls having the ID + \bt_p{_component_class_id} in the plugin having the ID + \bt_p{_plugin_id} to \bt_p{_description}. + +See the \ref api-comp-cls-prop-descr "description" property. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the filter component class of which + to set the description. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the filter component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the description to + \bt_p{_description}. + @endparblock +@param[in] _description + @parblock + const char * + + Filter component class's description. + @endparblock + +@bt_pre_not_null{_description} +*/ +#define BT_PLUGIN_FILTER_COMPONENT_CLASS_DESCRIPTION_WITH_ID(_plugin_id, _component_class_id, _description) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(description, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_DESCRIPTION, _plugin_id, _component_class_id, filter, _description) + +/*! +@brief + Alias of BT_PLUGIN_FILTER_COMPONENT_CLASS_DESCRIPTION_WITH_ID() with + the \bt_p{_plugin_id} parameter set to auto and the + \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_FILTER_COMPONENT_CLASS_DESCRIPTION(_name, _description) \ + BT_PLUGIN_FILTER_COMPONENT_CLASS_DESCRIPTION_WITH_ID(auto, _name, _description) + +/*! +@brief + Sets the help text of the \bt_flt_comp_cls having the ID + \bt_p{_component_class_id} in the plugin having the ID + \bt_p{_plugin_id} to \bt_p{_help_text}. + +See the \ref api-comp-cls-prop-help "help text" property. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the filter component class of which + to set the help text. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the filter component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the help text to + \bt_p{_help_text}. + @endparblock +@param[in] _help_text + @parblock + const char * + + Filter component class's help text. + @endparblock + +@bt_pre_not_null{_help_text} +*/ +#define BT_PLUGIN_FILTER_COMPONENT_CLASS_HELP_WITH_ID(_plugin_id, _component_class_id, _help_text) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(help, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_HELP, _plugin_id, _component_class_id, filter, _help_text) + +/*! +@brief + Alias of BT_PLUGIN_FILTER_COMPONENT_CLASS_HELP_WITH_ID() with the + \bt_p{_plugin_id} parameter set to auto and the + \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_FILTER_COMPONENT_CLASS_HELP(_name, _help_text) \ + BT_PLUGIN_FILTER_COMPONENT_CLASS_HELP_WITH_ID(auto, _name, _help_text) + +/*! @} */ + +/*! +@name Sink component class properties +@{ +*/ + +/*! +@brief + Sets the description of the \bt_sink_comp_cls having the ID + \bt_p{_component_class_id} in the plugin having the ID + \bt_p{_plugin_id} to \bt_p{_description}. + +See the \ref api-comp-cls-prop-descr "description" property. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the sink component class of which + to set the description. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the sink component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the description to + \bt_p{_description}. + @endparblock +@param[in] _description + @parblock + const char * + + Sink component class's description. + @endparblock + +@bt_pre_not_null{_description} +*/ +#define BT_PLUGIN_SINK_COMPONENT_CLASS_DESCRIPTION_WITH_ID(_plugin_id, _component_class_id, _description) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(description, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_DESCRIPTION, _plugin_id, _component_class_id, sink, _description) + +/*! +@brief + Alias of BT_PLUGIN_SINK_COMPONENT_CLASS_DESCRIPTION_WITH_ID() with + the \bt_p{_plugin_id} parameter set to auto and the + \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_SINK_COMPONENT_CLASS_DESCRIPTION(_name, _description) \ + BT_PLUGIN_SINK_COMPONENT_CLASS_DESCRIPTION_WITH_ID(auto, _name, _description) + +/*! +@brief + Sets the help text of the \bt_sink_comp_cls having the ID + \bt_p{_component_class_id} in the plugin having the ID + \bt_p{_plugin_id} to \bt_p{_help_text}. + +See the \ref api-comp-cls-prop-help "help text" property. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the sink component class of which + to set the help text. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the sink component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the help text to + \bt_p{_help_text}. + @endparblock +@param[in] _help_text + @parblock + const char * + + Sink component class's help text. + @endparblock + +@bt_pre_not_null{_help_text} +*/ +#define BT_PLUGIN_SINK_COMPONENT_CLASS_HELP_WITH_ID(_plugin_id, _component_class_id, _help_text) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(help, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_HELP, _plugin_id, _component_class_id, sink, _help_text) + +/*! +@brief + Alias of BT_PLUGIN_SINK_COMPONENT_CLASS_HELP_WITH_ID() with + the \bt_p{_plugin_id} parameter set to auto and the + \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_SINK_COMPONENT_CLASS_HELP(_name, _help_text) \ + BT_PLUGIN_SINK_COMPONENT_CLASS_HELP_WITH_ID(auto, _name, _help_text) + +/*! @} */ + +/*! +@name Source component class methods +@{ +*/ + +/*! +@brief + Sets the finalization method of the \bt_src_comp_cls having the ID + \bt_p{_component_class_id} in the plugin having the ID + \bt_p{_plugin_id} to \bt_p{_method}. + +See the \ref api-comp-cls-dev-meth-fini "finalize" method. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the source component class of which + to set the finalization method. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the source component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the finalization method to + \bt_p{_method}. + @endparblock +@param[in] _method + @parblock + #bt_component_class_source_finalize_method + + Source component class's finalization method. + @endparblock + +@bt_pre_not_null{_method} +*/ +#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_FINALIZE_METHOD_WITH_ID(_plugin_id, _component_class_id, _method) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(source_finalize_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_FINALIZE_METHOD, _plugin_id, _component_class_id, source, _method) + +/*! +@brief + Alias of + BT_PLUGIN_SOURCE_COMPONENT_CLASS_FINALIZE_METHOD_WITH_ID() + with the \bt_p{_plugin_id} parameter set to auto and + the \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_FINALIZE_METHOD(_name, _method) \ + BT_PLUGIN_SOURCE_COMPONENT_CLASS_FINALIZE_METHOD_WITH_ID(auto, _name, _method) + +/*! +@brief + Sets the \"get supported \bt_mip versions\" method of the + \bt_src_comp_cls having the ID \bt_p{_component_class_id} in the + plugin having the ID \bt_p{_plugin_id} to \bt_p{_method}. + +See the \ref api-comp-cls-dev-meth-mip "get supported MIP versions" +method. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the source component class of which + to set the "get supported MIP versions" method. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the source component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the "get supported MIP versions" + method to \bt_p{_method}. + @endparblock +@param[in] _method + @parblock + #bt_component_class_source_get_supported_mip_versions_method + + Source component class's "get supported MIP versions" method. + @endparblock + +@bt_pre_not_null{_method} +*/ +#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD_WITH_ID(_plugin_id, _component_class_id, _method) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(source_get_supported_mip_versions_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_GET_SUPPORTED_MIP_VERSIONS, _plugin_id, _component_class_id, source, _method) + +/*! +@brief + Alias of + BT_PLUGIN_SOURCE_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD_WITH_ID() + with the \bt_p{_plugin_id} parameter set to auto and + the \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD(_name, _method) \ + BT_PLUGIN_SOURCE_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD_WITH_ID(auto, _name, _method) + +/*! +@brief + Sets the initialization method of the \bt_src_comp_cls having the ID + \bt_p{_component_class_id} in the plugin having the ID + \bt_p{_plugin_id} to \bt_p{_method}. + +See the \ref api-comp-cls-dev-meth-init "initialize" method. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the source component class of which + to set the initialization method. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the source component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the initialization method to + \bt_p{_method}. + @endparblock +@param[in] _method + @parblock + #bt_component_class_source_initialize_method + + Source component class's initialization method. + @endparblock + +@bt_pre_not_null{_method} +*/ +#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_INITIALIZE_METHOD_WITH_ID(_plugin_id, _component_class_id, _method) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(source_initialize_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_INITIALIZE_METHOD, _plugin_id, _component_class_id, source, _method) + +/*! +@brief + Alias of + BT_PLUGIN_SOURCE_COMPONENT_CLASS_INITIALIZE_METHOD_WITH_ID() + with the \bt_p{_plugin_id} parameter set to auto and + the \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_INITIALIZE_METHOD(_name, _method) \ + BT_PLUGIN_SOURCE_COMPONENT_CLASS_INITIALIZE_METHOD_WITH_ID(auto, _name, _method) + +/*! +@brief + Sets the finalization method of the \bt_msg_iter_cls of the + \bt_src_comp_cls having the ID \bt_p{_component_class_id} in the + plugin having the ID \bt_p{_plugin_id} to \bt_p{_method}. + +See the \ref api-msg-iter-cls-meth-fini "finalize" method. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the source component class of which + to set the finalization method of the message iterator class. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the source component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the finalization method of the + message iterator class to \bt_p{_method}. + @endparblock +@param[in] _method + @parblock + #bt_message_iterator_class_finalize_method + + Source component class's message iterator class's finalization method. + @endparblock + +@bt_pre_not_null{_method} +*/ +#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_FINALIZE_METHOD_WITH_ID(_plugin_id, _component_class_id, _method) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(msg_iter_finalize_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_MSG_ITER_FINALIZE_METHOD, _plugin_id, _component_class_id, source, _method) + +/*! +@brief + Alias of + BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_FINALIZE_METHOD_WITH_ID() + with the \bt_p{_plugin_id} parameter set to auto and + the \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_FINALIZE_METHOD(_name, _method) \ + BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_FINALIZE_METHOD_WITH_ID(auto, _name, _method) + +/*! +@brief + Sets the initialization method of the \bt_msg_iter_cls of the + \bt_src_comp_cls having the ID \bt_p{_component_class_id} in the + plugin having the ID \bt_p{_plugin_id} to \bt_p{_method}. + +See the \ref api-msg-iter-cls-meth-init "initialize" method. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the source component class of which + to set the initialization method of the message iterator class. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the source component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the initialization method of the + message iterator class to \bt_p{_method}. + @endparblock +@param[in] _method + @parblock + #bt_message_iterator_class_initialize_method + + Source component class's message iterator class's initialization + method. + @endparblock + +@bt_pre_not_null{_method} +*/ +#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_WITH_ID(_plugin_id, _component_class_id, _method) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(msg_iter_initialize_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_MSG_ITER_INITIALIZE_METHOD, _plugin_id, _component_class_id, source, _method) + +/*! +@brief + Alias of + BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_WITH_ID() + with the \bt_p{_plugin_id} parameter set to auto and + the \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD(_name, _method) \ + BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_WITH_ID(auto, _name, _method) + +/*! +@brief + Sets the "seek beginning" and "can seek beginning?" methods of the + \bt_msg_iter_cls of the \bt_src_comp_cls having the ID + \bt_p{_component_class_id} in the plugin having the ID + \bt_p{_plugin_id} to \bt_p{_seek_method} and + \bt_p{_can_seek_method}. + +See the \ref api-msg-iter-cls-meth-seek-beg "seek beginning" and +\ref api-msg-iter-cls-meth-can-seek-beg "can seek beginning?" methods. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the source component class of which + to set the "seek beginning" and "can seek beginning?" methods of the + message iterator class. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the source component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the "seek beginning" and "can + seek beginning" methods of the message iterator class to + \bt_p{_seek_method} and \bt_p{_can_seek_method}. + @endparblock +@param[in] _seek_method + @parblock + #bt_message_iterator_class_seek_beginning_method + + Source component class's message iterator class's "seek beginning" + method. + @endparblock +@param[in] _can_seek_method + @parblock + #bt_message_iterator_class_can_seek_beginning_method + + Source component class's message iterator class's + "can seek beginning?" method. + + Can be \c NULL, in which case it is equivalent to setting a method + which always returns #BT_TRUE. + @endparblock + +@bt_pre_not_null{_seek_method} +@bt_pre_not_null{_can_seek_method} +*/ +#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHODS_WITH_ID(_plugin_id, _component_class_id, _seek_method, _can_seek_method) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(msg_iter_seek_beginning_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_MSG_ITER_SEEK_BEGINNING_METHOD, _plugin_id, _component_class_id, source, _seek_method); \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(msg_iter_can_seek_beginning_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_MSG_ITER_CAN_SEEK_BEGINNING_METHOD, _plugin_id, _component_class_id, source, _can_seek_method) + +/*! +@brief + Alias of + BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHODS() + with the \bt_p{_plugin_id} parameter set to auto and + the \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHODS(_name, _seek_method, _can_seek_method) \ + BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHODS_WITH_ID(auto, _name, _seek_method, _can_seek_method) + +/*! +@brief + Sets the "seek ns from origin" and "can seek ns from origin?" + methods of the \bt_msg_iter_cls of the \bt_src_comp_cls having the + ID \bt_p{_component_class_id} in the plugin having the ID + \bt_p{_plugin_id} to \bt_p{_seek_method} and + \bt_p{_can_seek_method}. + +See the \ref api-msg-iter-cls-meth-seek-ns "seek ns from origin" and +\ref api-msg-iter-cls-meth-can-seek-ns "can seek ns from origin?" +methods. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the source component class of which + to set the "seek ns from origin" and "can seek ns from origin?" + methods of the message iterator class. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the source component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the "seek ns from origin" and + "can seek ns from origin" methods of the message iterator class to + \bt_p{_seek_method} and \bt_p{_can_seek_method}. + @endparblock +@param[in] _seek_method + @parblock + #bt_message_iterator_class_seek_ns_from_origin_method + + Source component class's message iterator class's "seek ns from + origin" method. + @endparblock +@param[in] _can_seek_method + @parblock + #bt_message_iterator_class_can_seek_ns_from_origin_method + + Source component class's message iterator class's "can seek ns from + origin?" method. + + Can be \c NULL, in which case it is equivalent to setting a method + which always returns #BT_TRUE. + @endparblock + +@bt_pre_not_null{_seek_method} +@bt_pre_not_null{_can_seek_method} +*/ +#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHODS_WITH_ID(_plugin_id, _component_class_id, _seek_method, _can_seek_method) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(msg_iter_seek_ns_from_origin_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_MSG_ITER_SEEK_NS_FROM_ORIGIN_METHOD, _plugin_id, _component_class_id, source, _seek_method); \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(msg_iter_can_seek_ns_from_origin_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_MSG_ITER_CAN_SEEK_NS_FROM_ORIGIN_METHOD, _plugin_id, _component_class_id, source, _can_seek_method) + +/*! +@brief + Alias of + BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHODS_WITH_ID() + with the \bt_p{_plugin_id} parameter set to auto and + the \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHODS(_name, _seek_method, _can_seek_method) \ + BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHODS_WITH_ID(auto, _name, _seek_method, _can_seek_method) + +/*! +@brief + Sets the "output port connected" method of the \bt_src_comp_cls + having the ID \bt_p{_component_class_id} in the plugin having the ID + \bt_p{_plugin_id} to \bt_p{_method}. + +See the +\ref api-comp-cls-dev-meth-oport-connected "output port connected" +method. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the source component class of which + to set the "output port connected" method. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the source component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the "output port connected" + method to \bt_p{_method}. + @endparblock +@param[in] _method + @parblock + #bt_component_class_source_output_port_connected_method + + Source component class's "output port connected" method. + @endparblock + +@bt_pre_not_null{_method} +*/ +#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_OUTPUT_PORT_CONNECTED_METHOD_WITH_ID(_plugin_id, _component_class_id, _method) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(source_output_port_connected_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_OUTPUT_PORT_CONNECTED_METHOD, _plugin_id, _component_class_id, source, _method) + +/*! +@brief + Alias of + BT_PLUGIN_SOURCE_COMPONENT_CLASS_OUTPUT_PORT_CONNECTED_METHOD_WITH_ID() + with the \bt_p{_plugin_id} parameter set to auto and + the \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_OUTPUT_PORT_CONNECTED_METHOD(_name, _method) \ + BT_PLUGIN_SOURCE_COMPONENT_CLASS_OUTPUT_PORT_CONNECTED_METHOD_WITH_ID(auto, _name, _method) + +/*! +@brief + Sets the query method of the \bt_src_comp_cls + having the ID \bt_p{_component_class_id} in the plugin having the ID + \bt_p{_plugin_id} to \bt_p{_method}. + +See the \ref api-comp-cls-dev-meth-query "query" method. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the source component class of which + to set the query method. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the source component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the query + method to \bt_p{_method}. + @endparblock +@param[in] _method + @parblock + #bt_component_class_source_query_method + + Source component class's query method. + @endparblock + +@bt_pre_not_null{_method} +*/ +#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_QUERY_METHOD_WITH_ID(_plugin_id, _component_class_id, _method) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(source_query_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_QUERY_METHOD, _plugin_id, _component_class_id, source, _method) + +/*! +@brief + Alias of + BT_PLUGIN_SOURCE_COMPONENT_CLASS_QUERY_METHOD_WITH_ID() + with the \bt_p{_plugin_id} parameter set to auto and + the \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_QUERY_METHOD(_name, _method) \ + BT_PLUGIN_SOURCE_COMPONENT_CLASS_QUERY_METHOD_WITH_ID(auto, _name, _method) + +/*! @} */ + +/*! +@name Filter component class methods +@{ +*/ + +/*! +@brief + Sets the finalization method of the \bt_flt_comp_cls having the ID + \bt_p{_component_class_id} in the plugin having the ID + \bt_p{_plugin_id} to \bt_p{_method}. + +See the \ref api-comp-cls-dev-meth-fini "finalize" method. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the filter component class of which + to set the finalization method. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the filter component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the finalization method to + \bt_p{_method}. + @endparblock +@param[in] _method + @parblock + #bt_component_class_filter_finalize_method + + Filter component class's finalization method. + @endparblock + +@bt_pre_not_null{_method} +*/ +#define BT_PLUGIN_FILTER_COMPONENT_CLASS_FINALIZE_METHOD_WITH_ID(_plugin_id, _component_class_id, _method) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(filter_finalize_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_FINALIZE_METHOD, _plugin_id, _component_class_id, filter, _method) + +/*! +@brief + Alias of + BT_PLUGIN_FILTER_COMPONENT_CLASS_FINALIZE_METHOD_WITH_ID() + with the \bt_p{_plugin_id} parameter set to auto and + the \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_FILTER_COMPONENT_CLASS_FINALIZE_METHOD(_name, _method) \ + BT_PLUGIN_FILTER_COMPONENT_CLASS_FINALIZE_METHOD_WITH_ID(auto, _name, _method) + +/*! +@brief + Sets the \"get supported \bt_mip versions\" method of the + \bt_flt_comp_cls having the ID \bt_p{_component_class_id} in the + plugin having the ID \bt_p{_plugin_id} to \bt_p{_method}. + +See the \ref api-comp-cls-dev-meth-mip "get supported MIP versions" +method. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the filter component class of which + to set the "get supported MIP versions" method. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the filter component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the "get supported MIP versions" + method to \bt_p{_method}. + @endparblock +@param[in] _method + @parblock + #bt_component_class_filter_get_supported_mip_versions_method + + Filter component class's "get supported MIP versions" method. + @endparblock + +@bt_pre_not_null{_method} +*/ +#define BT_PLUGIN_FILTER_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD_WITH_ID(_plugin_id, _component_class_id, _method) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(filter_get_supported_mip_versions_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_GET_SUPPORTED_MIP_VERSIONS, _plugin_id, _component_class_id, filter, _method) + +/*! +@brief + Alias of + BT_PLUGIN_FILTER_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD_WITH_ID() + with the \bt_p{_plugin_id} parameter set to auto and + the \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_FILTER_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD(_name, _method) \ + BT_PLUGIN_FILTER_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD_WITH_ID(auto, _name, _method) + +/*! +@brief + Sets the initialization method of the \bt_flt_comp_cls having the ID + \bt_p{_component_class_id} in the plugin having the ID + \bt_p{_plugin_id} to \bt_p{_method}. + +See the \ref api-comp-cls-dev-meth-init "initialize" method. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the filter component class of which + to set the initialization method. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the filter component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the initialization method to + \bt_p{_method}. + @endparblock +@param[in] _method + @parblock + #bt_component_class_filter_initialize_method + + Filter component class's initialization method. + @endparblock + +@bt_pre_not_null{_method} +*/ +#define BT_PLUGIN_FILTER_COMPONENT_CLASS_INITIALIZE_METHOD_WITH_ID(_plugin_id, _component_class_id, _method) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(filter_initialize_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_INITIALIZE_METHOD, _plugin_id, _component_class_id, filter, _method) + +/*! +@brief + Alias of + BT_PLUGIN_FILTER_COMPONENT_CLASS_INITIALIZE_METHOD_WITH_ID() + with the \bt_p{_plugin_id} parameter set to auto and + the \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_FILTER_COMPONENT_CLASS_INITIALIZE_METHOD(_name, _method) \ + BT_PLUGIN_FILTER_COMPONENT_CLASS_INITIALIZE_METHOD_WITH_ID(auto, _name, _method) + +/*! +@brief + Sets the "input port connected" method of the \bt_flt_comp_cls + having the ID \bt_p{_component_class_id} in the plugin having the ID + \bt_p{_plugin_id} to \bt_p{_method}. + +See the +\ref api-comp-cls-dev-meth-iport-connected "input port connected" +method. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the filter component class of which + to set the "input port connected" method. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the filter component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the "input port connected" + method to \bt_p{_method}. + @endparblock +@param[in] _method + @parblock + #bt_component_class_filter_input_port_connected_method + + Filter component class's "input port connected" method. + @endparblock + +@bt_pre_not_null{_method} +*/ +#define BT_PLUGIN_FILTER_COMPONENT_CLASS_INPUT_PORT_CONNECTED_METHOD_WITH_ID(_plugin_id, _component_class_id, _method) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(filter_input_port_connected_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_INPUT_PORT_CONNECTED_METHOD, _plugin_id, _component_class_id, filter, _method) + +/*! +@brief + Alias of + BT_PLUGIN_FILTER_COMPONENT_CLASS_INPUT_PORT_CONNECTED_METHOD_WITH_ID() + with the \bt_p{_plugin_id} parameter set to auto and + the \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_FILTER_COMPONENT_CLASS_INPUT_PORT_CONNECTED_METHOD(_name, _method) \ + BT_PLUGIN_FILTER_COMPONENT_CLASS_INPUT_PORT_CONNECTED_METHOD_WITH_ID(auto, _name, _method) + +/*! +@brief + Sets the finalization method of the \bt_msg_iter_cls of the + \bt_flt_comp_cls having the ID \bt_p{_component_class_id} in the + plugin having the ID \bt_p{_plugin_id} to \bt_p{_method}. + +See the \ref api-msg-iter-cls-meth-fini "finalize" method. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the filter component class of which + to set the finalization method of the message iterator class. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the filter component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the finalization method of the + message iterator class to \bt_p{_method}. + @endparblock +@param[in] _method + @parblock + #bt_message_iterator_class_finalize_method + + Filter component class's message iterator class's finalization method. + @endparblock + +@bt_pre_not_null{_method} +*/ +#define BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_FINALIZE_METHOD_WITH_ID(_plugin_id, _component_class_id, _method) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(msg_iter_finalize_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_MSG_ITER_FINALIZE_METHOD, _plugin_id, _component_class_id, filter, _method) + +/*! +@brief + Alias of + BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_FINALIZE_METHOD_WITH_ID() + with the \bt_p{_plugin_id} parameter set to auto and + the \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_FINALIZE_METHOD(_name, _method) \ + BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_FINALIZE_METHOD_WITH_ID(auto, _name, _method) + +/*! +@brief + Sets the initialization method of the \bt_msg_iter_cls of the + \bt_flt_comp_cls having the ID \bt_p{_component_class_id} in the + plugin having the ID \bt_p{_plugin_id} to \bt_p{_method}. + +See the \ref api-msg-iter-cls-meth-init "initialize" method. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the filter component class of which + to set the initialization method of the message iterator class. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the filter component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the initialization method of the + message iterator class to \bt_p{_method}. + @endparblock +@param[in] _method + @parblock + #bt_message_iterator_class_initialize_method + + Filter component class's message iterator class's initialization + method. + @endparblock + +@bt_pre_not_null{_method} +*/ +#define BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_WITH_ID(_plugin_id, _component_class_id, _method) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(msg_iter_initialize_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_MSG_ITER_INITIALIZE_METHOD, _plugin_id, _component_class_id, filter, _method) + +/*! +@brief + Alias of + BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_WITH_ID() + with the \bt_p{_plugin_id} parameter set to auto and + the \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD(_name, _method) \ + BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_WITH_ID(auto, _name, _method) + +/*! +@brief + Sets the "seek beginning" and "can seek beginning?" methods of the + \bt_msg_iter_cls of the \bt_flt_comp_cls having the ID + \bt_p{_component_class_id} in the plugin having the ID + \bt_p{_plugin_id} to \bt_p{_seek_method} and + \bt_p{_can_seek_method}. + +See the \ref api-msg-iter-cls-meth-seek-beg "seek beginning" and +\ref api-msg-iter-cls-meth-can-seek-beg "can seek beginning?" methods. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the filter component class of which + to set the "seek beginning" and "can seek beginning?" methods of the + message iterator class. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the filter component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the "seek beginning" and "can + seek beginning" methods of the message iterator class to + \bt_p{_seek_method} and \bt_p{_can_seek_method}. + @endparblock +@param[in] _seek_method + @parblock + #bt_message_iterator_class_seek_beginning_method + + Filter component class's message iterator class's "seek beginning" + method. + @endparblock +@param[in] _can_seek_method + @parblock + #bt_message_iterator_class_can_seek_beginning_method + + Filter component class's message iterator class's + "can seek beginning?" method. + + Can be \c NULL, in which case it is equivalent to setting a method + which always returns #BT_TRUE. + @endparblock + +@bt_pre_not_null{_seek_method} +@bt_pre_not_null{_can_seek_method} +*/ +#define BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHODS_WITH_ID(_plugin_id, _component_class_id, _seek_method, _can_seek_method) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(msg_iter_seek_beginning_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_MSG_ITER_SEEK_BEGINNING_METHOD, _plugin_id, _component_class_id, filter, _seek_method); \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(msg_iter_can_seek_beginning_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_MSG_ITER_CAN_SEEK_BEGINNING_METHOD, _plugin_id, _component_class_id, filter, _can_seek_method); + +/*! +@brief + Alias of + BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHODS_WITH_ID() + with the \bt_p{_plugin_id} parameter set to auto and + the \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHODS(_name, _seek_method, _can_seek_method) \ + BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHODS_WITH_ID(auto, _name, _seek_method, _can_seek_method) + +/*! +@brief + Sets the "seek ns from origin" and "can seek ns from origin?" + methods of the \bt_msg_iter_cls of the \bt_flt_comp_cls having the + ID \bt_p{_component_class_id} in the plugin having the ID + \bt_p{_plugin_id} to \bt_p{_seek_method} and + \bt_p{_can_seek_method}. + +See the \ref api-msg-iter-cls-meth-seek-ns "seek ns from origin" and +\ref api-msg-iter-cls-meth-can-seek-ns "can seek ns from origin?" +methods. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the filter component class of which + to set the "seek ns from origin" and "can seek ns from origin?" + methods of the message iterator class. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the filter component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the "seek ns from origin" and + "can seek ns from origin" methods of the message iterator class to + \bt_p{_seek_method} and \bt_p{_can_seek_method}. + @endparblock +@param[in] _seek_method + @parblock + #bt_message_iterator_class_seek_ns_from_origin_method + + Filter component class's message iterator class's "seek ns from + origin" method. + @endparblock +@param[in] _can_seek_method + @parblock + #bt_message_iterator_class_can_seek_ns_from_origin_method + + Filter component class's message iterator class's "can seek ns from + origin?" method. + + Can be \c NULL, in which case it is equivalent to setting a method + which always returns #BT_TRUE. + @endparblock + +@bt_pre_not_null{_seek_method} +@bt_pre_not_null{_can_seek_method} +*/ +#define BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHODS_WITH_ID(_plugin_id, _component_class_id, _seek_method, _can_seek_method) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(msg_iter_seek_ns_from_origin_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_MSG_ITER_SEEK_NS_FROM_ORIGIN_METHOD, _plugin_id, _component_class_id, filter, _seek_method); \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(msg_iter_can_seek_ns_from_origin_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_MSG_ITER_CAN_SEEK_NS_FROM_ORIGIN_METHOD, _plugin_id, _component_class_id, filter, _can_seek_method) + +/*! +@brief + Alias of + BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHODS_WITH_ID() + with the \bt_p{_plugin_id} parameter set to auto and + the \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHODS(_name, _seek_method, _can_seek_method) \ + BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHODS_WITH_ID(auto, _name, _seek_method, _can_seek_method) + +/*! +@brief + Sets the "output port connected" method of the \bt_flt_comp_cls + having the ID \bt_p{_component_class_id} in the plugin having the ID + \bt_p{_plugin_id} to \bt_p{_method}. + +See the +\ref api-comp-cls-dev-meth-oport-connected "output port connected" +method. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the filter component class of which + to set the "output port connected" method. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the filter component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the "output port connected" + method to \bt_p{_method}. + @endparblock +@param[in] _method + @parblock + #bt_component_class_filter_output_port_connected_method + + Filter component class's "output port connected" method. + @endparblock + +@bt_pre_not_null{_method} +*/ +#define BT_PLUGIN_FILTER_COMPONENT_CLASS_OUTPUT_PORT_CONNECTED_METHOD_WITH_ID(_plugin_id, _component_class_id, _method) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(filter_output_port_connected_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_OUTPUT_PORT_CONNECTED_METHOD, _plugin_id, _component_class_id, filter, _method) + +/*! +@brief + Alias of + BT_PLUGIN_FILTER_COMPONENT_CLASS_OUTPUT_PORT_CONNECTED_METHOD_WITH_ID() + with the \bt_p{_plugin_id} parameter set to auto and + the \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_FILTER_COMPONENT_CLASS_OUTPUT_PORT_CONNECTED_METHOD(_name, _method) \ + BT_PLUGIN_FILTER_COMPONENT_CLASS_OUTPUT_PORT_CONNECTED_METHOD_WITH_ID(auto, _name, _method) + +/*! +@brief + Sets the query method of the \bt_flt_comp_cls + having the ID \bt_p{_component_class_id} in the plugin having the ID + \bt_p{_plugin_id} to \bt_p{_method}. + +See the \ref api-comp-cls-dev-meth-query "query" method. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the filter component class of which + to set the query method. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the filter component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the query + method to \bt_p{_method}. + @endparblock +@param[in] _method + @parblock + #bt_component_class_filter_query_method + + Filter component class's query method. + @endparblock + +@bt_pre_not_null{_method} +*/ +#define BT_PLUGIN_FILTER_COMPONENT_CLASS_QUERY_METHOD_WITH_ID(_plugin_id, _component_class_id, _method) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(filter_query_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_QUERY_METHOD, _plugin_id, _component_class_id, filter, _method) + +/*! +@brief + Alias of + BT_PLUGIN_FILTER_COMPONENT_CLASS_QUERY_METHOD_WITH_ID() + with the \bt_p{_plugin_id} parameter set to auto and + the \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_FILTER_COMPONENT_CLASS_QUERY_METHOD(_name, _method) \ + BT_PLUGIN_FILTER_COMPONENT_CLASS_QUERY_METHOD_WITH_ID(auto, _name, _method) + +/*! @} */ + +/*! +@name Sink component class methods +@{ +*/ + +/*! +@brief + Sets the finalization method of the \bt_sink_comp_cls having the ID + \bt_p{_component_class_id} in the plugin having the ID + \bt_p{_plugin_id} to \bt_p{_method}. + +See the \ref api-comp-cls-dev-meth-fini "finalize" method. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the sink component class of which + to set the finalization method. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the sink component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the finalization method to + \bt_p{_method}. + @endparblock +@param[in] _method + @parblock + #bt_component_class_sink_finalize_method + + Sink component class's finalization method. + @endparblock + +@bt_pre_not_null{_method} +*/ +#define BT_PLUGIN_SINK_COMPONENT_CLASS_FINALIZE_METHOD_WITH_ID(_plugin_id, _component_class_id, _method) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(sink_finalize_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_FINALIZE_METHOD, _plugin_id, _component_class_id, sink, _method) + +/*! +@brief + Alias of + BT_PLUGIN_SINK_COMPONENT_CLASS_FINALIZE_METHOD_WITH_ID() + with the \bt_p{_plugin_id} parameter set to auto and + the \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_SINK_COMPONENT_CLASS_FINALIZE_METHOD(_name, _method) \ + BT_PLUGIN_SINK_COMPONENT_CLASS_FINALIZE_METHOD_WITH_ID(auto, _name, _method) + +/*! +@brief + Sets the \"get supported \bt_mip versions\" method of the + \bt_sink_comp_cls having the ID \bt_p{_component_class_id} in the + plugin having the ID \bt_p{_plugin_id} to \bt_p{_method}. + +See the \ref api-comp-cls-dev-meth-mip "get supported MIP versions" +method. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the sink component class of which + to set the "get supported MIP versions" method. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the sink component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the "get supported MIP versions" + method to \bt_p{_method}. + @endparblock +@param[in] _method + @parblock + #bt_component_class_sink_get_supported_mip_versions_method + + Sink component class's "get supported MIP versions" method. + @endparblock + +@bt_pre_not_null{_method} +*/ +#define BT_PLUGIN_SINK_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD_WITH_ID(_plugin_id, _component_class_id, _method) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(sink_get_supported_mip_versions_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_GET_SUPPORTED_MIP_VERSIONS, _plugin_id, _component_class_id, sink, _method) + +/*! +@brief + Alias of + BT_PLUGIN_SINK_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD_WITH_ID() + with the \bt_p{_plugin_id} parameter set to auto and + the \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_SINK_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD(_name, _method) \ + BT_PLUGIN_SINK_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD_WITH_ID(auto, _name, _method) + +/*! +@brief + Sets the "graph is configured" method of the \bt_sink_comp_cls + having the ID \bt_p{_component_class_id} in the plugin having the ID + \bt_p{_plugin_id} to \bt_p{_method}. + +See the +\ref api-comp-cls-dev-meth-graph-configured "graph is configured" +method. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the sink component class of which + to set the "graph is configured" method. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the sink component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the "graph is configured" + method to \bt_p{_method}. + @endparblock +@param[in] _method + @parblock + #bt_component_class_sink_graph_is_configured_method + + Sink component class's "graph is configured" method. + @endparblock + +@bt_pre_not_null{_method} +*/ +#define BT_PLUGIN_SINK_COMPONENT_CLASS_GRAPH_IS_CONFIGURED_METHOD_WITH_ID(_plugin_id, _component_class_id, _method) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(sink_graph_is_configured_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_GRAPH_IS_CONFIGURED_METHOD, _plugin_id, _component_class_id, sink, _method) + +/*! +@brief + Alias of + BT_PLUGIN_SINK_COMPONENT_CLASS_GRAPH_IS_CONFIGURED_METHOD_WITH_ID() + with the \bt_p{_plugin_id} parameter set to auto and + the \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_SINK_COMPONENT_CLASS_GRAPH_IS_CONFIGURED_METHOD(_name, _method) \ + BT_PLUGIN_SINK_COMPONENT_CLASS_GRAPH_IS_CONFIGURED_METHOD_WITH_ID(auto, _name, _method) + +/*! +@brief + Sets the initialization method of the \bt_sink_comp_cls having the + ID \bt_p{_component_class_id} in the plugin having the ID + \bt_p{_plugin_id} to \bt_p{_method}. + +See the \ref api-comp-cls-dev-meth-init "initialize" method. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the sink component class of which + to set the initialization method. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the sink component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the initialization method to + \bt_p{_method}. + @endparblock +@param[in] _method + @parblock + #bt_component_class_sink_initialize_method + + Sink component class's initialization method. + @endparblock + +@bt_pre_not_null{_method} +*/ +#define BT_PLUGIN_SINK_COMPONENT_CLASS_INITIALIZE_METHOD_WITH_ID(_plugin_id, _component_class_id, _method) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(sink_initialize_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_INITIALIZE_METHOD, _plugin_id, _component_class_id, sink, _method) + +/*! +@brief + Alias of + BT_PLUGIN_SINK_COMPONENT_CLASS_INITIALIZE_METHOD_WITH_ID() + with the \bt_p{_plugin_id} parameter set to auto and + the \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_SINK_COMPONENT_CLASS_INITIALIZE_METHOD(_name, _method) \ + BT_PLUGIN_SINK_COMPONENT_CLASS_INITIALIZE_METHOD_WITH_ID(auto, _name, _method) + +/*! +@brief + Sets the "input port connected" method of the \bt_sink_comp_cls + having the ID \bt_p{_component_class_id} in the plugin having the ID + \bt_p{_plugin_id} to \bt_p{_method}. + +See the +\ref api-comp-cls-dev-meth-iport-connected "input port connected" +method. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the sink component class of which + to set the "input port connected" method. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the sink component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the "input port connected" + method to \bt_p{_method}. + @endparblock +@param[in] _method + @parblock + #bt_component_class_sink_input_port_connected_method + + Sink component class's "input port connected" method. + @endparblock + +@bt_pre_not_null{_method} +*/ +#define BT_PLUGIN_SINK_COMPONENT_CLASS_INPUT_PORT_CONNECTED_METHOD_WITH_ID(_plugin_id, _component_class_id, _method) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(sink_input_port_connected_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_INPUT_PORT_CONNECTED_METHOD, _plugin_id, _component_class_id, sink, _method) + +/*! +@brief + Alias of + BT_PLUGIN_SINK_COMPONENT_CLASS_INPUT_PORT_CONNECTED_METHOD_WITH_ID() + with the \bt_p{_plugin_id} parameter set to auto and + the \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_SINK_COMPONENT_CLASS_INPUT_PORT_CONNECTED_METHOD(_name, _method) \ + BT_PLUGIN_SINK_COMPONENT_CLASS_INPUT_PORT_CONNECTED_METHOD_WITH_ID(auto, _name, _method) + +/*! +@brief + Sets the query method of the \bt_sink_comp_cls + having the ID \bt_p{_component_class_id} in the plugin having the ID + \bt_p{_plugin_id} to \bt_p{_method}. + +See the \ref api-comp-cls-dev-meth-query "query" method. + +@param[in] _plugin_id + @parblock + C identifier. + + ID of the plugin which contains the sink component class of which + to set the query method. + @endparblock +@param[in] _component_class_id + @parblock + C identifier. + + ID of the sink component class, within the plugin having the ID + \bt_p{_plugin_id}, of which to set the query + method to \bt_p{_method}. + @endparblock +@param[in] _method + @parblock + #bt_component_class_sink_query_method + + Sink component class's query method. + @endparblock + +@bt_pre_not_null{_method} +*/ +#define BT_PLUGIN_SINK_COMPONENT_CLASS_QUERY_METHOD_WITH_ID(_plugin_id, _component_class_id, _method) \ + __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(sink_query_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_QUERY_METHOD, _plugin_id, _component_class_id, sink, _method) + +/*! +@brief + Alias of + BT_PLUGIN_SINK_COMPONENT_CLASS_QUERY_METHOD_WITH_ID() + with the \bt_p{_plugin_id} parameter set to auto and + the \bt_p{_component_class_id} parameter set to \bt_p{_name}. +*/ +#define BT_PLUGIN_SINK_COMPONENT_CLASS_QUERY_METHOD(_name, _method) \ + BT_PLUGIN_SINK_COMPONENT_CLASS_QUERY_METHOD_WITH_ID(auto, _name, _method) + +/*! @} */ + +/*! @} */ + /* Plugin descriptor: describes a single plugin (internal use) */ struct __bt_plugin_descriptor { /* Plugin's name */ @@ -255,6 +2619,47 @@ struct __bt_plugin_component_class_descriptor const * const *__bt_get_end_sectio struct __bt_plugin_component_class_descriptor_attribute const * const *__bt_get_begin_section_component_class_descriptor_attributes(void); struct __bt_plugin_component_class_descriptor_attribute const * const *__bt_get_end_section_component_class_descriptor_attributes(void); +/* + * Defines a plugin attribute (generic, internal use). + * + * _attr_name: Name of the attribute (C identifier). + * _attr_type: Type of the attribute (enum __bt_plugin_descriptor_attribute_type). + * _id: Plugin descriptor ID (C identifier). + * _x: Value. + */ +#define __BT_PLUGIN_DESCRIPTOR_ATTRIBUTE(_attr_name, _attr_type, _id, _x) \ + static struct __bt_plugin_descriptor_attribute __bt_plugin_descriptor_attribute_##_id##_##_attr_name = { \ + .plugin_descriptor = &__bt_plugin_descriptor_##_id, \ + .type_name = #_attr_name, \ + .type = _attr_type, \ + .value = { ._attr_name = _x }, \ + }; \ + static struct __bt_plugin_descriptor_attribute const * const __bt_plugin_descriptor_attribute_##_id##_##_attr_name##_ptr __BT_PLUGIN_DESCRIPTOR_ATTRIBUTES_ATTRS = &__bt_plugin_descriptor_attribute_##_id##_##_attr_name + +#define __BT_PLUGIN_VERSION_STRUCT_VALUE(_major, _minor, _patch, _extra) \ + {.major = _major, .minor = _minor, .patch = _patch, .extra = _extra,} + +/* + * Defines a component class descriptor attribute (generic, internal + * use). + * + * _id: Plugin descriptor ID (C identifier). + * _component_class_id: Component class ID (C identifier). + * _type: Component class type (`source`, `filter`, or `sink`). + * _attr_name: Name of the attribute (C identifier). + * _attr_type: Type of the attribute + * (enum __bt_plugin_descriptor_attribute_type). + * _x: Value. + */ +#define __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(_attr_name, _attr_type, _id, _component_class_id, _type, _x) \ + static struct __bt_plugin_component_class_descriptor_attribute __bt_plugin_##_type##_component_class_descriptor_attribute_##_id##_##_component_class_id##_##_attr_name = { \ + .comp_class_descriptor = &__bt_plugin_##_type##_component_class_descriptor_##_id##_##_component_class_id, \ + .type_name = #_attr_name, \ + .type = _attr_type, \ + .value = { ._attr_name = _x }, \ + }; \ + static struct __bt_plugin_component_class_descriptor_attribute const * const __bt_plugin_##_type##_component_class_descriptor_attribute_##_id##_##_component_class_id##_##_attr_name##_ptr __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTES_ATTRS = &__bt_plugin_##_type##_component_class_descriptor_attribute_##_id##_##_component_class_id##_##_attr_name + /* * Variable attributes for a plugin descriptor pointer to be added to * the plugin descriptor section (internal use). @@ -400,1042 +2805,6 @@ struct __bt_plugin_component_class_descriptor_attribute const * const *__bt_get_ #define __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTES_END_EXTRA #endif -/* - * Declares a plugin descriptor pointer variable with a custom ID. - * - * _id: ID (any valid C identifier except `auto`). - */ -#define BT_PLUGIN_DECLARE(_id) extern struct __bt_plugin_descriptor __bt_plugin_descriptor_##_id - -/* - * Defines a plugin descriptor with a custom ID. - * - * _id: ID (any valid C identifier except `auto`). - * _name: Plugin's name (C string). - */ -#define BT_PLUGIN_WITH_ID(_id, _name) \ - struct __bt_plugin_descriptor __bt_plugin_descriptor_##_id = { \ - .name = _name, \ - }; \ - static struct __bt_plugin_descriptor const * const __bt_plugin_descriptor_##_id##_ptr __BT_PLUGIN_DESCRIPTOR_ATTRS = &__bt_plugin_descriptor_##_id - -/* - * Defines a plugin attribute (generic, internal use). - * - * _attr_name: Name of the attribute (C identifier). - * _attr_type: Type of the attribute (enum __bt_plugin_descriptor_attribute_type). - * _id: Plugin descriptor ID (C identifier). - * _x: Value. - */ -#define __BT_PLUGIN_DESCRIPTOR_ATTRIBUTE(_attr_name, _attr_type, _id, _x) \ - static struct __bt_plugin_descriptor_attribute __bt_plugin_descriptor_attribute_##_id##_##_attr_name = { \ - .plugin_descriptor = &__bt_plugin_descriptor_##_id, \ - .type_name = #_attr_name, \ - .type = _attr_type, \ - .value = { ._attr_name = _x }, \ - }; \ - static struct __bt_plugin_descriptor_attribute const * const __bt_plugin_descriptor_attribute_##_id##_##_attr_name##_ptr __BT_PLUGIN_DESCRIPTOR_ATTRIBUTES_ATTRS = &__bt_plugin_descriptor_attribute_##_id##_##_attr_name - -/* - * Defines a plugin initialization function attribute attached to a - * specific plugin descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _x: Initialization function (bt_plugin_initialize_func). - */ -#define BT_PLUGIN_INITIALIZE_FUNC_WITH_ID(_id, _x) \ - __BT_PLUGIN_DESCRIPTOR_ATTRIBUTE(init, BT_PLUGIN_DESCRIPTOR_ATTRIBUTE_TYPE_INIT, _id, _x) - -/* - * Defines a plugin exit function attribute attached to a specific - * plugin descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _x: Exit function (bt_plugin_finalize_func). - */ -#define BT_PLUGIN_FINALIZE_FUNC_WITH_ID(_id, _x) \ - __BT_PLUGIN_DESCRIPTOR_ATTRIBUTE(exit, BT_PLUGIN_DESCRIPTOR_ATTRIBUTE_TYPE_EXIT, _id, _x) - -/* - * Defines an author attribute attached to a specific plugin descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _x: Author (C string). - */ -#define BT_PLUGIN_AUTHOR_WITH_ID(_id, _x) \ - __BT_PLUGIN_DESCRIPTOR_ATTRIBUTE(author, BT_PLUGIN_DESCRIPTOR_ATTRIBUTE_TYPE_AUTHOR, _id, _x) - -/* - * Defines a license attribute attached to a specific plugin descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _x: License (C string). - */ -#define BT_PLUGIN_LICENSE_WITH_ID(_id, _x) \ - __BT_PLUGIN_DESCRIPTOR_ATTRIBUTE(license, BT_PLUGIN_DESCRIPTOR_ATTRIBUTE_TYPE_LICENSE, _id, _x) - -/* - * Defines a description attribute attached to a specific plugin - * descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _x: Description (C string). - */ -#define BT_PLUGIN_DESCRIPTION_WITH_ID(_id, _x) \ - __BT_PLUGIN_DESCRIPTOR_ATTRIBUTE(description, BT_PLUGIN_DESCRIPTOR_ATTRIBUTE_TYPE_DESCRIPTION, _id, _x) - -#define __BT_PLUGIN_VERSION_STRUCT_VALUE(_major, _minor, _patch, _extra) \ - {.major = _major, .minor = _minor, .patch = _patch, .extra = _extra,} - -/* - * Defines a version attribute attached to a specific plugin descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _major: Plugin's major version (uint32_t). - * _minor: Plugin's minor version (uint32_t). - * _patch: Plugin's patch version (uint32_t). - * _extra: Plugin's version extra information (C string). - */ -#define BT_PLUGIN_VERSION_WITH_ID(_id, _major, _minor, _patch, _extra) \ - __BT_PLUGIN_DESCRIPTOR_ATTRIBUTE(version, BT_PLUGIN_DESCRIPTOR_ATTRIBUTE_TYPE_VERSION, _id, __BT_PLUGIN_VERSION_STRUCT_VALUE(_major, _minor, _patch, _extra)) - -/* - * Defines a source component class descriptor with a custom ID. - * - * _id: ID (any valid C identifier except `auto`). - * _comp_class_id: Component class ID (C identifier). - * _name: Component class name (C string). - * _msg_iter_next_method: Component class's iterator next method - * (bt_component_class_source_message_iterator_next_method). - */ -#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_WITH_ID(_id, _comp_class_id, _name, _msg_iter_next_method) \ - static struct __bt_plugin_component_class_descriptor __bt_plugin_source_component_class_descriptor_##_id##_##_comp_class_id = { \ - .plugin_descriptor = &__bt_plugin_descriptor_##_id, \ - .name = _name, \ - .type = BT_COMPONENT_CLASS_TYPE_SOURCE, \ - .methods = { .source = { .msg_iter_next = _msg_iter_next_method } }, \ - }; \ - static struct __bt_plugin_component_class_descriptor const * const __bt_plugin_source_component_class_descriptor_##_id##_##_comp_class_id##_ptr __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRS = &__bt_plugin_source_component_class_descriptor_##_id##_##_comp_class_id - -/* - * Defines a filter component class descriptor with a custom ID. - * - * _id: ID (any valid C identifier except `auto`). - * _comp_class_id: Component class ID (C identifier). - * _name: Component class name (C string). - * _msg_iter_next_method: Component class's iterator next method - * (bt_component_class_filter_message_iterator_next_method). - */ -#define BT_PLUGIN_FILTER_COMPONENT_CLASS_WITH_ID(_id, _comp_class_id, _name, _msg_iter_next_method) \ - static struct __bt_plugin_component_class_descriptor __bt_plugin_filter_component_class_descriptor_##_id##_##_comp_class_id = { \ - .plugin_descriptor = &__bt_plugin_descriptor_##_id, \ - .name = _name, \ - .type = BT_COMPONENT_CLASS_TYPE_FILTER, \ - .methods = { .filter = { .msg_iter_next = _msg_iter_next_method } }, \ - }; \ - static struct __bt_plugin_component_class_descriptor const * const __bt_plugin_filter_component_class_descriptor_##_id##_##_comp_class_id##_ptr __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRS = &__bt_plugin_filter_component_class_descriptor_##_id##_##_comp_class_id - -/* - * Defines a sink component class descriptor with a custom ID. - * - * _id: ID (any valid C identifier except `auto`). - * _comp_class_id: Component class ID (C identifier). - * _name: Component class name (C string). - * _consume_method: Component class's iterator consume method - * (bt_component_class_sink_consume_method). - */ -#define BT_PLUGIN_SINK_COMPONENT_CLASS_WITH_ID(_id, _comp_class_id, _name, _consume_method) \ - static struct __bt_plugin_component_class_descriptor __bt_plugin_sink_component_class_descriptor_##_id##_##_comp_class_id = { \ - .plugin_descriptor = &__bt_plugin_descriptor_##_id, \ - .name = _name, \ - .type = BT_COMPONENT_CLASS_TYPE_SINK, \ - .methods = { .sink = { .consume = _consume_method } }, \ - }; \ - static struct __bt_plugin_component_class_descriptor const * const __bt_plugin_sink_component_class_descriptor_##_id##_##_comp_class_id##_ptr __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRS = &__bt_plugin_sink_component_class_descriptor_##_id##_##_comp_class_id - -/* - * Defines a component class descriptor attribute (generic, internal - * use). - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class ID (C identifier). - * _type: Component class type (`source`, `filter`, or `sink`). - * _attr_name: Name of the attribute (C identifier). - * _attr_type: Type of the attribute - * (enum __bt_plugin_descriptor_attribute_type). - * _x: Value. - */ -#define __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(_attr_name, _attr_type, _id, _comp_class_id, _type, _x) \ - static struct __bt_plugin_component_class_descriptor_attribute __bt_plugin_##_type##_component_class_descriptor_attribute_##_id##_##_comp_class_id##_##_attr_name = { \ - .comp_class_descriptor = &__bt_plugin_##_type##_component_class_descriptor_##_id##_##_comp_class_id, \ - .type_name = #_attr_name, \ - .type = _attr_type, \ - .value = { ._attr_name = _x }, \ - }; \ - static struct __bt_plugin_component_class_descriptor_attribute const * const __bt_plugin_##_type##_component_class_descriptor_attribute_##_id##_##_comp_class_id##_##_attr_name##_ptr __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTES_ATTRS = &__bt_plugin_##_type##_component_class_descriptor_attribute_##_id##_##_comp_class_id##_##_attr_name - -/* - * Defines a description attribute attached to a specific source - * component class descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _x: Description (C string). - */ -#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_DESCRIPTION_WITH_ID(_id, _comp_class_id, _x) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(description, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_DESCRIPTION, _id, _comp_class_id, source, _x) - -/* - * Defines a description attribute attached to a specific filter - * component class descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _x: Description (C string). - */ -#define BT_PLUGIN_FILTER_COMPONENT_CLASS_DESCRIPTION_WITH_ID(_id, _comp_class_id, _x) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(description, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_DESCRIPTION, _id, _comp_class_id, filter, _x) - -/* - * Defines a description attribute attached to a specific sink - * component class descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _x: Description (C string). - */ -#define BT_PLUGIN_SINK_COMPONENT_CLASS_DESCRIPTION_WITH_ID(_id, _comp_class_id, _x) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(description, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_DESCRIPTION, _id, _comp_class_id, sink, _x) - -/* - * Defines a help attribute attached to a specific source component - * class descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _x: Help (C string). - */ -#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_HELP_WITH_ID(_id, _comp_class_id, _x) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(help, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_HELP, _id, _comp_class_id, source, _x) - -/* - * Defines a help attribute attached to a specific filter component - * class descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _x: Help (C string). - */ -#define BT_PLUGIN_FILTER_COMPONENT_CLASS_HELP_WITH_ID(_id, _comp_class_id, _x) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(help, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_HELP, _id, _comp_class_id, filter, _x) - -/* - * Defines a help attribute attached to a specific sink component class - * descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _x: Help (C string). - */ -#define BT_PLUGIN_SINK_COMPONENT_CLASS_HELP_WITH_ID(_id, _comp_class_id, _x) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(help, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_HELP, _id, _comp_class_id, sink, _x) - -/* - * Defines an initialization method attribute attached to a specific - * source component class descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _x: Initialization method (bt_component_class_source_initialize_method). - */ -#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_INITIALIZE_METHOD_WITH_ID(_id, _comp_class_id, _x) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(source_initialize_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_INITIALIZE_METHOD, _id, _comp_class_id, source, _x) - -/* - * Defines an initialization method attribute attached to a specific - * filter component class descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _x: Initialization method (bt_component_class_filter_initialize_method). - */ -#define BT_PLUGIN_FILTER_COMPONENT_CLASS_INITIALIZE_METHOD_WITH_ID(_id, _comp_class_id, _x) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(filter_initialize_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_INITIALIZE_METHOD, _id, _comp_class_id, filter, _x) - -/* - * Defines an initialization method attribute attached to a specific - * sink component class descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _x: Initialization method (bt_component_class_sink_initialize_method). - */ -#define BT_PLUGIN_SINK_COMPONENT_CLASS_INITIALIZE_METHOD_WITH_ID(_id, _comp_class_id, _x) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(sink_initialize_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_INITIALIZE_METHOD, _id, _comp_class_id, sink, _x) - -/* - * Defines a "get supported MIP versions" attribute attached to a - * specific source component class descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _x: "Get supported MIP versions" method (bt_component_class_source_get_supported_mip_versions_method). - */ -#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_WITH_ID(_id, _comp_class_id, _x) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(source_get_supported_mip_versions_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_GET_SUPPORTED_MIP_VERSIONS, _id, _comp_class_id, source, _x) - -/* - * Defines a "get supported MIP versions" attribute attached to a - * specific filter component class descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _x: "Get supported MIP versions" method (bt_component_class_filter_get_supported_mip_versions_method). - */ -#define BT_PLUGIN_FILTER_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_WITH_ID(_id, _comp_class_id, _x) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(filter_get_supported_mip_versions_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_GET_SUPPORTED_MIP_VERSIONS, _id, _comp_class_id, filter, _x) - -/* - * Defines a "get supported MIP versions" attribute attached to a - * specific sink component class descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _x: "Get supported MIP versions" method (bt_component_class_sink_get_supported_mip_versions_method). - */ -#define BT_PLUGIN_SINK_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_WITH_ID(_id, _comp_class_id, _x) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(sink_get_supported_mip_versions_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_GET_SUPPORTED_MIP_VERSIONS, _id, _comp_class_id, sink, _x) - -/* - * Defines a finalization method attribute attached to a specific source - * component class descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _x: Finalize method (bt_component_class_source_finalize_method). - */ -#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_FINALIZE_METHOD_WITH_ID(_id, _comp_class_id, _x) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(source_finalize_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_FINALIZE_METHOD, _id, _comp_class_id, source, _x) - -/* - * Defines a finalization method attribute attached to a specific filter - * component class descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _x: Finalize method (bt_component_class_filter_finalize_method). - */ -#define BT_PLUGIN_FILTER_COMPONENT_CLASS_FINALIZE_METHOD_WITH_ID(_id, _comp_class_id, _x) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(filter_finalize_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_FINALIZE_METHOD, _id, _comp_class_id, filter, _x) - -/* - * Defines a finalization method attribute attached to a specific sink - * component class descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _x: Finalize method (bt_component_class_sink_finalize_method). - */ -#define BT_PLUGIN_SINK_COMPONENT_CLASS_FINALIZE_METHOD_WITH_ID(_id, _comp_class_id, _x) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(sink_finalize_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_FINALIZE_METHOD, _id, _comp_class_id, sink, _x) - -/* - * Defines a query method attribute attached to a specific source - * component class descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _x: Finalize method (bt_component_class_source_query_method). - */ -#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_QUERY_METHOD_WITH_ID(_id, _comp_class_id, _x) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(source_query_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_QUERY_METHOD, _id, _comp_class_id, source, _x) - -/* - * Defines a query method attribute attached to a specific filter - * component class descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _x: Finalize method (bt_component_class_filter_query_method). - */ -#define BT_PLUGIN_FILTER_COMPONENT_CLASS_QUERY_METHOD_WITH_ID(_id, _comp_class_id, _x) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(filter_query_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_QUERY_METHOD, _id, _comp_class_id, filter, _x) - -/* - * Defines a query method attribute attached to a specific sink - * component class descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _x: Finalize method (bt_component_class_sink_query_method). - */ -#define BT_PLUGIN_SINK_COMPONENT_CLASS_QUERY_METHOD_WITH_ID(_id, _comp_class_id, _x) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(sink_query_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_QUERY_METHOD, _id, _comp_class_id, sink, _x) - -/* - * Defines an input port connected method attribute attached to a - * specific filter component class descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _x: Port connected method - * (bt_component_class_filter_input_port_connected_method). - */ -#define BT_PLUGIN_FILTER_COMPONENT_CLASS_INPUT_PORT_CONNECTED_METHOD_WITH_ID(_id, _comp_class_id, _x) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(filter_input_port_connected_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_INPUT_PORT_CONNECTED_METHOD, _id, _comp_class_id, filter, _x) - -/* - * Defines an input port connected method attribute attached to a - * specific sink component class descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _x: Port connected method - * (bt_component_class_sink_input_port_connected_method). - */ -#define BT_PLUGIN_SINK_COMPONENT_CLASS_INPUT_PORT_CONNECTED_METHOD_WITH_ID(_id, _comp_class_id, _x) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(sink_input_port_connected_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_INPUT_PORT_CONNECTED_METHOD, _id, _comp_class_id, sink, _x) - -/* - * Defines an output port connected method attribute attached to a - * specific source component class descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _x: Port connected method - * (bt_component_class_source_output_port_connected_method). - */ -#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_OUTPUT_PORT_CONNECTED_METHOD_WITH_ID(_id, _comp_class_id, _x) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(source_output_port_connected_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_OUTPUT_PORT_CONNECTED_METHOD, _id, _comp_class_id, source, _x) - -/* - * Defines an output port connected method attribute attached to a - * specific filter component class descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _x: Port connected method - * (bt_component_class_filter_output_port_connected_method). - */ -#define BT_PLUGIN_FILTER_COMPONENT_CLASS_OUTPUT_PORT_CONNECTED_METHOD_WITH_ID(_id, _comp_class_id, _x) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(filter_output_port_connected_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_OUTPUT_PORT_CONNECTED_METHOD, _id, _comp_class_id, filter, _x) - -/* - * Defines a "graph is configured" method attribute attached to a - * specific sink component class descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _x: "Graph is configured" method - * (bt_component_class_sink_graph_is_configured_method). - */ -#define BT_PLUGIN_SINK_COMPONENT_CLASS_GRAPH_IS_CONFIGURED_METHOD_WITH_ID(_id, _comp_class_id, _x) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(sink_graph_is_configured_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_GRAPH_IS_CONFIGURED_METHOD, _id, _comp_class_id, sink, _x) - -/* - * Defines an iterator initialization method attribute attached to a - * specific source component class descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _x: Iterator initialization method - * (bt_component_class_source_message_iterator_initialize_method). - */ -#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_WITH_ID(_id, _comp_class_id, _x) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(msg_iter_initialize_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_MSG_ITER_INITIALIZE_METHOD, _id, _comp_class_id, source, _x) - -/* - * Defines an iterator finalize method attribute attached to a specific - * source component class descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _x: Iterator finalize method - * (bt_component_class_source_message_iterator_finalize_method). - */ -#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_FINALIZE_METHOD_WITH_ID(_id, _comp_class_id, _x) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(msg_iter_finalize_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_MSG_ITER_FINALIZE_METHOD, _id, _comp_class_id, source, _x) - -/* - * Defines an iterator "seek nanoseconds from origin" and "can seek nanoseconds - * from origin" method attributes attached to a specific source component class - * descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _seek_method: Iterator "seek nanoseconds from origin" method - * (bt_component_class_source_message_iterator_seek_ns_from_origin_method). - * _can_seek_method: Iterator "can seek nanoseconds from origin" method - * (bt_component_class_source_message_iterator_can_seek_ns_from_origin_method). - */ -#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHODS_WITH_ID(_id, _comp_class_id, _seek_method, _can_seek_method) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(msg_iter_seek_ns_from_origin_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_MSG_ITER_SEEK_NS_FROM_ORIGIN_METHOD, _id, _comp_class_id, source, _seek_method); \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(msg_iter_can_seek_ns_from_origin_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_MSG_ITER_CAN_SEEK_NS_FROM_ORIGIN_METHOD, _id, _comp_class_id, source, _can_seek_method) - -/* - * Defines an iterator "seek beginning" and "can seek beginning" method - * attributes attached to a specific source component class descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _seek_method: Iterator "seek beginning" method - * (bt_component_class_source_message_iterator_seek_beginning_method). - * _can_seek_method: Iterator "can seek beginning" method - * (bt_component_class_source_message_iterator_can_seek_beginning_method). - */ -#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHODS_WITH_ID(_id, _comp_class_id, _seek_method, _can_seek_method) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(msg_iter_seek_beginning_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_MSG_ITER_SEEK_BEGINNING_METHOD, _id, _comp_class_id, source, _seek_method); \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(msg_iter_can_seek_beginning_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_MSG_ITER_CAN_SEEK_BEGINNING_METHOD, _id, _comp_class_id, source, _can_seek_method) - -/* - * Defines an iterator initialization method attribute attached to a - * specific filter component class descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _x: Iterator initialization method - * (bt_component_class_filter_message_iterator_initialize_method). - */ -#define BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_WITH_ID(_id, _comp_class_id, _x) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(msg_iter_initialize_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_MSG_ITER_INITIALIZE_METHOD, _id, _comp_class_id, filter, _x) - -/* - * Defines an iterator finalize method attribute attached to a specific - * filter component class descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _x: Iterator finalize method - * (bt_component_class_filter_message_iterator_finalize_method). - */ -#define BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_FINALIZE_METHOD_WITH_ID(_id, _comp_class_id, _x) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(msg_iter_finalize_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_MSG_ITER_FINALIZE_METHOD, _id, _comp_class_id, filter, _x) - -/* - * Defines an iterator "seek nanoseconds" and "can seek nanoseconds from origin" - * method attributes attached to a specific filter component class descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _seek_method: Iterator "seek nanoseconds from origin" method - * (bt_component_class_filter_message_iterator_seek_ns_from_origin_method). - * _can_seek_method: Iterator "can seek nanoseconds from origin" method - * (bt_component_class_filter_message_iterator_can_seek_ns_from_origin_method). - */ -#define BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHODS_WITH_ID(_id, _comp_class_id, _seek_method, _can_seek_method) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(msg_iter_seek_ns_from_origin_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_MSG_ITER_SEEK_NS_FROM_ORIGIN_METHOD, _id, _comp_class_id, filter, _seek_method); \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(msg_iter_can_seek_ns_from_origin_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_MSG_ITER_CAN_SEEK_NS_FROM_ORIGIN_METHOD, _id, _comp_class_id, filter, _can_seek_method) - -/* - * Defines an iterator "seek beginning" and "can seek beginning" method - * attributes attached to a specific filter component class descriptor. - * - * _id: Plugin descriptor ID (C identifier). - * _comp_class_id: Component class descriptor ID (C identifier). - * _seek_method: Iterator "seek beginning" method - * (bt_component_class_filter_message_iterator_seek_beginning_method). - * _can_seek_method: Iterator "can seek beginning" method - * (bt_component_class_filter_message_iterator_can_seek_beginning_method). - */ -#define BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHODS_WITH_ID(_id, _comp_class_id, _seek_method, _can_seek_method) \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(msg_iter_seek_beginning_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_MSG_ITER_SEEK_BEGINNING_METHOD, _id, _comp_class_id, filter, _seek_method); \ - __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE(msg_iter_can_seek_beginning_method, BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_MSG_ITER_CAN_SEEK_BEGINNING_METHOD, _id, _comp_class_id, filter, _can_seek_method); - -/* - * Defines a plugin descriptor with an automatic ID. - * - * _name: Plugin's name (C string). - */ -#define BT_PLUGIN(_name) static BT_PLUGIN_WITH_ID(auto, #_name) - -/* - * Defines a plugin initialization function attribute attached to the - * automatic plugin descriptor. - * - * _x: Initialization function (bt_plugin_initialize_func). - */ -#define BT_PLUGIN_INITIALIZE_FUNC(_x) BT_PLUGIN_INITIALIZE_FUNC_WITH_ID(auto, _x) - - /* - * Defines a plugin exit function attribute attached to the automatic - * plugin descriptor. - * - * _x: Exit function (bt_plugin_finalize_func). - */ -#define BT_PLUGIN_FINALIZE_FUNC(_x) BT_PLUGIN_FINALIZE_FUNC_WITH_ID(auto, _x) - -/* - * Defines an author attribute attached to the automatic plugin - * descriptor. - * - * _x: Author (C string). - */ -#define BT_PLUGIN_AUTHOR(_x) BT_PLUGIN_AUTHOR_WITH_ID(auto, _x) - -/* - * Defines a license attribute attached to the automatic plugin - * descriptor. - * - * _x: License (C string). - */ -#define BT_PLUGIN_LICENSE(_x) BT_PLUGIN_LICENSE_WITH_ID(auto, _x) - -/* - * Defines a description attribute attached to the automatic plugin - * descriptor. - * - * _x: Description (C string). - */ -#define BT_PLUGIN_DESCRIPTION(_x) BT_PLUGIN_DESCRIPTION_WITH_ID(auto, _x) - -/* - * Defines a version attribute attached to the automatic plugin - * descriptor. - * - * _major: Plugin's major version (uint32_t). - * _minor: Plugin's minor version (uint32_t). - * _patch: Plugin's patch version (uint32_t). - * _extra: Plugin's version extra information (C string). - */ -#define BT_PLUGIN_VERSION(_major, _minor, _patch, _extra) BT_PLUGIN_VERSION_WITH_ID(auto, _major, _minor, _patch, _extra) - -/* - * Defines a source component class attached to the automatic plugin - * descriptor. Its ID is the same as its name, hence its name must be a - * C identifier in this version. - * - * _name: Component class name (C identifier). - * _msg_iter_next_method: Component class's iterator next method - * (bt_component_class_source_message_iterator_next_method). - */ -#define BT_PLUGIN_SOURCE_COMPONENT_CLASS(_name, _msg_iter_next_method) \ - BT_PLUGIN_SOURCE_COMPONENT_CLASS_WITH_ID(auto, _name, #_name, _msg_iter_next_method) - -/* - * Defines a filter component class attached to the automatic plugin - * descriptor. Its ID is the same as its name, hence its name must be a - * C identifier in this version. - * - * _name: Component class name (C identifier). - * _msg_iter_next_method: Component class's iterator next method - * (bt_component_class_filter_message_iterator_next_method). - */ -#define BT_PLUGIN_FILTER_COMPONENT_CLASS(_name, _msg_iter_next_method) \ - BT_PLUGIN_FILTER_COMPONENT_CLASS_WITH_ID(auto, _name, #_name, _msg_iter_next_method) - -/* - * Defines a sink component class attached to the automatic plugin - * descriptor. Its ID is the same as its name, hence its name must be a - * C identifier in this version. - * - * _name: Component class name (C identifier). - * _consume_method: Component class's consume method - * (bt_component_class_sink_consume_method). - */ -#define BT_PLUGIN_SINK_COMPONENT_CLASS(_name, _consume_method) \ - BT_PLUGIN_SINK_COMPONENT_CLASS_WITH_ID(auto, _name, #_name, _consume_method) - -/* - * Defines a description attribute attached to a source component class - * descriptor which is attached to the automatic plugin descriptor. - * - * _name: Component class name (C identifier). - * _x: Description (C string). - */ -#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_DESCRIPTION(_name, _x) \ - BT_PLUGIN_SOURCE_COMPONENT_CLASS_DESCRIPTION_WITH_ID(auto, _name, _x) - -/* - * Defines a description attribute attached to a filter component class - * descriptor which is attached to the automatic plugin descriptor. - * - * _name: Component class name (C identifier). - * _x: Description (C string). - */ -#define BT_PLUGIN_FILTER_COMPONENT_CLASS_DESCRIPTION(_name, _x) \ - BT_PLUGIN_FILTER_COMPONENT_CLASS_DESCRIPTION_WITH_ID(auto, _name, _x) - -/* - * Defines a description attribute attached to a sink component class - * descriptor which is attached to the automatic plugin descriptor. - * - * _name: Component class name (C identifier). - * _x: Description (C string). - */ -#define BT_PLUGIN_SINK_COMPONENT_CLASS_DESCRIPTION(_name, _x) \ - BT_PLUGIN_SINK_COMPONENT_CLASS_DESCRIPTION_WITH_ID(auto, _name, _x) - -/* - * Defines a help attribute attached to a source component class - * descriptor which is attached to the automatic plugin descriptor. - * - * _name: Component class name (C identifier). - * _x: Help (C string). - */ -#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_HELP(_name, _x) \ - BT_PLUGIN_SOURCE_COMPONENT_CLASS_HELP_WITH_ID(auto, _name, _x) - -/* - * Defines a help attribute attached to a filter component class - * descriptor which is attached to the automatic plugin descriptor. - * - * _name: Component class name (C identifier). - * _x: Help (C string). - */ -#define BT_PLUGIN_FILTER_COMPONENT_CLASS_HELP(_name, _x) \ - BT_PLUGIN_FILTER_COMPONENT_CLASS_HELP_WITH_ID(auto, _name, _x) - -/* - * Defines a help attribute attached to a sink component class - * descriptor which is attached to the automatic plugin descriptor. - * - * _name: Component class name (C identifier). - * _x: Help (C string). - */ -#define BT_PLUGIN_SINK_COMPONENT_CLASS_HELP(_name, _x) \ - BT_PLUGIN_SINK_COMPONENT_CLASS_HELP_WITH_ID(auto, _name, _x) - -/* - * Defines an initialization method attribute attached to a source - * component class descriptor which is attached to the automatic plugin - * descriptor. - * - * _name: Component class name (C identifier). - * _x: Initialization method (bt_component_class_source_initialize_method). - */ -#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_INITIALIZE_METHOD(_name, _x) \ - BT_PLUGIN_SOURCE_COMPONENT_CLASS_INITIALIZE_METHOD_WITH_ID(auto, _name, _x) - -/* - * Defines an initialization method attribute attached to a filter - * component class descriptor which is attached to the automatic plugin - * descriptor. - * - * _name: Component class name (C identifier). - * _x: Initialization method (bt_component_class_filter_initialize_method). - */ -#define BT_PLUGIN_FILTER_COMPONENT_CLASS_INITIALIZE_METHOD(_name, _x) \ - BT_PLUGIN_FILTER_COMPONENT_CLASS_INITIALIZE_METHOD_WITH_ID(auto, _name, _x) - -/* - * Defines an initialization method attribute attached to a sink - * component class descriptor which is attached to the automatic plugin - * descriptor. - * - * _name: Component class name (C identifier). - * _x: Initialization method (bt_component_class_sink_initialize_method). - */ -#define BT_PLUGIN_SINK_COMPONENT_CLASS_INITIALIZE_METHOD(_name, _x) \ - BT_PLUGIN_SINK_COMPONENT_CLASS_INITIALIZE_METHOD_WITH_ID(auto, _name, _x) - -/* - * Defines a "get supported MIP versions" method attribute attached to a - * source component class descriptor which is attached to the automatic - * plugin descriptor. - * - * _name: Component class name (C identifier). - * _x: Initialization method (bt_component_class_source_get_supported_mip_versions_method). - */ -#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD(_name, _x) \ - BT_PLUGIN_SOURCE_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD_WITH_ID(auto, _name, _x) - -/* - * Defines a "get supported MIP versions" method attribute attached to a - * filter component class descriptor which is attached to the automatic - * plugin descriptor. - * - * _name: Component class name (C identifier). - * _x: Initialization method (bt_component_class_filter_get_supported_mip_versions_method). - */ -#define BT_PLUGIN_FILTER_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD(_name, _x) \ - BT_PLUGIN_FILTER_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD_WITH_ID(auto, _name, _x) - -/* - * Defines a "get supported MIP versions" method attribute attached to a - * sink component class descriptor which is attached to the automatic - * plugin descriptor. - * - * _name: Component class name (C identifier). - * _x: Initialization method (bt_component_class_sink_get_supported_mip_versions_method). - */ -#define BT_PLUGIN_SINK_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD(_name, _x) \ - BT_PLUGIN_SINK_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD_WITH_ID(auto, _name, _x) - -/* - * Defines a finalization method attribute attached to a source component - * class descriptor which is attached to the automatic plugin - * descriptor. - * - * _name: Component class name (C identifier). - * _x: Initialization method (bt_component_class_source_finalize_method). - */ -#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_FINALIZE_METHOD(_name, _x) \ - BT_PLUGIN_SOURCE_COMPONENT_CLASS_FINALIZE_METHOD_WITH_ID(auto, _name, _x) - -/* - * Defines a finalization method attribute attached to a filter component - * class descriptor which is attached to the automatic plugin - * descriptor. - * - * _name: Component class name (C identifier). - * _x: Initialization method (bt_component_class_filter_finalize_method). - */ -#define BT_PLUGIN_FILTER_COMPONENT_CLASS_FINALIZE_METHOD(_name, _x) \ - BT_PLUGIN_FILTER_COMPONENT_CLASS_FINALIZE_METHOD_WITH_ID(auto, _name, _x) - -/* - * Defines a finalization method attribute attached to a sink component class - * descriptor which is attached to the automatic plugin descriptor. - * - * _name: Component class name (C identifier). - * _x: Initialization method (bt_component_class_sink_finalize_method). - */ -#define BT_PLUGIN_SINK_COMPONENT_CLASS_FINALIZE_METHOD(_name, _x) \ - BT_PLUGIN_SINK_COMPONENT_CLASS_FINALIZE_METHOD_WITH_ID(auto, _name, _x) - -/* - * Defines a query method attribute attached to a source component - * class descriptor which is attached to the automatic plugin - * descriptor. - * - * _name: Component class name (C identifier). - * _x: Initialization method (bt_component_class_source_query_method). - */ -#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_QUERY_METHOD(_name, _x) \ - BT_PLUGIN_SOURCE_COMPONENT_CLASS_QUERY_METHOD_WITH_ID(auto, _name, _x) - -/* - * Defines a query method attribute attached to a filter component - * class descriptor which is attached to the automatic plugin - * descriptor. - * - * _name: Component class name (C identifier). - * _x: Initialization method (bt_component_class_filter_query_method). - */ -#define BT_PLUGIN_FILTER_COMPONENT_CLASS_QUERY_METHOD(_name, _x) \ - BT_PLUGIN_FILTER_COMPONENT_CLASS_QUERY_METHOD_WITH_ID(auto, _name, _x) - -/* - * Defines a query method attribute attached to a sink component - * class descriptor which is attached to the automatic plugin - * descriptor. - * - * _name: Component class name (C identifier). - * _x: Initialization method (bt_component_class_sink_query_method). - */ -#define BT_PLUGIN_SINK_COMPONENT_CLASS_QUERY_METHOD(_name, _x) \ - BT_PLUGIN_SINK_COMPONENT_CLASS_QUERY_METHOD_WITH_ID(auto, _name, _x) - -/* - * Defines an input port connected method attribute attached to a filter - * component class descriptor which is attached to the automatic plugin - * descriptor. - * - * _name: Component class name (C identifier). - * _x: Port connected (bt_component_class_filter_input_port_connected_method). - */ -#define BT_PLUGIN_FILTER_COMPONENT_CLASS_INPUT_PORT_CONNECTED_METHOD(_name, _x) \ - BT_PLUGIN_FILTER_COMPONENT_CLASS_INPUT_PORT_CONNECTED_METHOD_WITH_ID(auto, _name, _x) - -/* - * Defines an input port connected method attribute attached to a sink - * component class descriptor which is attached to the automatic plugin - * descriptor. - * - * _name: Component class name (C identifier). - * _x: Port connected (bt_component_class_sink_input_port_connected_method). - */ -#define BT_PLUGIN_SINK_COMPONENT_CLASS_INPUT_PORT_CONNECTED_METHOD(_name, _x) \ - BT_PLUGIN_SINK_COMPONENT_CLASS_INPUT_PORT_CONNECTED_METHOD_WITH_ID(auto, _name, _x) - -/* - * Defines an output port connected method attribute attached to a source - * component class descriptor which is attached to the automatic plugin - * descriptor. - * - * _name: Component class name (C identifier). - * _x: Port connected (bt_component_class_source_output_port_connected_method). - */ -#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_OUTPUT_PORT_CONNECTED_METHOD(_name, _x) \ - BT_PLUGIN_SOURCE_COMPONENT_CLASS_OUTPUT_PORT_CONNECTED_METHOD_WITH_ID(auto, _name, _x) - -/* - * Defines an output port connected method attribute attached to a filter - * component class descriptor which is attached to the automatic plugin - * descriptor. - * - * _name: Component class name (C identifier). - * _x: Port connected (bt_component_class_filter_output_port_connected_method). - */ -#define BT_PLUGIN_FILTER_COMPONENT_CLASS_OUTPUT_PORT_CONNECTED_METHOD(_name, _x) \ - BT_PLUGIN_FILTER_COMPONENT_CLASS_OUTPUT_PORT_CONNECTED_METHOD_WITH_ID(auto, _name, _x) - -/* - * Defines a "graph is configured" method attribute attached to - * a sink component class descriptor which is attached to the automatic - * plugin descriptor. - * - * _name: Component class name (C identifier). - * _x: "Graph is configured" method - * (bt_component_class_sink_graph_is_configured_method). - */ -#define BT_PLUGIN_SINK_COMPONENT_CLASS_GRAPH_IS_CONFIGURED_METHOD(_name, _x) \ - BT_PLUGIN_SINK_COMPONENT_CLASS_GRAPH_IS_CONFIGURED_METHOD_WITH_ID(auto, _name, _x) - -/* - * Defines an iterator initialization method attribute attached to a - * source component class descriptor which is attached to the automatic - * plugin descriptor. - * - * _name: Component class name (C identifier). - * _x: Iterator initialization method - * (bt_component_class_source_message_iterator_initialize_method). - */ -#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD(_name, _x) \ - BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_WITH_ID(auto, _name, _x) - -/* - * Defines an iterator finalize method attribute attached to a source - * component class descriptor which is attached to the automatic plugin - * descriptor. - * - * _name: Component class name (C identifier). - * _x: Iterator finalize method - * (bt_component_class_source_message_iterator_finalize_method). - */ -#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_FINALIZE_METHOD(_name, _x) \ - BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_FINALIZE_METHOD_WITH_ID(auto, _name, _x) - -/* - * Defines an iterator "seek nanoseconds from origin" and "can seek nanoseconds - * from origin" method attributes attached to a source component class - * descriptor which is attached to the automatic plugin descriptor. - * - * _name: Component class name (C identifier). - * _seek_method: Iterator "seek nanoseconds from origin" method - * (bt_component_class_source_message_iterator_seek_ns_from_origin_method). - * _can_seek_method: Iterator "can seek nanoseconds from origin" method - * (bt_component_class_source_message_iterator_can_seek_ns_from_origin_method). - */ -#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHODS(_name, _seek_method, _can_seek_method) \ - BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHODS_WITH_ID(auto, _name, _seek_method, _can_seek_method) - -/* - * Defines an iterator "seek beginning" and "can seek beginning" method - * attributes attached to a source component class descriptor which is attached - * to the automatic plugin descriptor. - * - * _name: Component class name (C identifier). - * _seek_method: Iterator "can seek beginning" method - * (bt_component_class_source_message_iterator_can_seek_beginning_method). - * _can_seek_method: Iterator "can seek beginning" method - * (bt_component_class_source_message_iterator_seek_beginning_method). - */ -#define BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHODS(_name, _seek_method, _can_seek_method) \ - BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHODS_WITH_ID(auto, _name, _seek_method, _can_seek_method) - -/* - * Defines an iterator initialization method attribute attached to a - * filter component class descriptor which is attached to the automatic - * plugin descriptor. - * - * _name: Component class name (C identifier). - * _x: Iterator initialization method - * (bt_component_class_filter_message_iterator_initialize_method). - */ -#define BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD(_name, _x) \ - BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_WITH_ID(auto, _name, _x) - -/* - * Defines an iterator finalize method attribute attached to a filter - * component class descriptor which is attached to the automatic plugin - * descriptor. - * - * _name: Component class name (C identifier). - * _x: Iterator finalize method - * (bt_component_class_filter_message_iterator_finalize_method). - */ -#define BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_FINALIZE_METHOD(_name, _x) \ - BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_FINALIZE_METHOD_WITH_ID(auto, _name, _x) - -/* - * Defines an iterator "seek nanosecconds from origin" and "can seek - * nanoseconds from origin" method attributes attached to a filter component - * class descriptor which is attached to the automatic plugin descriptor. - * - * _name: Component class name (C identifier). - * _seek_method: Iterator "seek nanoseconds from origin" method - * (bt_component_class_filter_message_iterator_seek_ns_from_origin_method). - * _can_seek_method: Iterator "can seek nanoseconds from origin" method - * (bt_component_class_filter_message_iterator_can_seek_ns_from_origin_method). - */ -#define BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHODS(_name, _seek_method, _can_seek_method) \ - BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHODS_WITH_ID(auto, _name, _seek_method, _can_seek_method) - -/* - * Defines an iterator "seek beginning" and "can seek beginning" method - * attributes attached to a filter component class descriptor which is attached - * to the automatic plugin descriptor. - * - * _name: Component class name (C identifier). - * _seek_method: Iterator "seek beginning" method - * (bt_component_class_filter_message_iterator_seek_beginning_method). - * _can_seek_method: Iterator "can seek beginning" method - * (bt_component_class_filter_message_iterator_can_seek_beginning_method). - */ -#define BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHODS(_name, _seek_method, _can_seek_method) \ - BT_PLUGIN_FILTER_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHODS_WITH_ID(auto, _name, _seek_method, _can_seek_method) - -#define BT_PLUGIN_MODULE() \ - static struct __bt_plugin_descriptor const * const __bt_plugin_descriptor_dummy __BT_PLUGIN_DESCRIPTOR_ATTRS = NULL; \ - _BT_HIDDEN extern struct __bt_plugin_descriptor const *__BT_PLUGIN_DESCRIPTOR_BEGIN_SYMBOL __BT_PLUGIN_DESCRIPTOR_BEGIN_EXTRA; \ - _BT_HIDDEN extern struct __bt_plugin_descriptor const *__BT_PLUGIN_DESCRIPTOR_END_SYMBOL __BT_PLUGIN_DESCRIPTOR_END_EXTRA; \ - \ - static struct __bt_plugin_descriptor_attribute const * const __bt_plugin_descriptor_attribute_dummy __BT_PLUGIN_DESCRIPTOR_ATTRIBUTES_ATTRS = NULL; \ - _BT_HIDDEN extern struct __bt_plugin_descriptor_attribute const *__BT_PLUGIN_DESCRIPTOR_ATTRIBUTES_BEGIN_SYMBOL __BT_PLUGIN_DESCRIPTOR_ATTRIBUTES_BEGIN_EXTRA; \ - _BT_HIDDEN extern struct __bt_plugin_descriptor_attribute const *__BT_PLUGIN_DESCRIPTOR_ATTRIBUTES_END_SYMBOL __BT_PLUGIN_DESCRIPTOR_ATTRIBUTES_END_EXTRA; \ - \ - static struct __bt_plugin_component_class_descriptor const * const __bt_plugin_component_class_descriptor_dummy __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRS = NULL; \ - _BT_HIDDEN extern struct __bt_plugin_component_class_descriptor const *__BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_BEGIN_SYMBOL __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_BEGIN_EXTRA; \ - _BT_HIDDEN extern struct __bt_plugin_component_class_descriptor const *__BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_END_SYMBOL __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_END_EXTRA; \ - \ - static struct __bt_plugin_component_class_descriptor_attribute const * const __bt_plugin_component_class_descriptor_attribute_dummy __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTES_ATTRS = NULL; \ - _BT_HIDDEN extern struct __bt_plugin_component_class_descriptor_attribute const *__BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTES_BEGIN_SYMBOL __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTES_BEGIN_EXTRA; \ - _BT_HIDDEN extern struct __bt_plugin_component_class_descriptor_attribute const *__BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTES_END_SYMBOL __BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTES_END_EXTRA; \ - \ - struct __bt_plugin_descriptor const * const *__bt_get_begin_section_plugin_descriptors(void) \ - { \ - return &__BT_PLUGIN_DESCRIPTOR_BEGIN_SYMBOL; \ - } \ - struct __bt_plugin_descriptor const * const *__bt_get_end_section_plugin_descriptors(void) \ - { \ - return &__BT_PLUGIN_DESCRIPTOR_END_SYMBOL; \ - } \ - struct __bt_plugin_descriptor_attribute const * const *__bt_get_begin_section_plugin_descriptor_attributes(void) \ - { \ - return &__BT_PLUGIN_DESCRIPTOR_ATTRIBUTES_BEGIN_SYMBOL; \ - } \ - struct __bt_plugin_descriptor_attribute const * const *__bt_get_end_section_plugin_descriptor_attributes(void) \ - { \ - return &__BT_PLUGIN_DESCRIPTOR_ATTRIBUTES_END_SYMBOL; \ - } \ - struct __bt_plugin_component_class_descriptor const * const *__bt_get_begin_section_component_class_descriptors(void) \ - { \ - return &__BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_BEGIN_SYMBOL; \ - } \ - struct __bt_plugin_component_class_descriptor const * const *__bt_get_end_section_component_class_descriptors(void) \ - { \ - return &__BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_END_SYMBOL; \ - } \ - struct __bt_plugin_component_class_descriptor_attribute const * const *__bt_get_begin_section_component_class_descriptor_attributes(void) \ - { \ - return &__BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTES_BEGIN_SYMBOL; \ - } \ - struct __bt_plugin_component_class_descriptor_attribute const * const *__bt_get_end_section_component_class_descriptor_attributes(void) \ - { \ - return &__BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTES_END_SYMBOL; \ - } - #ifdef __cplusplus } #endif diff --git a/include/babeltrace2/plugin/plugin-loading.h b/include/babeltrace2/plugin/plugin-loading.h new file mode 100644 index 00000000..c95b53c5 --- /dev/null +++ b/include/babeltrace2/plugin/plugin-loading.h @@ -0,0 +1,1432 @@ +#ifndef BABELTRACE2_PLUGIN_PLUGIN_LOADING_H +#define BABELTRACE2_PLUGIN_PLUGIN_LOADING_H + +/* + * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef __BT_IN_BABELTRACE_H +# error "Please include instead." +#endif + +#include +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*! +@defgroup api-plugin Plugin loading + +@brief + Plugin loading functions. + +A plugin is a package of \bt_p_comp_cls: + +@image html plugin.png "A plugin is a package of component classes." + +@attention + The plugin loading API offers functions to find and load + existing plugins and use the packaged \bt_p_comp_cls. To \em write a + plugin, see \ref api-plugin-dev. + +There are three types of plugins: + +
    +
    Shared object plugin
    +
    + .so file on Unix systems; + .dll file on Windows systems. +
    + +
    Python 3 plugin
    +
    + .py file which starts with the + bt_plugin_ prefix. +
    + +
    Static plugin
    +
    + A plugin built directly into libbabeltrace2 or into the + user application. +
    +
    + +libbabeltrace2 loads shared object and Python plugins. Those plugins +need libbabeltrace2 in turn to create and use \bt_name objects: + +@image html linking.png "libbabeltrace2 loads plugins which need libbabeltrace2." + +A plugin is a \ref api-fund-shared-object "shared object": get a new +reference with bt_plugin_get_ref() and put an existing reference with +bt_plugin_put_ref(). + +Get the number of \bt_comp_cls in a plugin with +bt_plugin_get_source_component_class_count(), +bt_plugin_get_filter_component_class_count(), and +bt_plugin_get_sink_component_class_count(). + +Borrow a \bt_comp_cls by index from a plugin with +bt_plugin_borrow_source_component_class_by_index_const(), +bt_plugin_borrow_filter_component_class_by_index_const(), and +bt_plugin_borrow_sink_component_class_by_index_const(). + +Borrow a \bt_comp_cls by name from a plugin with +bt_plugin_borrow_source_component_class_by_name_const(), +bt_plugin_borrow_filter_component_class_by_name_const(), and +bt_plugin_borrow_sink_component_class_by_name_const(). + +The bt_plugin_find_all(), bt_plugin_find_all_from_file(), +bt_plugin_find_all_from_dir(), and bt_plugin_find_all_from_static() +functions return a plugin set, that is, a shared object +containing one or more plugins. + +

    Find and load plugins

    + +\anchor api-plugin-def-dirs The bt_plugin_find() and +bt_plugin_find_all() functions find and load plugins from the default +plugin search directories and from the static plugins. + +The plugin search order is: + +-# The colon-separated (or semicolon-separated on Windows) list of + directories in the \c BABELTRACE_PLUGIN_PATH environment variable, + if it's set. + + The function searches each directory in this list, without recursing. + +-# $HOME/.local/lib/babeltrace2/plugins, + without recursing. + +-# The system \bt_name plugin directory, typically + /usr/lib/babeltrace2/plugins or + /usr/local/lib/babeltrace2/plugins on Linux, + without recursing. + +-# The static plugins. + +Both bt_plugin_find() and bt_plugin_find_all() functions have dedicated +boolean parameters to include or exclude each of the four locations +above. + +

    Find and load a plugin by name

    + +Find and load a plugin by name with bt_plugin_find(). + +bt_plugin_find() tries to find a plugin with a specific name within +the \ref api-plugin-def-dirs "default plugin search directories" +and static plugins. + +

    Find and load all the plugins from the default directories

    + +Load all the plugins found in the +\ref api-plugin-def-dirs "default plugin search directories" +and static plugins with bt_plugin_find_all(). + +

    Find and load plugins from a specific file or directory

    + +Find and load plugins from a specific file (.so, +.dll, or .py) with +bt_plugin_find_all_from_file(). + +A single shared object file can contain multiple plugins, although it's +not common practice to do so. + +Find and load plugins from a specific directory with +bt_plugin_find_all_from_dir(). This function can search for plugins +within the given directory recursively or not. + +

    Find and load static plugins

    + +Find and load static plugins with bt_plugin_find_all_from_static(). + +A static plugin is built directly into the application or library +instead of being a separate shared object file. + +

    Plugin properties

    + +A plugin has the following properties: + +
    +
    + \anchor api-plugin-prop-name + Name +
    +
    + Name of the plugin. + + The plugin's name is not related to its file name. For example, + a plugin found in the file \c patente.so can be named + Dan. + + Use bt_plugin_get_name(). +
    + +
    + \anchor api-plugin-prop-descr + \bt_dt_opt Description +
    +
    + Description of the plugin. + + Use bt_plugin_get_description(). +
    + +
    + \anchor api-plugin-prop-author + \bt_dt_opt Author name(s) +
    +
    + Name(s) of the plugin's author(s). + + Use bt_plugin_get_author(). +
    + +
    + \anchor api-plugin-prop-license + \bt_dt_opt License +
    +
    + License or license name of the plugin. + + Use bt_plugin_get_license(). +
    + +
    + \anchor api-plugin-prop-path + \bt_dt_opt Path +
    +
    + Path of the file which contains the plugin. + + A static plugin has no path property. + + Get bt_plugin_get_path(). +
    + +
    + \anchor api-plugin-prop-version + \bt_dt_opt Version +
    +
    + Version of the plugin (major, minor, patch, and extra information). + + The plugin's version is completely user-defined: the library does + not use this property in any way to verify the plugin's + compatibility. + + Use bt_plugin_get_version(). +
    +
    +*/ + +/*! @{ */ + +/*! +@name Type +@{ + +@typedef struct bt_plugin bt_plugin; + +@brief + Plugin. + + +@typedef struct bt_plugin_set bt_plugin_set; + +@brief + Set of plugins. + +@} +*/ + +/*! +@name Find and load plugins +@{ +*/ + +/*! +@brief + Status codes for bt_plugin_find(). +*/ +typedef enum bt_plugin_find_status { + /*! + @brief + Success. + */ + BT_PLUGIN_FIND_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Plugin not found. + */ + BT_PLUGIN_FIND_STATUS_NOT_FOUND = __BT_FUNC_STATUS_NOT_FOUND, + + /*! + @brief + Out of memory. + */ + BT_PLUGIN_FIND_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + Error. + */ + BT_PLUGIN_FIND_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, +} bt_plugin_find_status; + +/*! +@brief + Finds and loads a single plugin which has the name + \bt_p{plugin_name} from the default plugin search directories and + static plugins, setting \bt_p{*plugin} to the result. + +This function returns the first plugin which has the name +\bt_p{plugin_name} within, in order: + +-# If the \bt_p{find_in_std_env_var} parameter is + #BT_TRUE, + the colon-separated (or semicolon-separated on Windows) list of + directories in the \c BABELTRACE_PLUGIN_PATH environment variable, + if it's set. + + The function searches each directory in this list, without recursing. + +-# If the \bt_p{find_in_user_dir} parameter is + #BT_TRUE, $HOME/.local/lib/babeltrace2/plugins, + without recursing. + +-# If the \bt_p{find_in_sys_dir} is #BT_TRUE, the + system \bt_name plugin directory, typically + /usr/lib/babeltrace2/plugins or + /usr/local/lib/babeltrace2/plugins on Linux, without + recursing. + +-# If the \bt_p{find_in_static} is #BT_TRUE, + the static plugins. + +@note + A plugin's name is not related to the name of its file (shared + object or Python file). For example, a plugin found in the file + \c patente.so can be named Dan. + +If this function finds a file which looks like a plugin (shared object +file or Python file with the \c bt_plugin_ prefix), but it fails to load +it for any reason, the function: + +
    +
    If \bt_p{fail_on_load_error} is #BT_TRUE
    +
    Returns #BT_PLUGIN_FIND_STATUS_ERROR.
    + +
    If \bt_p{fail_on_load_error} is #BT_FALSE
    +
    Ignores the loading error and continues searching.
    +
    + +If this function doesn't find any plugin, it returns +#BT_PLUGIN_FIND_STATUS_NOT_FOUND and does \em not set \bt_p{*plugin}. + +@param[in] plugin_name + Name of the plugin to find and load. +@param[in] find_in_std_env_var + #BT_TRUE to try to find the plugin named \bt_p{plugin_name} in the + colon-separated (or semicolon-separated on Windows) list of + directories in the \c BABELTRACE_PLUGIN_PATH environment variable. +@param[in] find_in_user_dir + #BT_TRUE to try to find the plugin named \bt_p{plugin_name} in + the $HOME/.local/lib/babeltrace2/plugins directory, + without recursing. +@param[in] find_in_sys_dir + #BT_TRUE to try to find the plugin named \bt_p{plugin_name} in + the system \bt_name plugin directory. +@param[in] find_in_static + #BT_TRUE to try to find the plugin named \bt_p{plugin_name} in the + static plugins. +@param[in] fail_on_load_error + #BT_TRUE to make this function return #BT_PLUGIN_FIND_STATUS_ERROR + on any plugin loading error instead of ignoring it. +@param[out] plugin + On success, \bt_p{*plugin} is a new plugin + reference of named \bt_p{plugin_name}. + +@retval #BT_PLUGIN_FIND_STATUS_OK + Success. +@retval #BT_PLUGIN_FIND_STATUS_NOT_FOUND + Plugin not found. +@retval #BT_PLUGIN_FIND_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_PLUGIN_FIND_STATUS_ERROR + Error. + +@bt_pre_not_null{plugin_name} +@pre + At least one of the \bt_p{find_in_std_env_var}, + \bt_p{find_in_user_dir}, \bt_p{find_in_sys_dir}, and + \bt_p{find_in_static} parameters is #BT_TRUE. +@bt_pre_not_null{plugin} + +@sa bt_plugin_find_all() — + Finds and loads all plugins from the default plugin search + directories and static plugins. +*/ +extern bt_plugin_find_status bt_plugin_find(const char *plugin_name, + bt_bool find_in_std_env_var, bt_bool find_in_user_dir, + bt_bool find_in_sys_dir, bt_bool find_in_static, + bt_bool fail_on_load_error, const bt_plugin **plugin); + +/*! +@brief + Status codes for bt_plugin_find_all(). +*/ +typedef enum bt_plugin_find_all_status { + /*! + @brief + Success. + */ + BT_PLUGIN_FIND_ALL_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + No plugins found. + */ + BT_PLUGIN_FIND_ALL_STATUS_NOT_FOUND = __BT_FUNC_STATUS_NOT_FOUND, + + /*! + @brief + Out of memory. + */ + BT_PLUGIN_FIND_ALL_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + Error. + */ + BT_PLUGIN_FIND_ALL_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, +} bt_plugin_find_all_status; + +/*! +@brief + Finds and loads all the plugins from the default + plugin search directories and static plugins, setting + \bt_p{*plugins} to the result. + +This function returns all the plugins within, in order: + +-# If the \bt_p{find_in_std_env_var} parameter is + #BT_TRUE, + the colon-separated (or semicolon-separated on Windows) list of + directories in the \c BABELTRACE_PLUGIN_PATH environment variable, + if it's set. + + The function searches each directory in this list, without recursing. + +-# If the \bt_p{find_in_user_dir} parameter is + #BT_TRUE, $HOME/.local/lib/babeltrace2/plugins, + without recursing. + +-# If the \bt_p{find_in_sys_dir} is #BT_TRUE, the + system \bt_name plugin directory, typically + /usr/lib/babeltrace2/plugins or + /usr/local/lib/babeltrace2/plugins on Linux, without + recursing. + +-# If the \bt_p{find_in_static} is #BT_TRUE, + the static plugins. + +During the search process, if a found plugin shares the name of an +already loaded plugin, this function ignores it and continues. + +If this function finds a file which looks like a plugin (shared object +file or Python file with the \c bt_plugin_ prefix), but it fails to load +it for any reason, the function: + +
    +
    If \bt_p{fail_on_load_error} is #BT_TRUE
    +
    Returns #BT_PLUGIN_FIND_ALL_STATUS_ERROR.
    + +
    If \bt_p{fail_on_load_error} is #BT_FALSE
    +
    Ignores the loading error and continues searching.
    +
    + +If this function doesn't find any plugin, it returns +#BT_PLUGIN_FIND_ALL_STATUS_NOT_FOUND and does \em not set +\bt_p{*plugins}. + +@param[in] find_in_std_env_var + #BT_TRUE to try to find all the plugins in the + colon-separated (or semicolon-separated on Windows) list of + directories in the \c BABELTRACE_PLUGIN_PATH environment variable. +@param[in] find_in_user_dir + #BT_TRUE to try to find all the plugins in + the $HOME/.local/lib/babeltrace2/plugins directory, + without recursing. +@param[in] find_in_sys_dir + #BT_TRUE to try to find all the plugins in the system \bt_name + plugin directory. +@param[in] find_in_static + #BT_TRUE to try to find all the plugins in the static plugins. +@param[in] fail_on_load_error + #BT_TRUE to make this function return + #BT_PLUGIN_FIND_ALL_STATUS_ERROR on any plugin loading error instead + of ignoring it. +@param[out] plugins + On success, \bt_p{*plugins} is a new plugin set + reference which contains all the plugins found from the default + plugin search directories and static plugins. + +@retval #BT_PLUGIN_FIND_ALL_STATUS_OK + Success. +@retval #BT_PLUGIN_FIND_ALL_STATUS_NOT_FOUND + No plugins found. +@retval #BT_PLUGIN_FIND_ALL_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_PLUGIN_FIND_ALL_STATUS_ERROR + Error. + +@pre + At least one of the \bt_p{find_in_std_env_var}, + \bt_p{find_in_user_dir}, \bt_p{find_in_sys_dir}, and + \bt_p{find_in_static} parameters is #BT_TRUE. +@bt_pre_not_null{plugins} + +@sa bt_plugin_find() — + Finds and loads a single plugin by name from the default plugin search + directories and static plugins. +*/ +bt_plugin_find_all_status bt_plugin_find_all(bt_bool find_in_std_env_var, + bt_bool find_in_user_dir, bt_bool find_in_sys_dir, + bt_bool find_in_static, bt_bool fail_on_load_error, + const bt_plugin_set **plugins); + +/*! +@brief + Status codes for bt_plugin_find_all_from_file(). +*/ +typedef enum bt_plugin_find_all_from_file_status { + /*! + @brief + Success. + */ + BT_PLUGIN_FIND_ALL_FROM_FILE_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + No plugins found. + */ + BT_PLUGIN_FIND_ALL_FROM_FILE_STATUS_NOT_FOUND = __BT_FUNC_STATUS_NOT_FOUND, + + /*! + @brief + Out of memory. + */ + BT_PLUGIN_FIND_ALL_FROM_FILE_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + Error. + */ + BT_PLUGIN_FIND_ALL_FROM_FILE_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, +} bt_plugin_find_all_from_file_status; + +/*! +@brief + Finds and loads all the plugins from the file with path \bt_p{path}, + setting \bt_p{*plugins} to the result. + +@note + A plugin's name is not related to the name of its file (shared + object or Python file). For example, a plugin found in the file + \c patente.so can be named Dan. + +If any plugin loading error occurs during this function's execution, the +function: + +
    +
    If \bt_p{fail_on_load_error} is #BT_TRUE
    +
    Returns #BT_PLUGIN_FIND_ALL_FROM_FILE_STATUS_ERROR.
    + +
    If \bt_p{fail_on_load_error} is #BT_FALSE
    +
    Ignores the loading error and continues.
    +
    + +If this function doesn't find any plugin, it returns +#BT_PLUGIN_FIND_ALL_FROM_FILE_STATUS_NOT_FOUND and does \em not set +\bt_p{*plugins}. + +@param[in] path + Path of the file in which to find and load all the plugins. +@param[in] fail_on_load_error + #BT_TRUE to make this function return + #BT_PLUGIN_FIND_ALL_FROM_FILE_STATUS_ERROR on any plugin loading + error instead of ignoring it. +@param[out] plugins + On success, \bt_p{*plugins} is a new plugin set + reference which contains all the plugins found in the file with path + \bt_p{path}. + +@retval #BT_PLUGIN_FIND_ALL_FROM_FILE_STATUS_OK + Success. +@retval #BT_PLUGIN_FIND_ALL_FROM_FILE_STATUS_NOT_FOUND + No plugins found. +@retval #BT_PLUGIN_FIND_ALL_FROM_FILE_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_PLUGIN_FIND_ALL_FROM_FILE_STATUS_ERROR + Error. + +@bt_pre_not_null{path} +@pre + \bt_p{path} is the path of a regular file. +@bt_pre_not_null{plugins} + +@sa bt_plugin_find_all_from_dir() — + Finds and loads all plugins from a given directory. +*/ +extern bt_plugin_find_all_from_file_status bt_plugin_find_all_from_file( + const char *path, bt_bool fail_on_load_error, + const bt_plugin_set **plugins); + +/*! +@brief + Status codes for bt_plugin_find_all_from_dir(). +*/ +typedef enum bt_plugin_find_all_from_dir_status { + /*! + @brief + Success. + */ + BT_PLUGIN_FIND_ALL_FROM_DIR_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + No plugins found. + */ + BT_PLUGIN_FIND_ALL_FROM_DIR_STATUS_NOT_FOUND = __BT_FUNC_STATUS_NOT_FOUND, + + /*! + @brief + Out of memory. + */ + BT_PLUGIN_FIND_ALL_FROM_DIR_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + Error. + */ + BT_PLUGIN_FIND_ALL_FROM_DIR_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, +} bt_plugin_find_all_from_dir_status; + +/*! +@brief + Finds and loads all the plugins from the directory with path + \bt_p{path}, setting \bt_p{*plugins} to the result. + +If \bt_p{recurse} is #BT_TRUE, this function recurses into the +subdirectories of \bt_p{path} to find plugins. + +During the search process, if a found plugin shares the name of an +already loaded plugin, this function ignores it and continues. + +@attention + As of \bt_name_version_min_maj, the file and directory traversal + order is undefined. + +If any plugin loading error occurs during this function's execution, the +function: + +
    +
    If \bt_p{fail_on_load_error} is #BT_TRUE
    +
    Returns #BT_PLUGIN_FIND_ALL_FROM_DIR_STATUS_ERROR.
    + +
    If \bt_p{fail_on_load_error} is #BT_FALSE
    +
    Ignores the loading error and continues.
    +
    + +If this function doesn't find any plugin, it returns +#BT_PLUGIN_FIND_ALL_FROM_DIR_STATUS_NOT_FOUND and does \em not set +\bt_p{*plugins}. + +@param[in] path + Path of the directory in which to find and load all the plugins. +@param[in] recurse + #BT_TRUE to make this function recurse into the subdirectories + of \bt_p{path}. +@param[in] fail_on_load_error + #BT_TRUE to make this function return + #BT_PLUGIN_FIND_ALL_FROM_DIR_STATUS_ERROR on any plugin loading + error instead of ignoring it. +@param[out] plugins + On success, \bt_p{*plugins} is a new plugin set + reference which contains all the plugins found in the directory with + path \bt_p{path}. + +@retval #BT_PLUGIN_FIND_ALL_FROM_DIR_STATUS_OK + Success. +@retval #BT_PLUGIN_FIND_ALL_FROM_DIR_STATUS_NOT_FOUND + No plugins found. +@retval #BT_PLUGIN_FIND_ALL_FROM_DIR_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_PLUGIN_FIND_ALL_FROM_DIR_STATUS_ERROR + Error. + +@bt_pre_not_null{path} +@pre + \bt_p{path} is the path of a directory. +@bt_pre_not_null{plugins} + +@sa bt_plugin_find_all_from_file() — + Finds and loads all plugins from a given file. +*/ +extern bt_plugin_find_all_from_dir_status bt_plugin_find_all_from_dir( + const char *path, bt_bool recurse, bt_bool fail_on_load_error, + const bt_plugin_set **plugins); + +/*! +@brief + Status codes for bt_plugin_find_all_from_static(). +*/ +typedef enum bt_plugin_find_all_from_static_status { + /*! + @brief + Success. + */ + BT_PLUGIN_FIND_ALL_FROM_STATIC_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + No static plugins found. + */ + BT_PLUGIN_FIND_ALL_FROM_STATIC_STATUS_NOT_FOUND = __BT_FUNC_STATUS_NOT_FOUND, + + /*! + @brief + Out of memory. + */ + BT_PLUGIN_FIND_ALL_FROM_STATIC_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + Error. + */ + BT_PLUGIN_FIND_ALL_FROM_STATIC_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, +} bt_plugin_find_all_from_static_status; + +/*! +@brief + Finds and loads all the static plugins, + setting \bt_p{*plugins} to the result. + +A static plugin is built directly into the application or library +instead of being a separate shared object file. + +If any plugin loading error occurs during this function's execution, the +function: + +
    +
    If \bt_p{fail_on_load_error} is #BT_TRUE
    +
    Returns #BT_PLUGIN_FIND_ALL_FROM_STATIC_STATUS_ERROR.
    + +
    If \bt_p{fail_on_load_error} is #BT_FALSE
    +
    Ignores the loading error and continues.
    +
    + +If this function doesn't find any plugin, it returns +#BT_PLUGIN_FIND_ALL_FROM_STATIC_STATUS_NOT_FOUND and does \em not set +\bt_p{*plugins}. + +@param[in] fail_on_load_error + #BT_TRUE to make this function return + #BT_PLUGIN_FIND_ALL_FROM_STATIC_STATUS_ERROR on any plugin loading + error instead of ignoring it. +@param[out] plugins + On success, \bt_p{*plugins} is a new plugin set + reference which contains all the static plugins. + +@retval #BT_PLUGIN_FIND_ALL_FROM_STATIC_STATUS_OK + Success. +@retval #BT_PLUGIN_FIND_ALL_FROM_STATIC_STATUS_NOT_FOUND + No static plugins found. +@retval #BT_PLUGIN_FIND_ALL_FROM_STATIC_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_PLUGIN_FIND_ALL_FROM_STATIC_STATUS_ERROR + Error. + +@bt_pre_not_null{path} +@bt_pre_not_null{plugins} +*/ +extern bt_plugin_find_all_from_static_status bt_plugin_find_all_from_static( + bt_bool fail_on_load_error, const bt_plugin_set **plugins); + +/*! @} */ + +/*! +@name Plugin properties +@{ +*/ + +/*! +@brief + Returns the name of the plugin \bt_p{plugin}. + +See the \ref api-plugin-prop-name "name" property. + +@param[in] plugin + Plugin of which to get the name. + +@returns + @parblock + Name of \bt_p{plugin}. + + The returned pointer remains valid as long as \bt_p{plugin} exists. + @endparblock + +@bt_pre_not_null{plugin} +*/ +extern const char *bt_plugin_get_name(const bt_plugin *plugin); + +/*! +@brief + Returns the description of the plugin \bt_p{plugin}. + +See the \ref api-plugin-prop-descr "description" property. + +@param[in] plugin + Plugin of which to get description. + +@returns + @parblock + Description of \bt_p{plugin}, or \c NULL if not available. + + The returned pointer remains valid as long as \bt_p{plugin} exists. + @endparblock + +@bt_pre_not_null{plugin} +*/ +extern const char *bt_plugin_get_description(const bt_plugin *plugin); + +/*! +@brief + Returns the name(s) of the author(s) of the plugin \bt_p{plugin}. + +See the \ref api-plugin-prop-author "author name(s)" property. + +@param[in] plugin + Plugin of which to get the author name(s). + +@returns + @parblock + Author name(s) of \bt_p{plugin}, or \c NULL if not available. + + The returned pointer remains valid as long as \bt_p{plugin} exists. + @endparblock + +@bt_pre_not_null{plugin} +*/ +extern const char *bt_plugin_get_author(const bt_plugin *plugin); + +/*! +@brief + Returns the license text or the license name of the plugin + \bt_p{plugin}. + +See the \ref api-plugin-prop-license "license" property. + +@param[in] plugin + Plugin of which to get the license. + +@returns + @parblock + License of \bt_p{plugin}, or \c NULL if not available. + + The returned pointer remains valid as long as \bt_p{plugin} exists. + @endparblock + +@bt_pre_not_null{plugin} +*/ +extern const char *bt_plugin_get_license(const bt_plugin *plugin); + +/*! +@brief + Returns the path of the file which contains the plugin + \bt_p{plugin}. + +See the \ref api-plugin-prop-path "path" property. + +This function returns \c NULL if \bt_p{plugin} is a static plugin +because a static plugin has no path property. + +@param[in] plugin + Plugin of which to get the containing file's path. + +@returns + @parblock + Path of the file which contains \bt_p{plugin}, or \c NULL if + not available. + + The returned pointer remains valid as long as \bt_p{plugin} exists. + @endparblock + +@bt_pre_not_null{plugin} +*/ +extern const char *bt_plugin_get_path(const bt_plugin *plugin); + +/*! +@brief + Returns the version of the plugin \bt_p{plugin}. + +See the \ref api-plugin-prop-version "version" property. + +@param[in] plugin + Plugin of which to get the version. +@param[out] major + If not \c NULL and this function returns + #BT_PROPERTY_AVAILABILITY_AVAILABLE, \bt_p{*major} is the + major version of \bt_p{plugin}. +@param[out] minor + If not \c NULL and this function returns + #BT_PROPERTY_AVAILABILITY_AVAILABLE, \bt_p{*minor} is the + minor version of \bt_p{plugin}. +@param[out] patch + If not \c NULL and this function returns + #BT_PROPERTY_AVAILABILITY_AVAILABLE, \bt_p{*patch} is the + patch version of \bt_p{plugin}. +@param[out] extra + @parblock + If not \c NULL and this function returns + #BT_PROPERTY_AVAILABILITY_AVAILABLE, \bt_p{*extra} is the + version's extra information of \bt_p{plugin}. + + \bt_p{*extra} can be \c NULL if the plugin's version has no extra + information. + + \bt_p{*extra} remains valid as long as \bt_p{plugin} exists. + @endparblock + +@retval #BT_PROPERTY_AVAILABILITY_AVAILABLE + The version of \bt_p{plugin} is available. +@retval #BT_PROPERTY_AVAILABILITY_NOT_AVAILABLE + The version of \bt_p{plugin} is not available. + +@bt_pre_not_null{plugin} +*/ +extern bt_property_availability bt_plugin_get_version( + const bt_plugin *plugin, unsigned int *major, + unsigned int *minor, unsigned int *patch, const char **extra); + +/*! @} */ + +/*! +@name Plugin component class access +@{ +*/ + +/*! +@brief + Returns the number of source component classes contained in the + plugin \bt_p{plugin}. + +@param[in] plugin + Plugin of which to get the number of contained source + component classes. + +@returns + Number of contained source component classes in \bt_p{plugin}. + +@bt_pre_not_null{plugin} +*/ +extern uint64_t bt_plugin_get_source_component_class_count( + const bt_plugin *plugin); + +/*! +@brief + Returns the number of filter component classes contained in the + plugin \bt_p{plugin}. + +@param[in] plugin + Plugin of which to get the number of contained filter + component classes. + +@returns + Number of contained filter component classes in \bt_p{plugin}. + +@bt_pre_not_null{plugin} +*/ +extern uint64_t bt_plugin_get_filter_component_class_count( + const bt_plugin *plugin); + +/*! +@brief + Returns the number of sink component classes contained in the + plugin \bt_p{plugin}. + +@param[in] plugin + Plugin of which to get the number of contained sink + component classes. + +@returns + Number of contained sink component classes in \bt_p{plugin}. + +@bt_pre_not_null{plugin} +*/ +extern uint64_t bt_plugin_get_sink_component_class_count( + const bt_plugin *plugin); + +/*! +@brief + Borrows the source component class at index \bt_p{index} from the + plugin \bt_p{plugin}. + +@param[in] plugin + Plugin from which to borrow the source component class at index + \bt_p{index}. +@param[in] index + Index of the source component class to borrow from \bt_p{plugin}. + +@returns + @parblock + \em Borrowed reference of the source component class of + \bt_p{plugin} at index \bt_p{index}. + + The returned pointer remains valid as long as \bt_p{plugin} exists. + @endparblock + +@bt_pre_not_null{plugin} +@pre + \bt_p{index} is less than the number of source component classes in + \bt_p{plugin} (as returned by + bt_plugin_get_source_component_class_count()). + +@sa bt_plugin_borrow_source_component_class_by_name_const() — + Borrows a source component class by name from a plugin. +*/ +extern const bt_component_class_source * +bt_plugin_borrow_source_component_class_by_index_const( + const bt_plugin *plugin, uint64_t index); + +/*! +@brief + Borrows the filter component class at index \bt_p{index} from the + plugin \bt_p{plugin}. + +@param[in] plugin + Plugin from which to borrow the filter component class at index + \bt_p{index}. +@param[in] index + Index of the filter component class to borrow from \bt_p{plugin}. + +@returns + @parblock + \em Borrowed reference of the filter component class of + \bt_p{plugin} at index \bt_p{index}. + + The returned pointer remains valid as long as \bt_p{plugin} exists. + @endparblock + +@bt_pre_not_null{plugin} +@pre + \bt_p{index} is less than the number of filter component classes in + \bt_p{plugin} (as returned by + bt_plugin_get_source_component_class_count()). + +@sa bt_plugin_borrow_source_component_class_by_name_const() — + Borrows a filter component class by name from a plugin. +*/ +extern const bt_component_class_filter * +bt_plugin_borrow_filter_component_class_by_index_const( + const bt_plugin *plugin, uint64_t index); + +/*! +@brief + Borrows the sink component class at index \bt_p{index} from the + plugin \bt_p{plugin}. + +@param[in] plugin + Plugin from which to borrow the sink component class at index + \bt_p{index}. +@param[in] index + Index of the sink component class to borrow from \bt_p{plugin}. + +@returns + @parblock + \em Borrowed reference of the sink component class of + \bt_p{plugin} at index \bt_p{index}. + + The returned pointer remains valid as long as \bt_p{plugin} exists. + @endparblock + +@bt_pre_not_null{plugin} +@pre + \bt_p{index} is less than the number of sink component classes in + \bt_p{plugin} (as returned by + bt_plugin_get_source_component_class_count()). + +@sa bt_plugin_borrow_source_component_class_by_name_const() — + Borrows a sink component class by name from a plugin. +*/ +extern const bt_component_class_sink * +bt_plugin_borrow_sink_component_class_by_index_const( + const bt_plugin *plugin, uint64_t index); + +/*! +@brief + Borrows the source component class named \bt_p{name} from the + plugin \bt_p{plugin}. + +If no source component class has the name \bt_p{name} within +\bt_p{plugin}, this function returns \c NULL. + +@param[in] plugin + Plugin from which to borrow the source component class named + \bt_p{name}. +@param[in] name + Name of the source component class to borrow from \bt_p{plugin}. + +@returns + @parblock + \em Borrowed reference of the source component class of + \bt_p{plugin} named \bt_p{name}, or \c NULL if no source component + class is named \bt_p{name} within \bt_p{plugin}. + + The returned pointer remains valid as long as \bt_p{plugin} exists. + @endparblock + +@bt_pre_not_null{plugin} +@bt_pre_not_null{name} + +@sa bt_plugin_borrow_source_component_class_by_index_const() — + Borrows a source component class by index from a plugin. +*/ +extern const bt_component_class_source * +bt_plugin_borrow_source_component_class_by_name_const( + const bt_plugin *plugin, const char *name); + +/*! +@brief + Borrows the filter component class named \bt_p{name} from the + plugin \bt_p{plugin}. + +If no filter component class has the name \bt_p{name} within +\bt_p{plugin}, this function returns \c NULL. + +@param[in] plugin + Plugin from which to borrow the filter component class named + \bt_p{name}. +@param[in] name + Name of the filter component class to borrow from \bt_p{plugin}. + +@returns + @parblock + \em Borrowed reference of the filter component class of + \bt_p{plugin} named \bt_p{name}, or \c NULL if no filter component + class is named \bt_p{name} within \bt_p{plugin}. + + The returned pointer remains valid as long as \bt_p{plugin} exists. + @endparblock + +@bt_pre_not_null{plugin} +@bt_pre_not_null{name} + +@sa bt_plugin_borrow_filter_component_class_by_index_const() — + Borrows a filter component class by index from a plugin. +*/ +extern const bt_component_class_filter * +bt_plugin_borrow_filter_component_class_by_name_const( + const bt_plugin *plugin, const char *name); + +/*! +@brief + Borrows the sink component class named \bt_p{name} from the + plugin \bt_p{plugin}. + +If no sink component class has the name \bt_p{name} within +\bt_p{plugin}, this function returns \c NULL. + +@param[in] plugin + Plugin from which to borrow the sink component class named + \bt_p{name}. +@param[in] name + Name of the sink component class to borrow from \bt_p{plugin}. + +@returns + @parblock + \em Borrowed reference of the sink component class of + \bt_p{plugin} named \bt_p{name}, or \c NULL if no sink component + class is named \bt_p{name} within \bt_p{plugin}. + + The returned pointer remains valid as long as \bt_p{plugin} exists. + @endparblock + +@bt_pre_not_null{plugin} +@bt_pre_not_null{name} + +@sa bt_plugin_borrow_sink_component_class_by_index_const() — + Borrows a sink component class by index from a plugin. +*/ +extern const bt_component_class_sink * +bt_plugin_borrow_sink_component_class_by_name_const( + const bt_plugin *plugin, const char *name); + +/*! @} */ + +/*! +@name Plugin reference count +@{ +*/ + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the plugin \bt_p{plugin}. + +@param[in] plugin + @parblock + Plugin of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_plugin_put_ref() — + Decrements the reference count of a plugin. +*/ +extern void bt_plugin_get_ref(const bt_plugin *plugin); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the plugin \bt_p{plugin}. + +@param[in] plugin + @parblock + Plugin of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_plugin_get_ref() — + Increments the reference count of a plugin. +*/ +extern void bt_plugin_put_ref(const bt_plugin *plugin); + +/*! +@brief + Decrements the reference count of the plugin \bt_p{_plugin}, and + then sets \bt_p{_plugin} to \c NULL. + +@param _plugin + @parblock + Plugin of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_plugin} +*/ +#define BT_PLUGIN_PUT_REF_AND_RESET(_plugin) \ + do { \ + bt_plugin_put_ref(_plugin); \ + (_plugin) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the plugin \bt_p{_dst}, sets + \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} to \c NULL. + +This macro effectively moves a plugin reference from the expression +\bt_p{_src} to the expression \bt_p{_dst}, putting the existing +\bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_PLUGIN_MOVE_REF(_dst, _src) \ + do { \ + bt_plugin_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! +@name Plugin set plugin access +@{ +*/ + +/*! +@brief + Returns the number of plugins contained in the + plugin set \bt_p{plugin_set}. + +@param[in] plugin_set + Plugin set of which to get the number of contained plugins. + +@returns + Number of contained plugins in \bt_p{plugin_set}. + +@bt_pre_not_null{plugin} +*/ +extern uint64_t bt_plugin_set_get_plugin_count( + const bt_plugin_set *plugin_set); + +/*! +@brief + Borrows the plugin at index \bt_p{index} from the plugin set + \bt_p{plugin_set}. + +@param[in] plugin_set + Plugin set from which to borrow the plugin at index \bt_p{index}. +@param[in] index + Index of the plugin to borrow from \bt_p{plugin_set}. + +@returns + @parblock + \em Borrowed reference of the plugin of \bt_p{plugin_set} at index + \bt_p{index}. + + The returned pointer remains valid until \bt_p{plugin_set} is + modified. + @endparblock + +@bt_pre_not_null{plugin_set} +@pre + \bt_p{index} is less than the number of plugins in + \bt_p{plugin_set} (as returned by bt_plugin_set_get_plugin_count()). +*/ +extern const bt_plugin *bt_plugin_set_borrow_plugin_by_index_const( + const bt_plugin_set *plugin_set, uint64_t index); + +/*! @} */ + +/*! +@name Plugin set reference count +@{ +*/ + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the plugin set \bt_p{plugin_set}. + +@param[in] plugin_set + @parblock + Plugin set of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_plugin_set_put_ref() — + Decrements the reference count of a plugin set. +*/ +extern void bt_plugin_set_get_ref(const bt_plugin_set *plugin_set); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the plugin set \bt_p{plugin_set}. + +@param[in] plugin_set + @parblock + Plugin set of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_plugin_set_get_ref() — + Increments the reference count of a plugin set. +*/ +extern void bt_plugin_set_put_ref(const bt_plugin_set *plugin_set); + +/*! +@brief + Decrements the reference count of the plugin set \bt_p{_plugin_set}, + and then sets \bt_p{_plugin_set} to \c NULL. + +@param _plugin_set + @parblock + Plugin set of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_plugin_set} +*/ +#define BT_PLUGIN_SET_PUT_REF_AND_RESET(_plugin_set) \ + do { \ + bt_plugin_set_put_ref(_plugin_set); \ + (_plugin_set) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the plugin set \bt_p{_dst}, sets + \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} to \c NULL. + +This macro effectively moves a plugin set reference from the expression +\bt_p{_src} to the expression \bt_p{_dst}, putting the existing +\bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_PLUGIN_SET_MOVE_REF(_dst, _src) \ + do { \ + bt_plugin_set_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* BABELTRACE2_PLUGIN_PLUGIN_LOADING_H */ diff --git a/include/babeltrace2/plugin/plugin-set-const.h b/include/babeltrace2/plugin/plugin-set-const.h deleted file mode 100644 index 209e1d33..00000000 --- a/include/babeltrace2/plugin/plugin-set-const.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef BABELTRACE2_PLUGIN_PLUGIN_SET_CONST_H -#define BABELTRACE2_PLUGIN_PLUGIN_SET_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern uint64_t bt_plugin_set_get_plugin_count( - const bt_plugin_set *plugin_set); - -extern const bt_plugin *bt_plugin_set_borrow_plugin_by_index_const( - const bt_plugin_set *plugin_set, uint64_t index); - -extern void bt_plugin_set_get_ref(const bt_plugin_set *plugin_set); - -extern void bt_plugin_set_put_ref(const bt_plugin_set *plugin_set); - -#define BT_PLUGIN_SET_PUT_REF_AND_RESET(_var) \ - do { \ - bt_plugin_set_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_PLUGIN_SET_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_plugin_set_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_PLUGIN_PLUGIN_SET_CONST_H */ diff --git a/include/babeltrace2/property.h b/include/babeltrace2/property.h deleted file mode 100644 index 1ede1425..00000000 --- a/include/babeltrace2/property.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef BABELTRACE2_PROPERTY_H -#define BABELTRACE2_PROPERTY_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum bt_property_availability { - BT_PROPERTY_AVAILABILITY_NOT_AVAILABLE = 0, - BT_PROPERTY_AVAILABILITY_AVAILABLE = 1, -} bt_property_availability; - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_PROPERTY_H */ diff --git a/include/babeltrace2/trace-ir/clock-class-const.h b/include/babeltrace2/trace-ir/clock-class-const.h deleted file mode 100644 index 6316f83f..00000000 --- a/include/babeltrace2/trace-ir/clock-class-const.h +++ /dev/null @@ -1,93 +0,0 @@ -#ifndef BABELTRACE2_TRACE_IR_CLOCK_CLASS_CONST_H -#define BABELTRACE2_TRACE_IR_CLOCK_CLASS_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern const bt_value *bt_clock_class_borrow_user_attributes_const( - const bt_clock_class *clock_class); - -extern const char *bt_clock_class_get_name( - const bt_clock_class *clock_class); - -extern const char *bt_clock_class_get_description( - const bt_clock_class *clock_class); - -extern uint64_t bt_clock_class_get_frequency( - const bt_clock_class *clock_class); - -extern uint64_t bt_clock_class_get_precision( - const bt_clock_class *clock_class); - -extern void bt_clock_class_get_offset(const bt_clock_class *clock_class, - int64_t *seconds, uint64_t *cycles); - -extern bt_bool bt_clock_class_origin_is_unix_epoch( - const bt_clock_class *clock_class); - -extern bt_uuid bt_clock_class_get_uuid( - const bt_clock_class *clock_class); - -typedef enum bt_clock_class_cycles_to_ns_from_origin_status { - BT_CLOCK_CLASS_CYCLES_TO_NS_FROM_ORIGIN_STATUS_OVERFLOW_ERROR = __BT_FUNC_STATUS_OVERFLOW_ERROR, - BT_CLOCK_CLASS_CYCLES_TO_NS_FROM_ORIGIN_STATUS_OK = __BT_FUNC_STATUS_OK, -} bt_clock_class_cycles_to_ns_from_origin_status; - -extern bt_clock_class_cycles_to_ns_from_origin_status -bt_clock_class_cycles_to_ns_from_origin( - const bt_clock_class *clock_class, - uint64_t cycles, int64_t *ns_from_origin); - -extern void bt_clock_class_get_ref(const bt_clock_class *clock_class); - -extern void bt_clock_class_put_ref(const bt_clock_class *clock_class); - -#define BT_CLOCK_CLASS_PUT_REF_AND_RESET(_var) \ - do { \ - bt_clock_class_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_CLOCK_CLASS_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_clock_class_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_TRACE_IR_CLOCK_CLASS_CONST_H */ diff --git a/include/babeltrace2/trace-ir/clock-class.h b/include/babeltrace2/trace-ir/clock-class.h index 5d0c5987..4fbbf533 100644 --- a/include/babeltrace2/trace-ir/clock-class.h +++ b/include/babeltrace2/trace-ir/clock-class.h @@ -35,45 +35,954 @@ extern "C" { #endif -extern bt_clock_class *bt_clock_class_create(bt_self_component *self_comp); +/*! +@defgroup api-tir-clock-cls Clock class +@ingroup api-tir -extern bt_value *bt_clock_class_borrow_user_attributes( - bt_clock_class *clock_class); +@brief + Class of \bt_stream clocks. -extern void bt_clock_class_set_user_attributes( - bt_clock_class *clock_class, const bt_value *user_attributes); +A clock class is the class of \bt_stream +clocks. + +A clock class is a \ref api-tir "trace IR" metadata object. + +Stream clocks only exist conceptually in \bt_name because they +are stateful objects. \bt_cp_msg cannot refer to stateful objects +because they must not change while being transported from one +\bt_comp to the other. + +Instead of having a stream clock object, messages have a +default \bt_cs: this is a snapshot of the value of a stream's default +clock (a clock class instance): + +@image html clocks.png + +In the illustration above, notice that: + +- \bt_cp_stream (horizontal blue rectangles) are instances of a + \bt_stream_cls (orange). +- A stream class has a default clock class (orange bell alarm clock). +- Each stream has a default clock (yellow bell alarm clock): this is an + instance of the stream's class's default clock class. +- Each \bt_msg (objects in blue stream rectangles) created for a given + stream has a default \bt_cs (yellow star): this is a snapshot of the + stream's default clock. + + In other words, a default clock snapshot contains the value of the + stream's default clock when this message occured. + +The default clock class property of a \bt_stream_cls is optional: +if a stream class has no default clock class, then its instances +(\bt_p_stream) have no default clock, therefore all the \bt_p_msg +created from this stream have no default clock snapshot. + +A clock class is a \ref api-fund-shared-object "shared object": get a +new reference with bt_clock_class_get_ref() and put an existing +reference with bt_clock_class_put_ref(). + +Some library functions \ref api-fund-freezing "freeze" clock classes on +success. The documentation of those functions indicate this +postcondition. + +The type of a clock class is #bt_clock_class. + +Create a default clock class from a \bt_self_comp with +bt_clock_class_create(). + +

    \anchor api-tir-clock-cls-origin Clock value vs. clock class origin

    + +The value of a \bt_stream clock (a conceptual instance of a clock class) +is in cycles. This value is always positive and is relative to +the clock's class's offset, which is relative to its origin. + +A clock class's origin is one of: + +
    +
    If bt_clock_class_origin_is_unix_epoch() returns #BT_TRUE
    +
    + The + Unix epoch. + + The stream clocks of all the clock classes which have a Unix + epoch origin, whatever the clock class + UUIDs, + are correlatable. +
    + +
    If bt_clock_class_origin_is_unix_epoch() returns #BT_FALSE
    +
    + Undefined. + + In that case, two clock classes which share the same UUID, as + returned by bt_clock_class_get_uuid(), including having no UUID, + also share the same origin: their instances (stream clocks) are + correlatable. +
    +
    + +To compute an effective stream clock value, in cycles from its class's +origin: + +-# Convert the clock class's + \link api-tir-clock-cls-prop-offset "offset in seconds"\endlink + property to cycles using its + \ref api-tir-clock-cls-prop-freq "frequency". +-# Add the value of 1., the stream clock's value, and the clock class's + \link api-tir-clock-cls-prop-offset "offset in cycles"\endlink + property. + +Because typical tracer clocks have a high frequency (often 1 GHz +and more), an effective stream clock value (cycles since Unix epoch, for +example) can be larger than \c UINT64_MAX. This is why a clock class has +two offset properties (one in seconds and one in cycles): to make it +possible for a stream clock to have smaller values, relative to this +offset. + +The bt_clock_class_cycles_to_ns_from_origin(), +bt_util_clock_cycles_to_ns_from_origin(), and +bt_clock_snapshot_get_ns_from_origin() functions convert a stream clock +value (cycles) to an equivalent nanoseconds from origin value +using the relevant clock class properties (frequency and offset). + +Those functions perform this computation: + +-# Convert the clock class's "offset in cycles" property to seconds + using its frequency. +-# Convert the stream clock's value to seconds using the clock class's + frequency. +-# Add the values of 1., 2., and the clock class's "offset in seconds" + property. +-# Convert the value of 3. to nanoseconds. + +The following illustration shows the possible scenarios: + +@image html clock-terminology.png + +The clock class's "offset in seconds" property can be negative. +For example, considering: + +- Frequency: 1000 Hz. +- Offset in seconds: -10 seconds. +- Offset in cycles: 500 cycles (that is, 0.5 seconds). +- Stream clock's value: 2000 cycles (that is, 2 seconds). + +Then the computed value is -7.5 seconds from origin, or +-7,500,000,000 nanoseconds from origin. + +

    Properties

    + +A clock class has the following properties: + +
    +
    \anchor api-tir-clock-cls-prop-freq Frequency
    +
    + Frequency of the clock class's instances (stream clocks) + (cycles/second). + + Use bt_clock_class_set_frequency() and + bt_clock_class_get_frequency(). +
    + +
    + \anchor api-tir-clock-cls-prop-offset + Offset (in seconds and in cycles) +
    +
    + Offset in seconds relative to the clock class's + \ref api-tir-clock-cls-origin "origin", and offset in cycles + relative to the offset in seconds, of the clock class's + instances (stream clocks). + + The values of the clock class's instances are relative to the + computed offset. + + Use bt_clock_class_set_offset() and bt_clock_class_get_offset(). +
    + +
    \anchor api-tir-clock-cls-prop-precision Precision
    +
    + Precision of the clock class's instance (stream clocks) values + (cycles). + + For example, considering a precision of 7 cycles and the stream + clock value 42 cycles, the real stream clock value can be + anything between 35 cycles and 49 cycles. + + Use bt_clock_class_set_precision() and + bt_clock_class_get_precision(). +
    + +
    + \anchor api-tir-clock-cls-prop-origin-unix-epoch + Origin is Unix epoch? +
    +
    + Whether or not the clock class's + \ref api-tir-clock-cls-origin "origin" + is the + Unix epoch. + + Use bt_clock_class_set_origin_is_unix_epoch() and + bt_clock_class_origin_is_unix_epoch(). +
    + +
    \anchor api-tir-clock-cls-prop-name \bt_dt_opt Name
    +
    + Name of the clock class. + + Use bt_clock_class_set_name() and bt_clock_class_get_name(). +
    + +
    \anchor api-tir-clock-cls-prop-descr \bt_dt_opt Description
    +
    + Description of the clock class. + + Use bt_clock_class_set_description() and + bt_clock_class_get_description(). +
    + +
    \anchor api-tir-clock-cls-prop-uuid \bt_dt_opt UUID
    +
    + UUID + of the clock class. + + The clock class's UUID uniquely identifies the clock class. + + When the clock class's origin is \em not the + Unix epoch, + then the clock class's UUID determines whether or not two different + clock classes have correlatable instances. + + Use bt_clock_class_set_uuid() and bt_clock_class_get_uuid(). +
    + +
    + \anchor api-tir-clock-cls-prop-user-attrs + \bt_dt_opt User attributes +
    +
    + User attributes of the clock class. + + User attributes are custom attributes attached to a clock class. + + Use bt_clock_class_set_user_attributes(), + bt_clock_class_borrow_user_attributes(), and + bt_clock_class_borrow_user_attributes_const(). +
    +
    +*/ + +/*! @{ */ + +/*! +@name Type +@{ + +@typedef struct bt_clock_class bt_clock_class; + +@brief + Clock class. + +@} +*/ + +/*! +@name Creation +@{ +*/ + +/*! +@brief + Creates a default clock class from the \bt_self_comp + \bt_p{self_component}. + +On success, the returned clock class has the following property values: + + + + + + + + + + + + +
    Property + Value +
    \ref api-tir-clock-cls-prop-freq "Frequency" + 1 GHz +
    \ref api-tir-clock-cls-prop-offset "Offset" in seconds + 0 seconds +
    \ref api-tir-clock-cls-prop-offset "Offset" in cycles + 0 cycles +
    \ref api-tir-clock-cls-prop-precision "Precision" + 0 cycles +
    \ref api-tir-clock-cls-prop-origin-unix-epoch "Origin is Unix epoch?" + Yes +
    \ref api-tir-clock-cls-prop-name "Name" + \em None +
    \ref api-tir-clock-cls-prop-descr "Description" + \em None +
    \ref api-tir-clock-cls-prop-uuid "UUID" + \em None +
    \ref api-tir-clock-cls-prop-user-attrs "User attributes" + Empty \bt_map_val +
    + +@param[in] self_component + Self component from which to create the default clock class. + +@returns + New clock class reference, or \c NULL on memory error. + +@bt_pre_not_null{self_component} +*/ +extern bt_clock_class *bt_clock_class_create(bt_self_component *self_component); + +/*! @} */ + +/*! +@name Properties +@{ +*/ + +/*! +@brief + Sets the frequency (Hz) of the clock class \bt_p{clock_class} to + \bt_p{frequency}. + +See the \ref api-tir-clock-cls-prop-freq "frequency" property. + +@param[in] clock_class + Clock class of which to set the frequency to \bt_p{frequency}. +@param[in] frequency + New frequency of \bt_p{clock_class}. + +@bt_pre_not_null{clock_class} +@bt_pre_hot{clock_class} +@pre + \bt_p{frequency} is not 0. +@pre + \bt_p{frequency} is not UINT64_C(-1). +@pre + \bt_p{frequency} is greater than the clock class's offset in cycles + (as returned by bt_clock_class_get_offset()). + +@sa bt_clock_class_get_frequency() — + Returns the frequency of a clock class. +*/ +extern void bt_clock_class_set_frequency(bt_clock_class *clock_class, + uint64_t frequency); + +/*! +@brief + Returns the frequency (Hz) of the clock class \bt_p{clock_class}. + +See the \ref api-tir-clock-cls-prop-freq "frequency" property. + +@param[in] clock_class + Clock class of which to get the frequency. + +@returns + Frequency (Hz) of \bt_p{clock_class}. + +@bt_pre_not_null{clock_class} + +@sa bt_clock_class_set_frequency() — + Sets the frequency of a clock class. +*/ +extern uint64_t bt_clock_class_get_frequency( + const bt_clock_class *clock_class); + +/*! +@brief + Sets the offset of the clock class \bt_p{clock_class} to + \bt_p{offset_seconds} plus \bt_p{offset_cycles} from its + \ref api-tir-clock-cls-origin "origin". + +See the \ref api-tir-clock-cls-prop-offset "offset" property. + +@param[in] clock_class + Clock class of which to set the offset to \bt_p{offset_seconds} + and \bt_p{offset_cycles}. +@param[in] offset_seconds + New offset in seconds of \bt_p{clock_class}. +@param[in] offset_cycles + New offset in cycles of \bt_p{clock_class}. + +@bt_pre_not_null{clock_class} +@bt_pre_hot{clock_class} +@pre + \bt_p{offset_cycles} is less than the clock class's frequency + (as returned by bt_clock_class_get_frequency()). + +@sa bt_clock_class_get_offset() — + Returns the offset of a clock class. +*/ +extern void bt_clock_class_set_offset(bt_clock_class *clock_class, + int64_t offset_seconds, uint64_t offset_cycles); + +/*! +@brief + Returns the offsets in seconds and cycles of the clock class + \bt_p{clock_class}. + +See the \ref api-tir-clock-cls-prop-offset "offset" property. + +@param[in] clock_class + Clock class of which to get the offset. +@param[out] offset_seconds + When this function returns, \bt_p{*offset_seconds} is the offset in + seconds of + \bt_p{clock_class}. +@param[out] offset_cycles + When this function returns, \bt_p{*offset_cycles} is the offset in + cycles of \bt_p{clock_class}. + +@bt_pre_not_null{clock_class} +@bt_pre_not_null{offset_seconds} +@bt_pre_not_null{offset_cycles} + +@sa bt_clock_class_set_offset() — + Sets the offset of a clock class. +*/ +extern void bt_clock_class_get_offset(const bt_clock_class *clock_class, + int64_t *offset_seconds, uint64_t *offset_cycles); + +/*! +@brief + Sets the precision (cycles) of the clock class \bt_p{clock_class} to + \bt_p{precision}. + +See the \ref api-tir-clock-cls-prop-precision "precision" property. + +@param[in] clock_class + Clock class of which to set the precision to \bt_p{precision}. +@param[in] precision + New precision of \bt_p{clock_class}. + +@bt_pre_not_null{clock_class} +@bt_pre_hot{clock_class} + +@sa bt_clock_class_get_precision() — + Returns the precision of a clock class. +*/ +extern void bt_clock_class_set_precision(bt_clock_class *clock_class, + uint64_t precision); + +/*! +@brief + Returns the precision (cycles) of the clock class + \bt_p{clock_class}. + +See the \ref api-tir-clock-cls-prop-precision "precision" property. + +@param[in] clock_class + Clock class of which to get the precision. + +@returns + Precision (cycles) of \bt_p{clock_class}. + +@bt_pre_not_null{clock_class} + +@sa bt_clock_class_set_precision() — + Sets the precision of a clock class. +*/ +extern uint64_t bt_clock_class_get_precision( + const bt_clock_class *clock_class); + +/*! +@brief + Sets whether or not the \ref api-tir-clock-cls-origin "origin" + of the clock class \bt_p{clock_class} is the + Unix epoch. + +See the \ref api-tir-clock-cls-prop-origin-unix-epoch "origin is Unix epoch?" +property. + +@param[in] clock_class + Clock class of which to set whether or not its origin is the + Unix epoch. +@param[in] origin_is_unix_epoch + #BT_TRUE to make \bt_p{clock_class} have a Unix epoch origin. + +@bt_pre_not_null{clock_class} +@bt_pre_hot{clock_class} +@sa bt_clock_class_origin_is_unix_epoch() — + Returns whether or not the origin of a clock class is the + Unix epoch. +*/ +extern void bt_clock_class_set_origin_is_unix_epoch(bt_clock_class *clock_class, + bt_bool origin_is_unix_epoch); + +/*! +@brief + Returns whether or not the \ref api-tir-clock-cls-origin "origin" + of the clock class \bt_p{clock_class} is the + Unix epoch. + +See the \ref api-tir-clock-cls-prop-origin-unix-epoch "origin is Unix epoch?" +property. + +@param[in] clock_class + Clock class of which to get whether or not its origin is the + Unix epoch. + +@returns + #BT_TRUE if the origin of \bt_p{clock_class} is the Unix epoch. + +@bt_pre_not_null{clock_class} + +@sa bt_clock_class_set_origin_is_unix_epoch() — + Sets whether or not the origin of a clock class is the Unix epoch. +*/ +extern bt_bool bt_clock_class_origin_is_unix_epoch( + const bt_clock_class *clock_class); + +/*! +@brief + Status codes for bt_clock_class_set_name(). +*/ typedef enum bt_clock_class_set_name_status { - BT_CLOCK_CLASS_SET_NAME_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + /*! + @brief + Success. + */ BT_CLOCK_CLASS_SET_NAME_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_CLOCK_CLASS_SET_NAME_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, } bt_clock_class_set_name_status; +/*! +@brief + Sets the name of the clock class \bt_p{clock_class} to + a copy of \bt_p{name}. + +See the \ref api-tir-clock-cls-prop-name "name" property. + +@param[in] clock_class + Clock class of which to set the name to \bt_p{name}. +@param[in] name + New name of \bt_p{clock_class} (copied). + +@retval #BT_CLOCK_CLASS_SET_NAME_STATUS_OK + Success. +@retval #BT_CLOCK_CLASS_SET_NAME_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{clock_class} +@bt_pre_hot{clock_class} +@bt_pre_not_null{name} + +@sa bt_clock_class_get_name() — + Returns the name of a clock class. +*/ extern bt_clock_class_set_name_status bt_clock_class_set_name( bt_clock_class *clock_class, const char *name); +/*! +@brief + Returns the name of the clock class \bt_p{clock_class}. + +See the \ref api-tir-clock-cls-prop-name "name" property. + +If \bt_p{clock_class} has no name, this function returns \c NULL. + +@param[in] clock_class + Clock class of which to get the name. + +@returns + @parblock + Name of \bt_p{clock_class}, or \c NULL if none. + + The returned pointer remains valid as long as \bt_p{clock_class} + is not modified. + @endparblock + +@bt_pre_not_null{clock_class} + +@sa bt_clock_class_set_name() — + Sets the name of a clock class. +*/ +extern const char *bt_clock_class_get_name( + const bt_clock_class *clock_class); + +/*! +@brief + Status codes for bt_clock_class_set_description(). +*/ typedef enum bt_clock_class_set_description_status { - BT_CLOCK_CLASS_SET_DESCRIPTION_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + /*! + @brief + Success. + */ BT_CLOCK_CLASS_SET_DESCRIPTION_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_CLOCK_CLASS_SET_DESCRIPTION_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, } bt_clock_class_set_description_status; +/*! +@brief + Sets the description of the clock class \bt_p{clock_class} to a copy + of \bt_p{description}. + +See the \ref api-tir-clock-cls-prop-descr "description" property. + +@param[in] clock_class + Clock class of which to set the description to \bt_p{description}. +@param[in] description + New description of \bt_p{clock_class} (copied). + +@retval #BT_CLOCK_CLASS_SET_DESCRIPTION_STATUS_OK + Success. +@retval #BT_CLOCK_CLASS_SET_DESCRIPTION_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{clock_class} +@bt_pre_hot{clock_class} +@bt_pre_not_null{description} + +@sa bt_clock_class_get_description() — + Returns the description of a clock class. +*/ extern bt_clock_class_set_description_status bt_clock_class_set_description( bt_clock_class *clock_class, const char *description); -extern void bt_clock_class_set_frequency(bt_clock_class *clock_class, - uint64_t freq); +/*! +@brief + Returns the description of the clock class \bt_p{clock_class}. -extern void bt_clock_class_set_precision(bt_clock_class *clock_class, - uint64_t precision); +See the \ref api-tir-clock-cls-prop-descr "description" property. -extern void bt_clock_class_set_offset(bt_clock_class *clock_class, - int64_t seconds, uint64_t cycles); +If \bt_p{clock_class} has no description, this function returns \c NULL. -extern void bt_clock_class_set_origin_is_unix_epoch(bt_clock_class *clock_class, - bt_bool origin_is_unix_epoch); +@param[in] clock_class + Clock class of which to get the description. + +@returns + @parblock + Description of \bt_p{clock_class}, or \c NULL if none. + + The returned pointer remains valid as long as \bt_p{clock_class} + is not modified. + @endparblock + +@bt_pre_not_null{clock_class} +@sa bt_clock_class_set_description() — + Sets the description of a clock class. +*/ +extern const char *bt_clock_class_get_description( + const bt_clock_class *clock_class); + +/*! +@brief + Sets the + UUID + of the clock class \bt_p{clock_class} to a copy of \bt_p{uuid}. + +See the \ref api-tir-clock-cls-prop-uuid "UUID" property. + +@param[in] clock_class + Clock class of which to set the UUID to \bt_p{uuid}. +@param[in] uuid + New UUID of \bt_p{clock_class} (copied). + +@bt_pre_not_null{clock_class} +@bt_pre_hot{clock_class} +@bt_pre_not_null{uuid} + +@sa bt_clock_class_get_uuid() — + Returns the UUID of a clock class. +*/ extern void bt_clock_class_set_uuid(bt_clock_class *clock_class, bt_uuid uuid); +/*! +@brief + Returns the UUID of the clock class \bt_p{clock_class}. + +See the \ref api-tir-clock-cls-prop-uuid "UUID" property. + +If \bt_p{clock_class} has no UUID, this function returns \c NULL. + +@param[in] clock_class + Clock class of which to get the UUID. + +@returns + @parblock + UUID of \bt_p{clock_class}, or \c NULL if none. + + The returned pointer remains valid as long as \bt_p{clock_class} + is not modified. + @endparblock + +@bt_pre_not_null{clock_class} + +@sa bt_clock_class_set_uuid() — + Sets the UUID of a clock class. +*/ +extern bt_uuid bt_clock_class_get_uuid( + const bt_clock_class *clock_class); + +/*! +@brief + Sets the user attributes of the clock class \bt_p{clock_class} to + \bt_p{user_attributes}. + +See the \ref api-tir-clock-cls-prop-user-attrs "user attributes" +property. + +@note + When you create a default clock class with bt_clock_class_create(), + the clock class's initial user attributes is an empty \bt_map_val. + Therefore you can borrow it with + bt_clock_class_borrow_user_attributes() and fill it directly instead + of setting a new one with this function. + +@param[in] clock_class + Clock class of which to set the user attributes to + \bt_p{user_attributes}. +@param[in] user_attributes + New user attributes of \bt_p{clock_class}. + +@bt_pre_not_null{clock_class} +@bt_pre_hot{clock_class} +@bt_pre_not_null{user_attributes} +@bt_pre_is_map_val{user_attributes} + +@sa bt_clock_class_borrow_user_attributes() — + Borrows the user attributes of a clock class. +*/ +extern void bt_clock_class_set_user_attributes( + bt_clock_class *clock_class, const bt_value *user_attributes); + +/*! +@brief + Borrows the user attributes of the clock class \bt_p{clock_class}. + +See the \ref api-tir-clock-cls-prop-user-attrs "user attributes" +property. + +@note + When you create a default clock class with bt_clock_class_create(), + the clock class's initial user attributes is an empty \bt_map_val. + +@param[in] clock_class + Clock class from which to borrow the user attributes. + +@returns + User attributes of \bt_p{clock_class} (a \bt_map_val). + +@bt_pre_not_null{clock_class} + +@sa bt_clock_class_set_user_attributes() — + Sets the user attributes of a clock class. +@sa bt_clock_class_borrow_user_attributes_const() — + \c const version of this function. +*/ +extern bt_value *bt_clock_class_borrow_user_attributes( + bt_clock_class *clock_class); + +/*! +@brief + Borrows the user attributes of the clock class \bt_p{clock_class} + (\c const version). + +See bt_clock_class_borrow_user_attributes(). +*/ +extern const bt_value *bt_clock_class_borrow_user_attributes_const( + const bt_clock_class *clock_class); + +/*! @} */ + +/*! +@name Utilities +@{ +*/ + +/*! +@brief + Status codes for bt_clock_class_cycles_to_ns_from_origin(). +*/ +typedef enum bt_clock_class_cycles_to_ns_from_origin_status { + /*! + @brief + Success. + */ + BT_CLOCK_CLASS_CYCLES_TO_NS_FROM_ORIGIN_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Integer overflow while computing the result. + */ + BT_CLOCK_CLASS_CYCLES_TO_NS_FROM_ORIGIN_STATUS_OVERFLOW_ERROR = __BT_FUNC_STATUS_OVERFLOW_ERROR, +} bt_clock_class_cycles_to_ns_from_origin_status; + +/*! +@brief + Converts the stream clock value \bt_p{value} from cycles to + nanoseconds from the \ref api-tir-clock-cls-origin "origin" of the + clock class \bt_p{clock_class} and sets \bt_p{*ns_from_origin} + to the result. + +This function: + +-# Converts the + \link api-tir-clock-cls-prop-offset "offset in cycles"\endlink + property of \bt_p{clock_class} to seconds using its + \ref api-tir-clock-cls-prop-freq "frequency". +-# Converts the \bt_p{value} value to seconds using the frequency of + \bt_p{clock_class}. +-# Adds the values of 1., 2., and the + \link api-tir-clock-cls-prop-offset "offset in seconds"\endlink + property of \bt_p{clock_class}. +-# Converts the value of 3. to nanoseconds and sets + \bt_p{*ns_from_origin} to this result. + +The following illustration shows the possible scenarios: + +@image html clock-terminology.png + +This function can fail and return the +#BT_CLOCK_CLASS_CYCLES_TO_NS_FROM_ORIGIN_STATUS_OVERFLOW_ERROR status +code if any step of the computation process causes an integer overflow. + +@param[in] clock_class + Stream clock's class. +@param[in] value + Stream clock's value (cycles) to convert to nanoseconds from + the origin of \bt_p{clock_class}. +@param[out] ns_from_origin + On success, \bt_p{*ns_from_origin} is \bt_p{value} + converted to nanoseconds from the origin of \bt_p{clock_class}. + +@retval #BT_UTIL_CLOCK_CYCLES_TO_NS_FROM_ORIGIN_STATUS_OK + Success. +@retval #BT_UTIL_CLOCK_CYCLES_TO_NS_FROM_ORIGIN_STATUS_OVERFLOW_ERROR + Integer overflow while computing the result. + +@bt_pre_not_null{clock_class} +@bt_pre_not_null{ns_from_origin} + +@sa bt_util_clock_cycles_to_ns_from_origin() — + Converts a clock value from cycles to nanoseconds from the clock's + origin. +*/ +extern bt_clock_class_cycles_to_ns_from_origin_status +bt_clock_class_cycles_to_ns_from_origin( + const bt_clock_class *clock_class, + uint64_t value, int64_t *ns_from_origin); + +/*! @} */ + +/*! +@name Reference count +@{ +*/ + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the clock class \bt_p{clock_class}. + +@param[in] clock_class + @parblock + Clock class of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_clock_class_put_ref() — + Decrements the reference count of a clock class. +*/ +extern void bt_clock_class_get_ref(const bt_clock_class *clock_class); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the clock class \bt_p{clock_class}. + +@param[in] clock_class + @parblock + Clock class of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_clock_class_get_ref() — + Increments the reference count of a clock class. +*/ +extern void bt_clock_class_put_ref(const bt_clock_class *clock_class); + +/*! +@brief + Decrements the reference count of the clock class + \bt_p{_clock_class}, and then sets \bt_p{_clock_class} to \c NULL. + +@param _clock_class + @parblock + Clock class of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_clock_class} +*/ +#define BT_CLOCK_CLASS_PUT_REF_AND_RESET(_clock_class) \ + do { \ + bt_clock_class_put_ref(_clock_class); \ + (_clock_class) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the clock class \bt_p{_dst}, sets + \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} to \c NULL. + +This macro effectively moves a clock class reference from the expression +\bt_p{_src} to the expression \bt_p{_dst}, putting the existing +\bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_CLOCK_CLASS_MOVE_REF(_dst, _src) \ + do { \ + bt_clock_class_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! @} */ + #ifdef __cplusplus } #endif diff --git a/include/babeltrace2/trace-ir/clock-snapshot-const.h b/include/babeltrace2/trace-ir/clock-snapshot-const.h deleted file mode 100644 index 3363b9df..00000000 --- a/include/babeltrace2/trace-ir/clock-snapshot-const.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef BABELTRACE2_TRACE_IR_CLOCK_SNAPSHOT_CONST_H -#define BABELTRACE2_TRACE_IR_CLOCK_SNAPSHOT_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern const bt_clock_class *bt_clock_snapshot_borrow_clock_class_const( - const bt_clock_snapshot *clock_snapshot); - -extern uint64_t bt_clock_snapshot_get_value( - const bt_clock_snapshot *clock_snapshot); - -typedef enum bt_clock_snapshot_get_ns_from_origin_status { - BT_CLOCK_SNAPSHOT_GET_NS_FROM_ORIGIN_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_CLOCK_SNAPSHOT_GET_NS_FROM_ORIGIN_STATUS_OVERFLOW_ERROR = __BT_FUNC_STATUS_OVERFLOW_ERROR, -} bt_clock_snapshot_get_ns_from_origin_status; - -extern bt_clock_snapshot_get_ns_from_origin_status -bt_clock_snapshot_get_ns_from_origin( - const bt_clock_snapshot *clock_snapshot, - int64_t *ns_from_origin); - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_TRACE_IR_CLOCK_SNAPSHOT_CONST_H */ diff --git a/include/babeltrace2/trace-ir/clock-snapshot.h b/include/babeltrace2/trace-ir/clock-snapshot.h new file mode 100644 index 00000000..23d86781 --- /dev/null +++ b/include/babeltrace2/trace-ir/clock-snapshot.h @@ -0,0 +1,228 @@ +#ifndef BABELTRACE2_TRACE_IR_CLOCK_SNAPSHOT_H +#define BABELTRACE2_TRACE_IR_CLOCK_SNAPSHOT_H + +/* + * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef __BT_IN_BABELTRACE_H +# error "Please include instead." +#endif + +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*! +@defgroup api-tir-cs Clock snapshot +@ingroup api-tir + +@brief + Snapshot of a \bt_stream clock. + +A clock snapshot is a snapshot of the value +of a \bt_stream clock (a \bt_clock_cls instance). + +A clock snapshot is a \ref api-tir "trace IR" data object. + +Stream clocks only exist conceptually in \bt_name because they +are stateful objects. \bt_cp_msg cannot refer to stateful objects +because they must not change while being transported from one +\bt_comp to the other. + +Instead of having a stream clock object, messages have a default +clock snapshot: this is a snapshot of the value of a stream's +default clock (a clock class instance): + +@image html clocks.png + +In the illustration above, notice that: + +- Each stream has a default clock (yellow bell alarm clock): this is an + instance of the stream's class's default clock class. +- Each \bt_msg (objects in blue stream rectangles) created for a given + stream has a default clock snapshot (yellow star): this is a snapshot + of the stream's default clock. + + In other words, a default clock snapshot contains the value of the + stream's default clock when this message occured. + +A clock snapshot is a \ref api-fund-unique-object "unique object": it +belongs to a \bt_msg. + +The type of a clock snapshot is #bt_clock_snapshot. + +You cannot create a clock snapshot: you specify a clock snapshot value +(in clock cycles, a \c uint64_t value) when you create a \bt_msg or set +a message's clock snapshot with one of: + +- bt_message_stream_beginning_set_default_clock_snapshot() +- bt_message_stream_end_set_default_clock_snapshot() +- bt_message_event_create_with_default_clock_snapshot() +- bt_message_event_create_with_packet_and_default_clock_snapshot() +- bt_message_packet_beginning_create_with_default_clock_snapshot() +- bt_message_packet_end_create_with_default_clock_snapshot() +- bt_message_discarded_events_create_with_default_clock_snapshots() +- bt_message_discarded_packets_create_with_default_clock_snapshots() +- bt_message_message_iterator_inactivity_create() + +See \ref api-tir-clock-cls-origin "Clock value vs. clock class origin" +to understand the meaning of a clock's value in relation to the +properties of its class. +*/ + +/*! @{ */ + +/*! +@name Type +@{ + +@typedef struct bt_clock_snapshot bt_clock_snapshot; + +@brief + Clock snapshot. + +@} +*/ + +/*! +@brief + Borrows the \ref api-tir-clock-cls "class" of the clock of which + \bt_p{clock_snapshot} is a snapshot. + +@param[in] clock_snapshot + Clock snapshot of which to borrow the clock class. + +@returns + \em Borrowed reference of the clock class of \bt_p{clock_snapshot}. + +@bt_pre_not_null{clock_snapshot} +*/ +extern const bt_clock_class *bt_clock_snapshot_borrow_clock_class_const( + const bt_clock_snapshot *clock_snapshot); + +/*! +@brief + Returns the value, in clock cycles, of the clock snapshot + \bt_p{clock_snapshot}. + +@param[in] clock_snapshot + Clock snapshot of which to get the value. + +@returns + Value of \bt_p{clock_snapshot} (clock cycles). + +@bt_pre_not_null{clock_snapshot} + +@sa bt_clock_snapshot_get_ns_from_origin() — + Returns the equivalent nanoseconds from clock class origin of a + clock snapshot's value. +*/ +extern uint64_t bt_clock_snapshot_get_value( + const bt_clock_snapshot *clock_snapshot); + +/*! +@brief + Status codes for bt_clock_snapshot_get_ns_from_origin(). +*/ +typedef enum bt_clock_snapshot_get_ns_from_origin_status { + /*! + @brief + Success. + */ + BT_CLOCK_SNAPSHOT_GET_NS_FROM_ORIGIN_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Integer overflow while computing the result. + */ + BT_CLOCK_SNAPSHOT_GET_NS_FROM_ORIGIN_STATUS_OVERFLOW_ERROR = __BT_FUNC_STATUS_OVERFLOW_ERROR, +} bt_clock_snapshot_get_ns_from_origin_status; + +/*! +@brief + Converts the value of the clock snapshot + \bt_p{clock_snapshot} from cycles to nanoseconds from the + \ref api-tir-clock-cls-origin "origin" of its + \bt_clock_cls and sets \bt_p{*ns_from_origin} to the result. + +This function: + +-# Converts the + \link api-tir-clock-cls-prop-offset "offset in cycles"\endlink + property of the clock class of \bt_p{clock_snapshot} to + seconds using its + \ref api-tir-clock-cls-prop-freq "frequency". +-# Converts the value of \bt_p{clock_snapshot} to seconds using the + frequency of its clock class. +-# Adds the values of 1., 2., and the + \link api-tir-clock-cls-prop-offset "offset in seconds"\endlink + property of the clock class of \bt_p{clock_snapshot}. +-# Converts the value of 3. to nanoseconds and sets + \bt_p{*ns_from_origin} to this result. + +The following illustration shows the possible scenarios: + +@image html clock-terminology.png + +This function can fail and return the +#BT_CLOCK_SNAPSHOT_GET_NS_FROM_ORIGIN_STATUS_OVERFLOW_ERROR status +code if any step of the computation process causes an integer overflow. + +@param[in] clock_snapshot + Clock snapshot containing the value to convert to nanoseconds + from the origin of its clock class. +@param[out] ns_from_origin + On success, \bt_p{*ns_from_origin} is the value + of \bt_p{clock_snapshot} converted to nanoseconds from the origin + of its clock class. + +@retval #BT_CLOCK_SNAPSHOT_GET_NS_FROM_ORIGIN_STATUS_OK + Success. +@retval #BT_CLOCK_SNAPSHOT_GET_NS_FROM_ORIGIN_STATUS_OVERFLOW_ERROR + Integer overflow while computing the result. + +@bt_pre_not_null{clock_snapshot} +@bt_pre_not_null{ns_from_origin} + +@sa bt_util_clock_cycles_to_ns_from_origin() — + Converts a clock value from cycles to nanoseconds from the clock's + origin. +@sa bt_clock_class_cycles_to_ns_from_origin() — + Converts a clock value from cycles to nanoseconds from a clock + class's origin. +*/ +extern bt_clock_snapshot_get_ns_from_origin_status +bt_clock_snapshot_get_ns_from_origin( + const bt_clock_snapshot *clock_snapshot, + int64_t *ns_from_origin); + +/*! @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* BABELTRACE2_TRACE_IR_CLOCK_SNAPSHOT_H */ diff --git a/include/babeltrace2/trace-ir/event-class-const.h b/include/babeltrace2/trace-ir/event-class-const.h deleted file mode 100644 index fa1ff786..00000000 --- a/include/babeltrace2/trace-ir/event-class-const.h +++ /dev/null @@ -1,103 +0,0 @@ -#ifndef BABELTRACE2_TRACE_IR_EVENT_CLASS_CONST_H -#define BABELTRACE2_TRACE_IR_EVENT_CLASS_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include -#include - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum bt_event_class_log_level { - BT_EVENT_CLASS_LOG_LEVEL_EMERGENCY = 0, - BT_EVENT_CLASS_LOG_LEVEL_ALERT = 1, - BT_EVENT_CLASS_LOG_LEVEL_CRITICAL = 2, - BT_EVENT_CLASS_LOG_LEVEL_ERROR = 3, - BT_EVENT_CLASS_LOG_LEVEL_WARNING = 4, - BT_EVENT_CLASS_LOG_LEVEL_NOTICE = 5, - BT_EVENT_CLASS_LOG_LEVEL_INFO = 6, - BT_EVENT_CLASS_LOG_LEVEL_DEBUG_SYSTEM = 7, - BT_EVENT_CLASS_LOG_LEVEL_DEBUG_PROGRAM = 8, - BT_EVENT_CLASS_LOG_LEVEL_DEBUG_PROCESS = 9, - BT_EVENT_CLASS_LOG_LEVEL_DEBUG_MODULE = 10, - BT_EVENT_CLASS_LOG_LEVEL_DEBUG_UNIT = 11, - BT_EVENT_CLASS_LOG_LEVEL_DEBUG_FUNCTION = 12, - BT_EVENT_CLASS_LOG_LEVEL_DEBUG_LINE = 13, - BT_EVENT_CLASS_LOG_LEVEL_DEBUG = 14, -} bt_event_class_log_level; - -extern const bt_value *bt_event_class_borrow_user_attributes_const( - const bt_event_class *event_class); - -extern const bt_stream_class *bt_event_class_borrow_stream_class_const( - const bt_event_class *event_class); - -extern const char *bt_event_class_get_name(const bt_event_class *event_class); - -extern uint64_t bt_event_class_get_id(const bt_event_class *event_class); - -extern bt_property_availability bt_event_class_get_log_level( - const bt_event_class *event_class, - bt_event_class_log_level *log_level); - -extern const char *bt_event_class_get_emf_uri( - const bt_event_class *event_class); - -extern const bt_field_class * -bt_event_class_borrow_specific_context_field_class_const( - const bt_event_class *event_class); - -extern const bt_field_class *bt_event_class_borrow_payload_field_class_const( - const bt_event_class *event_class); - -extern void bt_event_class_get_ref(const bt_event_class *event_class); - -extern void bt_event_class_put_ref(const bt_event_class *event_class); - -#define BT_EVENT_CLASS_PUT_REF_AND_RESET(_var) \ - do { \ - bt_event_class_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_EVENT_CLASS_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_event_class_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_TRACE_IR_EVENT_CLASS_CONST_H */ diff --git a/include/babeltrace2/trace-ir/event-class.h b/include/babeltrace2/trace-ir/event-class.h index e435d387..c82e6263 100644 --- a/include/babeltrace2/trace-ir/event-class.h +++ b/include/babeltrace2/trace-ir/event-class.h @@ -29,67 +29,1028 @@ #include -#include #include #ifdef __cplusplus extern "C" { #endif +/*! +@defgroup api-tir-ev-cls Event class +@ingroup api-tir + +@brief + Class of \bt_p_ev. + +An event class is the class of \bt_p_ev, +which \bt_p_ev_msg contain: + +@image html trace-structure.png + +In the illustration above, notice that: + +- A \bt_stream is a conceptual \ref api-msg-seq "sequence of messages", + some of which are \bt_p_ev_msg. +- An event message contains an \bt_ev. +- An event is an instance of an event class. +- The \ref api-tir-ev-prop-payload "payload field" of an event is an + instance of the \ref api-tir-ev-cls-prop-p-fc "payload field class" + which an event class contains. + +An event class is a \ref api-tir "trace IR" metadata object. + +An event class is a \ref api-fund-shared-object "shared object": get a +new reference with bt_event_class_get_ref() and put an existing +reference with bt_event_class_put_ref(). + +Some library functions \ref api-fund-freezing "freeze" event classes on +success. The documentation of those functions indicate this +postcondition. + +The type of an event class is #bt_event_class. + +A \bt_stream_cls contains event classes. All the event classes of a +given stream class have unique +\ref api-tir-ev-cls-prop-id "numeric IDs". Borrow the stream class +which contains an event class with bt_event_class_borrow_stream_class() +or bt_event_class_borrow_stream_class_const(). + +To create a default event class: + +
    +
    + If bt_stream_class_assigns_automatic_event_class_id() returns + #BT_TRUE (the default) for the stream class to use +
    +
    Use bt_event_class_create().
    + +
    + If bt_stream_class_assigns_automatic_event_class_id() returns + #BT_FALSE for the stream class to use +
    +
    Use bt_event_class_create_with_id().
    +
    + +

    Properties

    + +An event class has the following properties: + +
    +
    \anchor api-tir-ev-cls-prop-id Numeric ID
    +
    + Numeric ID, unique amongst the numeric IDs of the event class's + \bt_stream_cls's event classes. + + Depending on whether or not the event class's stream class + automatically assigns event class IDs + (see bt_stream_class_assigns_automatic_event_class_id()), + set the event class's numeric ID on creation with + bt_event_class_create() or + bt_event_class_create_with_id(). + + You cannot change the numeric ID once the event class is created. + + Get an event class's numeric ID with bt_event_class_get_id(). +
    + +
    \anchor api-tir-ev-cls-prop-name \bt_dt_opt Name
    +
    + Name of the event class. + + Use bt_event_class_set_name() and bt_event_class_get_name(). +
    + +
    \anchor api-tir-ev-cls-prop-log-lvl \bt_dt_opt Log level
    +
    + Log level of the event class. + + The event class's log level corresponds to the log level of the + tracer's original instrumentation point. + + Use bt_event_class_set_log_level() and + bt_event_class_get_log_level(). +
    + +
    + \anchor api-tir-ev-cls-prop-emf-uri + \bt_dt_opt Eclipse Modeling Framework (EMF) URI +
    +
    + EMF URI of the event class. + + Use bt_event_class_set_emf_uri() and + bt_event_class_get_emf_uri(). +
    + +
    + \anchor api-tir-ev-cls-prop-p-fc + \bt_dt_opt Payload field class +
    +
    + Payload \bt_fc of the event class. + + The payload of an event class instance (\bt_ev) contains the + event's main data. + + Use bt_event_class_set_payload_field_class() + bt_event_class_borrow_payload_field_class(), + and bt_event_class_borrow_payload_field_class_const(). +
    + +
    + \anchor api-tir-ev-cls-prop-sc-fc + \bt_dt_opt Specific context field class +
    +
    + Specific context \bt_fc of the event class. + + The specific context of an event class instance (\bt_ev) contains + any contextual data of which the layout is specific to the + event's class and which does not belong to the payload. + + Use bt_event_class_set_specific_context_field_class() + bt_event_class_borrow_specific_context_field_class(), + and bt_event_class_borrow_specific_context_field_class_const(). +
    + +
    + \anchor api-tir-ev-cls-prop-user-attrs + \bt_dt_opt User attributes +
    +
    + User attributes of the event class. + + User attributes are custom attributes attached to an event class. + + Use bt_event_class_set_user_attributes(), + bt_event_class_borrow_user_attributes(), and + bt_event_class_borrow_user_attributes_const(). +
    +
    +*/ + +/*! @{ */ + +/*! +@name Type +@{ + +@typedef struct bt_event_class bt_event_class; + +@brief + Event class. + +@} +*/ + +/*! +@name Creation +@{ +*/ + +/*! +@brief + Creates a default event class and adds it to the \bt_stream_cls + \bt_p{stream_class}. + +@attention + @parblock + Only use this function if + + @code + bt_stream_class_assigns_automatic_event_class_id(stream_class) + @endcode + + returns #BT_TRUE. + + Otherwise, use bt_event_class_create_with_id(). + @endparblock + +On success, the returned event class has the following property values: + + + + + + + + + + +
    Property + Value +
    \ref api-tir-ev-cls-prop-id "Numeric ID" + Automatically assigned by \bt_p{stream_class} +
    \ref api-tir-ev-cls-prop-name "Name" + \em None +
    \ref api-tir-ev-cls-prop-log-lvl "Log level" + \em None +
    \ref api-tir-ev-cls-prop-emf-uri "EMF URI" + \em None +
    \ref api-tir-ev-cls-prop-p-fc "Payload field class" + \em None +
    \ref api-tir-ev-cls-prop-sc-fc "Specific context field class" + \em None +
    \ref api-tir-ev-cls-prop-user-attrs "User attributes" + Empty \bt_map_val +
    + +@param[in] stream_class + Stream class to add the created event class to. + +@returns + New event class reference, or \c NULL on memory error. + +@bt_pre_not_null{stream_class} +@pre + bt_stream_class_assigns_automatic_event_class_id(stream_class) + returns #BT_TRUE. + +@bt_post_success_frozen{stream_class} + +@sa bt_event_class_create_with_id() — + Creates an event class with a specific numeric ID and adds it to a + stream class. +*/ extern bt_event_class *bt_event_class_create( bt_stream_class *stream_class); +/*! +@brief + Creates a default event class with the numeric ID \bt_p{id} and adds + it to the \bt_stream_cls \bt_p{stream_class}. + +@attention + @parblock + Only use this function if + + @code + bt_stream_class_assigns_automatic_event_class_id(stream_class) + @endcode + + returns #BT_FALSE. + + Otherwise, use bt_event_class_create(). + @endparblock + +On success, the returned event class has the following property values: + + + + + + + + + + +
    Property + Value +
    \ref api-tir-ev-cls-prop-id "Numeric ID" + \bt_p{id} +
    \ref api-tir-ev-cls-prop-name "Name" + \em None +
    \ref api-tir-ev-cls-prop-log-lvl "Log level" + \em None +
    \ref api-tir-ev-cls-prop-emf-uri "EMF URI" + \em None +
    \ref api-tir-ev-cls-prop-p-fc "Payload field class" + \em None +
    \ref api-tir-ev-cls-prop-sc-fc "Specific context field class" + \em None +
    \ref api-tir-ev-cls-prop-user-attrs "User attributes" + Empty \bt_map_val +
    + +@param[in] stream_class + Stream class to add the created event class to. +@param[in] id + Numeric ID of the event class to create and add to + \bt_p{stream_class}. + +@returns + New event class reference, or \c NULL on memory error. + +@bt_pre_not_null{stream_class} +@pre + bt_stream_class_assigns_automatic_event_class_id(stream_class) + returns #BT_FALSE. +@pre + \bt_p{stream_class} does not contain an event class with the numeric + ID \bt_p{id}. + +@bt_post_success_frozen{stream_class} + +@sa bt_event_class_create() — + Creates an event class with an automatic numeric ID and adds it to a + stream class. +*/ extern bt_event_class *bt_event_class_create_with_id( bt_stream_class *stream_class, uint64_t id); -extern bt_value *bt_event_class_borrow_user_attributes( - bt_event_class *event_class); +/*! @} */ -extern void bt_event_class_set_user_attributes( - bt_event_class *event_class, const bt_value *user_attributes); +/*! +@name Stream class access +@{ +*/ + +/*! +@brief + Borrows the \bt_stream_cls which contains the event class + \bt_p{event_class}. +@param[in] event_class + Event class from which to borrow the stream class which contains it. + +@returns + Stream class which contains \bt_p{event_class}. + +@bt_pre_not_null{event_class} + +@sa bt_event_class_borrow_stream_class_const() — + \c const version of this function. +*/ extern bt_stream_class *bt_event_class_borrow_stream_class( bt_event_class *event_class); +/*! +@brief + Borrows the \bt_stream_cls which contains the event class + \bt_p{event_class} (\c const version). + +See bt_event_class_borrow_stream_class(). +*/ +extern const bt_stream_class *bt_event_class_borrow_stream_class_const( + const bt_event_class *event_class); + +/*! @} */ + +/*! +@name Properties +@{ +*/ + +/*! +@brief + Returns the numeric ID of the event class \bt_p{event_class}. + +See the \ref api-tir-ev-cls-prop-id "numeric ID" property. + +@param[in] event_class + Event class of which to get the numeric ID. + +@returns + Numeric ID of \bt_p{event_class}. + +@bt_pre_not_null{event_class} + +@sa bt_event_class_create_with_id() — + Creates an event class with a specific numeric ID and adds it to a + stream class. +*/ +extern uint64_t bt_event_class_get_id(const bt_event_class *event_class); + +/*! +@brief + Status codes for bt_event_class_set_name(). +*/ typedef enum bt_event_class_set_name_status { - BT_EVENT_CLASS_SET_NAME_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + /*! + @brief + Success. + */ BT_EVENT_CLASS_SET_NAME_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_EVENT_CLASS_SET_NAME_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, } bt_event_class_set_name_status; +/*! +@brief + Sets the name of the event class \bt_p{event_class} to + a copy of \bt_p{name}. + +See the \ref api-tir-ev-cls-prop-name "name" property. + +@param[in] event_class + Event class of which to set the name to \bt_p{name}. +@param[in] name + New name of \bt_p{event_class} (copied). + +@retval #BT_EVENT_CLASS_SET_NAME_STATUS_OK + Success. +@retval #BT_EVENT_CLASS_SET_NAME_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{event_class} +@bt_pre_hot{event_class} +@bt_pre_not_null{name} + +@sa bt_event_class_get_name() — + Returns the name of an event class. +*/ extern bt_event_class_set_name_status bt_event_class_set_name( bt_event_class *event_class, const char *name); +/*! +@brief + Returns the name of the event class \bt_p{event_class}. + +See the \ref api-tir-ev-cls-prop-name "name" property. + +If \bt_p{event_class} has no name, this function returns \c NULL. + +@param[in] event_class + Event class of which to get the name. + +@returns + @parblock + Name of \bt_p{event_class}, or \c NULL if none. + + The returned pointer remains valid as long as \bt_p{event_class} + is not modified. + @endparblock + +@bt_pre_not_null{event_class} + +@sa bt_event_class_set_name() — + Sets the name of an event class. +*/ +extern const char *bt_event_class_get_name(const bt_event_class *event_class); + +/*! +@brief + Event class log level enumerators. +*/ +typedef enum bt_event_class_log_level { + /*! + @brief + System is unusable. + */ + BT_EVENT_CLASS_LOG_LEVEL_EMERGENCY = 0, + + /*! + @brief + Action must be taken immediately. + */ + BT_EVENT_CLASS_LOG_LEVEL_ALERT = 1, + + /*! + @brief + Critical conditions. + */ + BT_EVENT_CLASS_LOG_LEVEL_CRITICAL = 2, + + /*! + @brief + Error conditions. + */ + BT_EVENT_CLASS_LOG_LEVEL_ERROR = 3, + + /*! + @brief + Warning conditions. + */ + BT_EVENT_CLASS_LOG_LEVEL_WARNING = 4, + + /*! + @brief + Normal, but significant, condition. + */ + BT_EVENT_CLASS_LOG_LEVEL_NOTICE = 5, + + /*! + @brief + Informational message. + */ + BT_EVENT_CLASS_LOG_LEVEL_INFO = 6, + + /*! + @brief + Debugging information with system-level scope + (set of programs). + */ + BT_EVENT_CLASS_LOG_LEVEL_DEBUG_SYSTEM = 7, + + /*! + @brief + Debugging information with program-level scope + (set of processes). + */ + BT_EVENT_CLASS_LOG_LEVEL_DEBUG_PROGRAM = 8, + + /*! + @brief + Debugging information with process-level scope + (set of modules). + */ + BT_EVENT_CLASS_LOG_LEVEL_DEBUG_PROCESS = 9, + + /*! + @brief + Debugging information with module (executable/library) scope + (set of units). + */ + BT_EVENT_CLASS_LOG_LEVEL_DEBUG_MODULE = 10, + + /*! + @brief + Debugging information with compilation unit scope + (set of functions). + */ + BT_EVENT_CLASS_LOG_LEVEL_DEBUG_UNIT = 11, + + /*! + @brief + Debugging information with function-level scope. + */ + BT_EVENT_CLASS_LOG_LEVEL_DEBUG_FUNCTION = 12, + + /*! + @brief + Debugging information with function-level scope. + */ + BT_EVENT_CLASS_LOG_LEVEL_DEBUG_LINE = 13, + + /*! + @brief + Debugging-level message. + */ + BT_EVENT_CLASS_LOG_LEVEL_DEBUG = 14, +} bt_event_class_log_level; + +/*! +@brief + Sets the log level of the event class \bt_p{event_class} to + \bt_p{log_level}. + +See the \ref api-tir-ev-cls-prop-log-lvl "log level" property. + +@param[in] event_class + Event class of which to set the log level to \bt_p{log_level}. +@param[in] log_level + New log level of \bt_p{event_class}. + +@bt_pre_not_null{event_class} +@bt_pre_hot{event_class} + +@sa bt_event_class_get_log_level() — + Returns the log level of an event class. +*/ extern void bt_event_class_set_log_level(bt_event_class *event_class, bt_event_class_log_level log_level); +/*! +@brief + Returns the log level of the event class \bt_p{event_class}. + +See the \ref api-tir-ev-cls-prop-log-lvl "log level" property. + +@param[in] event_class + Event class of which to get the log level. +@param[out] log_level + If this function returns + #BT_PROPERTY_AVAILABILITY_AVAILABLE, \bt_p{*log_level} is + the log level of \bt_p{event_class}. + +@retval #BT_PROPERTY_AVAILABILITY_AVAILABLE + The log level of \bt_p{event_class} is available. +@retval #BT_PROPERTY_AVAILABILITY_NOT_AVAILABLE + The log level of \bt_p{event_class} is not available. + +@bt_pre_not_null{event_class} +@bt_pre_not_null{log_level} + +@sa bt_event_class_set_log_level() — + Sets the log level of an event class. +*/ +extern bt_property_availability bt_event_class_get_log_level( + const bt_event_class *event_class, + bt_event_class_log_level *log_level); + +/*! +@brief + Status codes for bt_event_class_set_emf_uri(). +*/ typedef enum bt_event_class_set_emf_uri_status { - BT_EVENT_CLASS_SET_EMF_URI_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + /*! + @brief + Success. + */ BT_EVENT_CLASS_SET_EMF_URI_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_EVENT_CLASS_SET_EMF_URI_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, } bt_event_class_set_emf_uri_status; +/*! +@brief + Sets the Eclipse Modeling Framework (EMF) URI of the event class + \bt_p{event_class} to a copy of \bt_p{emf_uri}. + +See the \ref api-tir-ev-cls-prop-emf-uri "EMF URI" property. + +@param[in] event_class + Event class of which to set the EMF URI to \bt_p{emf_uri}. +@param[in] emf_uri + New EMF URI of \bt_p{event_class} (copied). + +@retval #BT_EVENT_CLASS_SET_EMF_URI_STATUS_OK + Success. +@retval #BT_EVENT_CLASS_SET_EMF_URI_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{event_class} +@bt_pre_hot{event_class} +@bt_pre_not_null{emf_uri} + +@sa bt_event_class_get_emf_uri() — + Returns the EMF URI of an event class. +*/ extern bt_event_class_set_emf_uri_status bt_event_class_set_emf_uri( bt_event_class *event_class, const char *emf_uri); +/*! +@brief + Returns the Eclipse Modeling Framework (EMF) URI of the event + class \bt_p{event_class}. + +See the \ref api-tir-ev-cls-prop-emf-uri "EMF URI" property. + +If \bt_p{event_class} has no EMF URI, this function returns \c NULL. + +@param[in] event_class + Event class of which to get the EMF URI. + +@returns + @parblock + EMF URI of \bt_p{event_class}, or \c NULL if none. + + The returned pointer remains valid as long as \bt_p{event_class} + is not modified. + @endparblock + +@bt_pre_not_null{event_class} + +@sa bt_event_class_set_emf_uri() — + Sets the EMF URI of an event class. +*/ +extern const char *bt_event_class_get_emf_uri( + const bt_event_class *event_class); + +/*! +@brief + Status codes for bt_event_class_set_payload_field_class() and + bt_event_class_set_specific_context_field_class(). +*/ typedef enum bt_event_class_set_field_class_status { - BT_EVENT_CLASS_SET_FIELD_CLASS_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + /*! + @brief + Success. + */ BT_EVENT_CLASS_SET_FIELD_CLASS_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_EVENT_CLASS_SET_FIELD_CLASS_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, } bt_event_class_set_field_class_status; +/*! +@brief + Sets the payload \bt_fc of the event class + \bt_p{event_class} to \bt_p{field_class}. + +See the \ref api-tir-ev-cls-prop-p-fc "payload field class" property. + +@param[in] event_class + Event class of which to set the payload field class to + \bt_p{field_class}. +@param[in] field_class + New payload field class of \bt_p{event_class}. + +@retval #BT_EVENT_CLASS_SET_FIELD_CLASS_STATUS_OK + Success. +@retval #BT_EVENT_CLASS_SET_FIELD_CLASS_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{event_class} +@bt_pre_hot{event_class} +@bt_pre_not_null{field_class} +@bt_pre_is_struct_fc{field_class} +@pre + \bt_p{field_class}, or any of its contained field classes, + is not already part of a \bt_stream_cls or of an event class. +@pre + If any of the field classes recursively contained in + \bt_p{field_class} has a + \ref api-tir-fc-link "link to another field class", it must honor + the field class link rules. + +@bt_post_success_frozen{field_class} + +@sa bt_event_class_borrow_payload_field_class() — + Borrows the payload field class of an event class. +@sa bt_event_class_borrow_payload_field_class_const() — + Borrows the payload field class of an event class + (\c const version). +*/ +extern bt_event_class_set_field_class_status +bt_event_class_set_payload_field_class(bt_event_class *event_class, + bt_field_class *field_class); + +/*! +@brief + Borrows the payload \bt_fc from the event class \bt_p{event_class}. + +See the \ref api-tir-ev-cls-prop-p-fc "payload field class" property. + +If \bt_p{event_class} has no payload field class, this function +returns \c NULL. + +@param[in] event_class + Event class from which to borrow the payload field class. + +@returns + \em Borrowed reference of the payload field class of + \bt_p{event_class}, or \c NULL if none. + +@bt_pre_not_null{event_class} + +@sa bt_event_class_set_payload_field_class() — + Sets the payload field class of an event class. +@sa bt_event_class_borrow_payload_field_class_const() — + \c const version of this function. +*/ +extern bt_field_class *bt_event_class_borrow_payload_field_class( + bt_event_class *event_class); + +/*! +@brief + Borrows the payload \bt_fc from the event class \bt_p{event_class} + (\c const version). + +See bt_event_class_borrow_payload_field_class(). +*/ +extern const bt_field_class *bt_event_class_borrow_payload_field_class_const( + const bt_event_class *event_class); + +/*! +@brief + Sets the specific context \bt_fc of the event class + \bt_p{event_class} to \bt_p{field_class}. + +See the \ref api-tir-ev-cls-prop-sc-fc "specific context field class" +property. + +@param[in] event_class + Event class of which to set the specific context field class to + \bt_p{field_class}. +@param[in] field_class + New specific context field class of \bt_p{event_class}. + +@retval #BT_EVENT_CLASS_SET_FIELD_CLASS_STATUS_OK + Success. +@retval #BT_EVENT_CLASS_SET_FIELD_CLASS_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{event_class} +@bt_pre_hot{event_class} +@bt_pre_not_null{field_class} +@bt_pre_is_struct_fc{field_class} +@pre + \bt_p{field_class}, or any of its contained field classes, + is not already part of a \bt_stream_cls or of an event class. +@pre + If any of the field classes recursively contained in + \bt_p{field_class} has a + \ref api-tir-fc-link "link to another field class", it must honor + the field class link rules. + +@bt_post_success_frozen{field_class} + +@sa bt_event_class_borrow_specific_context_field_class() — + Borrows the specific context field class of an event class. +@sa bt_event_class_borrow_specific_context_field_class_const() — + Borrows the specific context field class of an event class + (\c const version). +*/ extern bt_event_class_set_field_class_status bt_event_class_set_specific_context_field_class(bt_event_class *event_class, bt_field_class *field_class); +/*! +@brief + Borrows the specific context \bt_fc from the event class + \bt_p{event_class}. + +See the \ref api-tir-ev-cls-prop-sc-fc "specific context field class" +property. + +If \bt_p{event_class} has no specific context field class, this function +returns \c NULL. + +@param[in] event_class + Event class from which to borrow the specific context field class. + +@returns + \em Borrowed reference of the specific context field class of + \bt_p{event_class}, or \c NULL if none. + +@bt_pre_not_null{event_class} + +@sa bt_event_class_set_specific_context_field_class() — + Sets the specific context field class of an event class. +@sa bt_event_class_borrow_specific_context_field_class_const() — + \c const version of this function. +*/ extern bt_field_class * bt_event_class_borrow_specific_context_field_class(bt_event_class *event_class); -extern bt_event_class_set_field_class_status -bt_event_class_set_payload_field_class( - bt_event_class *event_class, - bt_field_class *field_class); +/*! +@brief + Borrows the specific context \bt_fc from the event class + \bt_p{event_class} (\c const version). -extern bt_field_class *bt_event_class_borrow_payload_field_class( +See bt_event_class_borrow_specific_context_field_class(). +*/ +extern const bt_field_class * +bt_event_class_borrow_specific_context_field_class_const( + const bt_event_class *event_class); + +/*! +@brief + Sets the user attributes of the event class \bt_p{event_class} to + \bt_p{user_attributes}. + +See the \ref api-tir-ev-cls-prop-user-attrs "user attributes" property. + +@note + When you create a default event class with bt_event_class_create() + or bt_event_class_create_with_id(), the event class's initial user + attributes is an empty \bt_map_val. Therefore you can borrow it with + bt_event_class_borrow_user_attributes() and fill it directly instead + of setting a new one with this function. + +@param[in] event_class + Event class of which to set the user attributes to + \bt_p{user_attributes}. +@param[in] user_attributes + New user attributes of \bt_p{event_class}. + +@bt_pre_not_null{event_class} +@bt_pre_hot{event_class} +@bt_pre_not_null{user_attributes} +@bt_pre_is_map_val{user_attributes} + +@sa bt_event_class_borrow_user_attributes() — + Borrows the user attributes of an event class. +*/ +extern void bt_event_class_set_user_attributes( + bt_event_class *event_class, const bt_value *user_attributes); + +/*! +@brief + Borrows the user attributes of the event class \bt_p{event_class}. + +See the \ref api-tir-ev-cls-prop-user-attrs "user attributes" property. + +@note + When you create a default event class with bt_event_class_create() + or bt_event_class_create_with_id(), the event class's initial user + attributes is an empty \bt_map_val. + +@param[in] event_class + Event class from which to borrow the user attributes. + +@returns + User attributes of \bt_p{event_class} (a \bt_map_val). + +@bt_pre_not_null{event_class} + +@sa bt_event_class_set_user_attributes() — + Sets the user attributes of an event class. +@sa bt_event_class_borrow_user_attributes_const() — + \c const version of this function. +*/ +extern bt_value *bt_event_class_borrow_user_attributes( bt_event_class *event_class); +/*! +@brief + Borrows the user attributes of the event class \bt_p{event_class} + (\c const version). + +See bt_event_class_borrow_user_attributes(). +*/ +extern const bt_value *bt_event_class_borrow_user_attributes_const( + const bt_event_class *event_class); + +/*! @} */ + +/*! +@name Reference count +@{ +*/ + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the event class \bt_p{event_class}. + +@param[in] event_class + @parblock + Event class of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_event_class_put_ref() — + Decrements the reference count of an event class. +*/ +extern void bt_event_class_get_ref(const bt_event_class *event_class); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the event class \bt_p{event_class}. + +@param[in] event_class + @parblock + Event class of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_event_class_get_ref() — + Increments the reference count of an event class. +*/ +extern void bt_event_class_put_ref(const bt_event_class *event_class); + +/*! +@brief + Decrements the reference count of the event class + \bt_p{_event_class}, and then sets \bt_p{_event_class} to \c NULL. + +@param _event_class + @parblock + Event class of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_event_class} +*/ +#define BT_EVENT_CLASS_PUT_REF_AND_RESET(_event_class) \ + do { \ + bt_event_class_put_ref(_event_class); \ + (_event_class) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the event class \bt_p{_dst}, sets + \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} to \c NULL. + +This macro effectively moves an event class reference from the expression +\bt_p{_src} to the expression \bt_p{_dst}, putting the existing +\bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_EVENT_CLASS_MOVE_REF(_dst, _src) \ + do { \ + bt_event_class_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! @} */ + #ifdef __cplusplus } #endif diff --git a/include/babeltrace2/trace-ir/event-const.h b/include/babeltrace2/trace-ir/event-const.h deleted file mode 100644 index fec42ea0..00000000 --- a/include/babeltrace2/trace-ir/event-const.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef BABELTRACE2_TRACE_IR_EVENT_CONST_H -#define BABELTRACE2_TRACE_IR_EVENT_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern const bt_event_class *bt_event_borrow_class_const( - const bt_event *event); - -extern const bt_packet *bt_event_borrow_packet_const( - const bt_event *event); - -extern const bt_stream *bt_event_borrow_stream_const( - const bt_event *event); - -extern const bt_field *bt_event_borrow_common_context_field_const( - const bt_event *event); - -extern const bt_field *bt_event_borrow_specific_context_field_const( - const bt_event *event); - -extern const bt_field *bt_event_borrow_payload_field_const( - const bt_event *event); - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_TRACE_IR_EVENT_CONST_H */ diff --git a/include/babeltrace2/trace-ir/event.h b/include/babeltrace2/trace-ir/event.h index 12a27563..f1431844 100644 --- a/include/babeltrace2/trace-ir/event.h +++ b/include/babeltrace2/trace-ir/event.h @@ -33,19 +33,346 @@ extern "C" { #endif +/*! +@defgroup api-tir-ev Event +@ingroup api-tir + +@brief + Trace event. + +An event represents a trace event record. + +An event is an instance of an \bt_ev_cls: + +@image html trace-structure.png + +In the illustration above, notice that: + +- A \bt_stream is a conceptual \ref api-msg-seq "sequence of messages", + some of which are \bt_p_ev_msg. +- An event message contains an \bt_ev. +- An event is an instance of an event class. +- The \ref api-tir-ev-prop-payload "payload field" of an event is an + instance of the \ref api-tir-ev-cls-prop-p-fc "payload field class" + which an event class contains. + +Borrow the class of an event with bt_event_borrow_class() and +bt_event_borrow_class_const(). + +An event is a \ref api-tir "trace IR" data object. + +You cannot directly create an event: there's no +bt_event_create() function. The \bt_name library +creates an event within an \bt_ev_msg from an \bt_ev_cls. +Therefore, to fill the fields of an event, you must first +borrow the event from an event message with +bt_message_event_borrow_event(). + +An event is a \ref api-fund-unique-object "unique object": it belongs to +an \bt_ev_msg. + +Some library functions \ref api-fund-freezing "freeze" events on +success. The documentation of those functions indicate this +postcondition. + +The type of an event is #bt_event. + +An event conceptually belongs to a \bt_stream. Borrow the stream of an +event with bt_event_borrow_stream() and bt_event_borrow_stream_const(). + +If the event's stream's class +\ref api-tir-stream-cls-prop-supports-pkt "supports packets", +the event also belongs to a \bt_pkt. In that case, borrow the packet of +an event with bt_event_borrow_packet() and +bt_event_borrow_packet_const(). + +Because a stream or a packet could contain millions of events, there are +no actual links from a stream or from a packet to its events. + +

    Properties

    + +An event has the following properties: + +
    +
    \anchor api-tir-ev-prop-payload Payload field
    +
    + Event's payload \bt_field. + + The payload of an event contains its main trace data. + + The \ref api-tir-fc "class" of an event's payload field is set + at the event's \ref api-tir-ev-cls "class" level. See + bt_event_class_set_payload_field_class(), + bt_event_class_borrow_payload_field_class(), and + bt_event_class_borrow_payload_field_class_const(). + + Use bt_event_borrow_payload_field() and + bt_event_borrow_payload_field_const(). +
    + +
    \anchor api-tir-ev-prop-spec-ctx Specific context field
    +
    + Event's specific context \bt_field. + + The specific context of an event contains + any contextual data of which the layout is specific to the + event's \ref api-tir-ev-cls "class" and which does not belong to the + payload. + + The \ref api-tir-fc "class" of an event's specific context field is + set at the event's \ref api-tir-ev-cls "class" level. See + bt_event_class_set_specific_context_field_class() + bt_event_class_borrow_specific_context_field_class(), + and bt_event_class_borrow_specific_context_field_class_const() + + Use bt_event_borrow_specific_context_field() and + bt_event_borrow_specific_context_field_const(). +
    + +
    \anchor api-tir-ev-prop-common-ctx Common context field
    +
    + Event's common context \bt_field. + + The common context of an event contains contextual data of which the + layout is common to all the \bt_p_ev_cls of the + event's stream's \ref api-tir-stream-cls "class". + + The \ref api-tir-fc "class" of an event's common context field is set + at the event's \bt_stream_cls level. See + bt_stream_class_set_event_common_context_field_class() + bt_stream_class_borrow_event_common_context_field_class(), + and bt_stream_class_borrow_event_common_context_field_class_const(). + + Use bt_event_borrow_common_context_field() and + bt_event_borrow_common_context_field_const(). +
    +
    +*/ + +/*! @{ */ + +/*! +@name Type +@{ + +@typedef struct bt_event bt_event; + +@brief + Event. + +@} +*/ + +/*! +@name Class access +@{ +*/ + +/*! +@brief + Borrows the \ref api-tir-ev-cls "class" of the event \bt_p{event}. + +@param[in] event + Event of which to borrow the class. + +@returns + \em Borrowed reference of the class of \bt_p{event}. + +@bt_pre_not_null{event} + +@sa bt_event_borrow_class_const() — + \c const version of this function. +*/ extern bt_event_class *bt_event_borrow_class(bt_event *event); -extern bt_packet *bt_event_borrow_packet(bt_event *event); +/*! +@brief + Borrows the \ref api-tir-ev-cls "class" of the event \bt_p{event} + (\c const version). + +See bt_event_borrow_class(). +*/ +extern const bt_event_class *bt_event_borrow_class_const( + const bt_event *event); + +/*! @} */ + +/*! +@name Stream access +@{ +*/ + +/*! +@brief + Borrows the \bt_stream conceptually containing the event + \bt_p{event}. + +@param[in] event + Event of which to borrow the stream conceptually containing it. +@returns + \em Borrowed reference of the stream conceptually containing + \bt_p{event}. + +@bt_pre_not_null{event} + +@sa bt_event_borrow_stream_const() — + \c const version of this function. +*/ extern bt_stream *bt_event_borrow_stream(bt_event *event); -extern bt_field * -bt_event_borrow_common_context_field(bt_event *event); +/*! +@brief + Borrows the \bt_stream conceptually containing the event + \bt_p{event} (\c const version). + +See bt_event_borrow_stream(). +*/ +extern const bt_stream *bt_event_borrow_stream_const( + const bt_event *event); + +/*! @} */ + +/*! +@name Packet access +@{ +*/ + +/*! +@brief + Borrows the \bt_pkt conceptually containing the event + \bt_p{event}. + +@attention + Only call this function if bt_stream_class_supports_packets() + returns #BT_TRUE for the \bt_stream_cls of \bt_p{event}. + +@param[in] event + Event of which to borrow the packet conceptually containing it. + +@returns + \em Borrowed reference of the packet conceptually containing + \bt_p{event}. + +@bt_pre_not_null{event} + +@sa bt_event_borrow_packet_const() — + \c const version of this function. +*/ +extern bt_packet *bt_event_borrow_packet(bt_event *event); + +/*! +@brief + Borrows the \bt_pkt conceptually containing the event + \bt_p{event} (\c const version). + +See bt_event_borrow_packet(). +*/ +extern const bt_packet *bt_event_borrow_packet_const( + const bt_event *event); + +/*! @} */ + +/*! +@name Properties +@{ +*/ + +/*! +@brief + Borrows the payload \bt_field of the event \bt_p{event}. + +See the \ref api-tir-ev-prop-payload "payload field" property. + +@param[in] event + Event of which to borrow the payload field. + +@returns + \em Borrowed reference of the payload field of \bt_p{event}, + or \c NULL if none. + +@bt_pre_not_null{event} +@sa bt_event_borrow_payload_field_const() — + \c const version of this function. +*/ +extern bt_field *bt_event_borrow_payload_field(bt_event *event); + +/*! +@brief + Borrows the payload \bt_field of the event \bt_p{event} + (\c const version). + +See bt_event_borrow_payload_field(). +*/ +extern const bt_field *bt_event_borrow_payload_field_const( + const bt_event *event); + +/*! +@brief + Borrows the specific context \bt_field of the event \bt_p{event}. + +See the \ref api-tir-ev-prop-spec-ctx "specific context field" property. + +@param[in] event + Event of which to borrow the specific context field. + +@returns + \em Borrowed reference of the specific context field of + \bt_p{event}, or \c NULL if none. + +@bt_pre_not_null{event} + +@sa bt_event_borrow_specific_context_field_const() — + \c const version of this function. +*/ extern bt_field * bt_event_borrow_specific_context_field(bt_event *event); -extern bt_field *bt_event_borrow_payload_field(bt_event *event); +/*! +@brief + Borrows the specific context \bt_field of the event \bt_p{event} + (\c const version). + +See bt_event_borrow_specific_context_field(). +*/ +extern const bt_field *bt_event_borrow_specific_context_field_const( + const bt_event *event); + +/*! +@brief + Borrows the common context \bt_field of the event \bt_p{event}. + +See the \ref api-tir-ev-prop-common-ctx "common context field" property. + +@param[in] event + Event of which to borrow the common context field. + +@returns + \em Borrowed reference of the common context field of + \bt_p{event}, or \c NULL if none. + +@bt_pre_not_null{event} + +@sa bt_event_borrow_specific_context_field_const() — + \c const version of this function. +*/ +extern bt_field * +bt_event_borrow_common_context_field(bt_event *event); + +/*! +@brief + Borrows the common context \bt_field of the event \bt_p{event} + (\c const version). + +See bt_event_borrow_common_context_field(). +*/ +extern const bt_field *bt_event_borrow_common_context_field_const( + const bt_event *event); + +/*! @} */ + +/*! @} */ #ifdef __cplusplus } diff --git a/include/babeltrace2/trace-ir/field-class-const.h b/include/babeltrace2/trace-ir/field-class-const.h deleted file mode 100644 index 2a5c88d6..00000000 --- a/include/babeltrace2/trace-ir/field-class-const.h +++ /dev/null @@ -1,313 +0,0 @@ -#ifndef BABELTRACE2_TRACE_IR_FIELD_CLASS_CONST_H -#define BABELTRACE2_TRACE_IR_FIELD_CLASS_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum bt_field_class_type { - BT_FIELD_CLASS_TYPE_BOOL = 1ULL << 0, - BT_FIELD_CLASS_TYPE_BIT_ARRAY = 1ULL << 1, - BT_FIELD_CLASS_TYPE_INTEGER = 1ULL << 2, - BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER = (1ULL << 3) | BT_FIELD_CLASS_TYPE_INTEGER, - BT_FIELD_CLASS_TYPE_SIGNED_INTEGER = (1ULL << 4) | BT_FIELD_CLASS_TYPE_INTEGER, - BT_FIELD_CLASS_TYPE_ENUMERATION = 1ULL << 5, - BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION = BT_FIELD_CLASS_TYPE_ENUMERATION | BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER, - BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION = BT_FIELD_CLASS_TYPE_ENUMERATION | BT_FIELD_CLASS_TYPE_SIGNED_INTEGER, - BT_FIELD_CLASS_TYPE_REAL = 1ULL << 6, - BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL = (1ULL << 7) | BT_FIELD_CLASS_TYPE_REAL, - BT_FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL = (1ULL << 8) | BT_FIELD_CLASS_TYPE_REAL, - BT_FIELD_CLASS_TYPE_STRING = 1ULL << 9, - BT_FIELD_CLASS_TYPE_STRUCTURE = 1ULL << 10, - BT_FIELD_CLASS_TYPE_ARRAY = 1ULL << 11, - BT_FIELD_CLASS_TYPE_STATIC_ARRAY = (1ULL << 12) | BT_FIELD_CLASS_TYPE_ARRAY, - BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY = (1ULL << 13) | BT_FIELD_CLASS_TYPE_ARRAY, - BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD = (1ULL << 14) | BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY, - BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD = (1ULL << 15) | BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY, - BT_FIELD_CLASS_TYPE_OPTION = 1ULL << 16, - BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR_FIELD = (1ULL << 17) | BT_FIELD_CLASS_TYPE_OPTION, - BT_FIELD_CLASS_TYPE_OPTION_WITH_SELECTOR_FIELD = (1ULL << 18) | BT_FIELD_CLASS_TYPE_OPTION, - BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD = (1ULL << 19) | BT_FIELD_CLASS_TYPE_OPTION_WITH_SELECTOR_FIELD, - BT_FIELD_CLASS_TYPE_OPTION_WITH_INTEGER_SELECTOR_FIELD = (1ULL << 20) | BT_FIELD_CLASS_TYPE_OPTION_WITH_SELECTOR_FIELD, - BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD = (1ULL << 21) | BT_FIELD_CLASS_TYPE_OPTION_WITH_INTEGER_SELECTOR_FIELD, - BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR_FIELD = (1ULL << 22) | BT_FIELD_CLASS_TYPE_OPTION_WITH_INTEGER_SELECTOR_FIELD, - BT_FIELD_CLASS_TYPE_VARIANT = 1ULL << 23, - BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR_FIELD = (1ULL << 24) | BT_FIELD_CLASS_TYPE_VARIANT, - BT_FIELD_CLASS_TYPE_VARIANT_WITH_SELECTOR_FIELD = (1ULL << 25) | BT_FIELD_CLASS_TYPE_VARIANT, - BT_FIELD_CLASS_TYPE_VARIANT_WITH_INTEGER_SELECTOR_FIELD = (1ULL << 26) | BT_FIELD_CLASS_TYPE_VARIANT_WITH_SELECTOR_FIELD, - BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD = (1ULL << 27) | BT_FIELD_CLASS_TYPE_VARIANT_WITH_INTEGER_SELECTOR_FIELD, - BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD = (1ULL << 28) | BT_FIELD_CLASS_TYPE_VARIANT_WITH_INTEGER_SELECTOR_FIELD, - - /* - * Make sure the enumeration type is a 64-bit integer in case - * the project needs field class types in the future. - * - * This is not part of the API. - */ - __BT_FIELD_CLASS_TYPE_BIG_VALUE = 1ULL << 62, -} bt_field_class_type; - -typedef enum bt_field_class_integer_preferred_display_base { - BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_BINARY = 2, - BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_OCTAL = 8, - BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_DECIMAL = 10, - BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_HEXADECIMAL = 16, -} bt_field_class_integer_preferred_display_base; - -extern bt_field_class_type bt_field_class_get_type( - const bt_field_class *field_class); - -static inline -bt_bool bt_field_class_type_is(const bt_field_class_type type, - const bt_field_class_type type_to_check) -{ - return (type & type_to_check) == type_to_check; -} - -extern const bt_value *bt_field_class_borrow_user_attributes_const( - const bt_field_class *field_class); - -extern uint64_t bt_field_class_bit_array_get_length( - const bt_field_class *field_class); - -extern uint64_t bt_field_class_integer_get_field_value_range( - const bt_field_class *field_class); - -extern bt_field_class_integer_preferred_display_base -bt_field_class_integer_get_preferred_display_base( - const bt_field_class *field_class); - -extern uint64_t bt_field_class_enumeration_get_mapping_count( - const bt_field_class *field_class); - -extern const bt_field_class_enumeration_unsigned_mapping * -bt_field_class_enumeration_unsigned_borrow_mapping_by_index_const( - const bt_field_class *field_class, uint64_t index); - -extern const bt_field_class_enumeration_unsigned_mapping * -bt_field_class_enumeration_unsigned_borrow_mapping_by_label_const( - const bt_field_class *field_class, const char *label); - -extern const bt_field_class_enumeration_signed_mapping * -bt_field_class_enumeration_signed_borrow_mapping_by_index_const( - const bt_field_class *field_class, uint64_t index); - -extern const bt_field_class_enumeration_signed_mapping * -bt_field_class_enumeration_signed_borrow_mapping_by_label_const( - const bt_field_class *field_class, const char *label); - -static inline -const bt_field_class_enumeration_mapping * -bt_field_class_enumeration_unsigned_mapping_as_mapping_const( - const bt_field_class_enumeration_unsigned_mapping *mapping) -{ - return __BT_UPCAST_CONST(bt_field_class_enumeration_mapping, mapping); -} - -static inline -const bt_field_class_enumeration_mapping * -bt_field_class_enumeration_signed_mapping_as_mapping_const( - const bt_field_class_enumeration_signed_mapping *mapping) -{ - return __BT_UPCAST_CONST(bt_field_class_enumeration_mapping, mapping); -} - -extern const char *bt_field_class_enumeration_mapping_get_label( - const bt_field_class_enumeration_mapping *mapping); - -extern const bt_integer_range_set_unsigned * -bt_field_class_enumeration_unsigned_mapping_borrow_ranges_const( - const bt_field_class_enumeration_unsigned_mapping *mapping); - -extern const bt_integer_range_set_signed * -bt_field_class_enumeration_signed_mapping_borrow_ranges_const( - const bt_field_class_enumeration_signed_mapping *mapping); - -typedef enum bt_field_class_enumeration_get_mapping_labels_for_value_status { - BT_FIELD_CLASS_ENUMERATION_GET_MAPPING_LABELS_BY_VALUE_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, - BT_FIELD_CLASS_ENUMERATION_GET_MAPPING_LABELS_BY_VALUE_STATUS_OK = __BT_FUNC_STATUS_OK, -} bt_field_class_enumeration_get_mapping_labels_for_value_status; - -extern bt_field_class_enumeration_get_mapping_labels_for_value_status -bt_field_class_enumeration_unsigned_get_mapping_labels_for_value( - const bt_field_class *field_class, uint64_t value, - bt_field_class_enumeration_mapping_label_array *label_array, - uint64_t *count); - -extern bt_field_class_enumeration_get_mapping_labels_for_value_status -bt_field_class_enumeration_signed_get_mapping_labels_for_value( - const bt_field_class *field_class, int64_t value, - bt_field_class_enumeration_mapping_label_array *label_array, - uint64_t *count); - -extern uint64_t bt_field_class_structure_get_member_count( - const bt_field_class *field_class); - -extern const bt_field_class_structure_member * -bt_field_class_structure_borrow_member_by_index_const( - const bt_field_class *field_class, uint64_t index); - -extern const bt_field_class_structure_member * -bt_field_class_structure_borrow_member_by_name_const( - const bt_field_class *field_class, const char *name); - -extern const char *bt_field_class_structure_member_get_name( - const bt_field_class_structure_member *member); - -extern const bt_field_class * -bt_field_class_structure_member_borrow_field_class_const( - const bt_field_class_structure_member *member); - -extern const bt_value *bt_field_class_structure_member_borrow_user_attributes_const( - const bt_field_class_structure_member *member); - -extern const bt_field_class * -bt_field_class_array_borrow_element_field_class_const( - const bt_field_class *field_class); - -extern uint64_t bt_field_class_array_static_get_length( - const bt_field_class *field_class); - -extern const bt_field_path * -bt_field_class_array_dynamic_with_length_field_borrow_length_field_path_const( - const bt_field_class *field_class); - -extern const bt_field_class * -bt_field_class_option_borrow_field_class_const( - const bt_field_class *field_class); - -extern const bt_field_path * -bt_field_class_option_with_selector_field_borrow_selector_field_path_const( - const bt_field_class *field_class); - -extern bt_bool -bt_field_class_option_with_selector_field_bool_selector_is_reversed( - const bt_field_class *field_class); - -extern const bt_integer_range_set_unsigned * -bt_field_class_option_with_selector_field_integer_unsigned_borrow_selector_ranges_const( - const bt_field_class *field_class); - -extern const bt_integer_range_set_signed * -bt_field_class_option_with_selector_field_integer_signed_borrow_selector_ranges_const( - const bt_field_class *field_class); - -extern uint64_t bt_field_class_variant_get_option_count( - const bt_field_class *field_class); - -extern const bt_field_class_variant_option * -bt_field_class_variant_borrow_option_by_index_const( - const bt_field_class *field_class, uint64_t index); - -extern const bt_field_class_variant_option * -bt_field_class_variant_borrow_option_by_name_const( - const bt_field_class *field_class, const char *name); - -extern const bt_field_class_variant_with_selector_field_integer_unsigned_option * -bt_field_class_variant_with_selector_field_integer_unsigned_borrow_option_by_index_const( - const bt_field_class *field_class, uint64_t index); - -extern const bt_field_class_variant_with_selector_field_integer_unsigned_option * -bt_field_class_variant_with_selector_field_integer_unsigned_borrow_option_by_name_const( - const bt_field_class *field_class, const char *name); - -extern const bt_field_class_variant_with_selector_field_integer_signed_option * -bt_field_class_variant_with_selector_field_integer_signed_borrow_option_by_index_const( - const bt_field_class *field_class, uint64_t index); - -extern const bt_field_class_variant_with_selector_field_integer_signed_option * -bt_field_class_variant_with_selector_field_integer_signed_borrow_option_by_name_const( - const bt_field_class *field_class, const char *name); - -extern const char *bt_field_class_variant_option_get_name( - const bt_field_class_variant_option *option); - -extern const bt_field_class * -bt_field_class_variant_option_borrow_field_class_const( - const bt_field_class_variant_option *option); - -extern const bt_value *bt_field_class_variant_option_borrow_user_attributes_const( - const bt_field_class_variant_option *option); - -extern const bt_field_path * -bt_field_class_variant_with_selector_field_borrow_selector_field_path_const( - const bt_field_class *field_class); - -extern const bt_integer_range_set_unsigned * -bt_field_class_variant_with_selector_field_integer_unsigned_option_borrow_ranges_const( - const bt_field_class_variant_with_selector_field_integer_unsigned_option *option); - -static inline -const bt_field_class_variant_option * -bt_field_class_variant_with_selector_field_integer_unsigned_option_as_option_const( - const bt_field_class_variant_with_selector_field_integer_unsigned_option *option) -{ - return __BT_UPCAST_CONST(bt_field_class_variant_option, option); -} - -extern const bt_integer_range_set_signed * -bt_field_class_variant_with_selector_field_integer_signed_option_borrow_ranges_const( - const bt_field_class_variant_with_selector_field_integer_signed_option *option); - -static inline -const bt_field_class_variant_option * -bt_field_class_variant_with_selector_field_integer_signed_option_as_option_const( - const bt_field_class_variant_with_selector_field_integer_signed_option *option) -{ - return __BT_UPCAST_CONST(bt_field_class_variant_option, option); -} - -extern void bt_field_class_get_ref(const bt_field_class *field_class); - -extern void bt_field_class_put_ref(const bt_field_class *field_class); - -#define BT_FIELD_CLASS_PUT_REF_AND_RESET(_var) \ - do { \ - bt_field_class_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_FIELD_CLASS_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_field_class_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_TRACE_IR_FIELD_CLASS_CONST_H */ diff --git a/include/babeltrace2/trace-ir/field-class.h b/include/babeltrace2/trace-ir/field-class.h index e8be1c51..0aab9682 100644 --- a/include/babeltrace2/trace-ir/field-class.h +++ b/include/babeltrace2/trace-ir/field-class.h @@ -31,188 +31,4590 @@ #include #include -#include #ifdef __cplusplus extern "C" { #endif +/*! +@defgroup api-tir-fc Field classes +@ingroup api-tir + +@brief + Classes of \bt_p_field. + +Field classes are the classes of \bt_p_field: + +@image html field-class-zoom.png + +Field classes are \ref api-tir "trace IR" metadata objects. + +There are many types of field classes. They can be divided into two main +categories: + +
    +
    Scalar
    +
    + Classes of fields which contain a simple value. + + The scalar field classes are: + + - \ref api-tir-fc-bool "Boolean" + - \ref api-tir-fc-ba "Bit array" + - \ref api-tir-fc-int "Integer" (unsigned and signed) + - \ref api-tir-fc-enum "Enumeration" (unsigned and signed) + - \ref api-tir-fc-real "Real" (single-precision and double-precision) + - \ref api-tir-fc-string "String" +
    + +
    Container
    +
    + Classes of fields which contain other fields. + + The container field classes are: + + - \ref api-tir-fc-array "Array" (static and dynamic) + - \ref api-tir-fc-struct "Structure" + - \ref api-tir-fc-opt "Option" + - \ref api-tir-fc-var "Variant" +
    +
    + +@image html fc-to-field.png "Fields (green) are instances of field classes (orange)." + +Some field classes conceptually inherit other field classes, eventually +making an inheritance hierarchy. For example, a \bt_sarray_fc +\em is an array field class. Therefore, a static array field class has +any property that an array field class has. + +The complete field class inheritance hierarchy is: + +@image html all-field-classes.png + +In the illustration above: + +- You can create any field class with a dark background with + a dedicated bt_field_class_*_create() function. + +- A field class with a pale background is an \em abstract field class: + you cannot create it, but it has properties, therefore there are + functions which apply to it. + + For example, bt_field_class_integer_set_preferred_display_base() + applies to any \bt_int_fc. + +Field classes are \ref api-fund-shared-object "shared objects": get a +new reference with bt_field_class_get_ref() and put an existing +reference with bt_field_class_put_ref(). + +Some library functions \ref api-fund-freezing "freeze" field classes on +success. The documentation of those functions indicate this +postcondition. + +All the field class types share the same C type, #bt_field_class. + +Get the type enumerator of a field class with bt_field_class_get_type(). +Get whether or not a field class type conceptually \em is a given type +with the inline bt_field_class_type_is() function. + +The following table shows the available type enumerators and creation +functions for each type of \em concrete (non-abstract) field class: + + + + + + + + + + + + + + + + + + + + + + + +
    Name + Type enumerator + Creation function +
    \ref api-tir-fc-bool "Boolean" + #BT_FIELD_CLASS_TYPE_BOOL + bt_field_class_bool_create() +
    \ref api-tir-fc-ba "Bit array" + #BT_FIELD_CLASS_TYPE_BIT_ARRAY + bt_field_class_bit_array_create() +
    Unsigned \ref api-tir-fc-int "integer" + #BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER + bt_field_class_integer_unsigned_create() +
    Signed \ref api-tir-fc-int "integer" + #BT_FIELD_CLASS_TYPE_SIGNED_INTEGER + bt_field_class_integer_signed_create() +
    Unsigned \ref api-tir-fc-enum "enumeration" + #BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION + bt_field_class_enumeration_unsigned_create() +
    Signed \ref api-tir-fc-enum "enumeration" + #BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION + bt_field_class_enumeration_signed_create() +
    Single-precision \ref api-tir-fc-real "real" + #BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL + bt_field_class_real_single_precision_create() +
    Double-precision \ref api-tir-fc-real "real" + #BT_FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL + bt_field_class_real_double_precision_create() +
    \ref api-tir-fc-string "String" + #BT_FIELD_CLASS_TYPE_STRING + bt_field_class_string_create() +
    Static \ref api-tir-fc-array "array" + #BT_FIELD_CLASS_TYPE_STATIC_ARRAY + bt_field_class_array_static_create() +
    Dynamic \ref api-tir-fc-array "array" (no length field) + #BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD + bt_field_class_array_dynamic_create() +
    Dynamic \ref api-tir-fc-array "array" (with length field) + #BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD + bt_field_class_array_dynamic_create() +
    \ref api-tir-fc-struct "Structure" + #BT_FIELD_CLASS_TYPE_STRUCTURE + bt_field_class_structure_create() +
    \ref api-tir-fc-opt "Option" (no selector field) + #BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR_FIELD + bt_field_class_option_without_selector_create() +
    \ref api-tir-fc-opt "Option" (boolean selector field) + #BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD + bt_field_class_option_with_selector_field_bool_create() +
    \ref api-tir-fc-opt "Option" (unsigned integer selector field) + #BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD + bt_field_class_option_with_selector_field_integer_unsigned_create() +
    \ref api-tir-fc-opt "Option" (signed integer selector field) + #BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR_FIELD + bt_field_class_option_with_selector_field_integer_signed_create() +
    \ref api-tir-fc-var "Variant" (no selector field) + #BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR_FIELD + bt_field_class_variant_create() +
    \ref api-tir-fc-var "Variant" (unsigned integer selector field) + #BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD + bt_field_class_variant_create() +
    \ref api-tir-fc-var "Variant" (signed integer selector field) + #BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD + bt_field_class_variant_create() +
    + +You need a \bt_trace_cls to create a field class: create one from a +\bt_self_comp with bt_trace_class_create(). + +Outside the field class API, you can use field classes at four +locations, called scopes, within the trace IR API: + +- To set the packet context field class of a \bt_stream_cls with + bt_stream_class_set_packet_context_field_class(). + +- To set the event common context field class of a stream class with + bt_stream_class_set_event_common_context_field_class(). + +- To set the specific context field class of an \bt_ev_cls with + bt_event_class_set_specific_context_field_class(). + +- To set the payload field class of an event class with + bt_event_class_set_payload_field_class(). + +When you call one of the four functions above: + +- The passed field class must be a \bt_struct_fc. + +- You must \em not have already called any of the four functions above + with the passed field class or with any of its contained field + classes. + +- If any of the field classes recursively contained in the passed + field class has a \ref api-tir-fc-link "link to another field class", + it must honor the field class link rules. + +Once you have called one of the four functions above, the passed field +class becomes \ref api-fund-freezing "frozen". + +

    Common field class property

    + +A field class has the following common property: + +
    +
    + \anchor api-tir-fc-prop-user-attrs + \bt_dt_opt User attributes +
    +
    + User attributes of the field class. + + User attributes are custom attributes attached to a field class. + + Use bt_field_class_set_user_attributes(), + bt_field_class_borrow_user_attributes(), and + bt_field_class_borrow_user_attributes_const(). +
    +
    + +

    \anchor api-tir-fc-bool Boolean field class

    + +@image html fc-bool.png + +A boolean field class is the class +of \bt_p_bool_field. + +A boolean field contains a boolean value (#BT_TRUE or #BT_FALSE). + +Create a boolean field class with bt_field_class_bool_create(). + +A boolean field class has no specific properties. + +

    \anchor api-tir-fc-ba Bit array field class

    + +@image html fc-ba.png + +A bit array field class is the class +of \bt_p_ba_field. + +A bit array field contains a fixed-length array of bits. + +Create a bit array field class with bt_field_class_bit_array_create(). + +A bit array field class has the following property: + +
    +
    + \anchor api-tir-fc-ba-prop-len + Length +
    +
    + Number of bits contained in the instances (bit array fields) of + the bit array field class. + + As of \bt_name_version_min_maj, the maximum length of a bit array + field is 64. + + You cannot change the length once the bit array field class is + created. + + Get a bit array field class's length with + bt_field_class_bit_array_get_length(). +
    +
    + +

    \anchor api-tir-fc-int Integer field classes

    + +@image html fc-int.png + +Integer field classes are classes +of \bt_p_int_field. + +Integer fields contain integral values. + +An integer field class is an \em abstract field class: you cannot create +one. The concrete integer field classes are: + +
    +
    Unsigned integer field class
    +
    + Its instances (unsigned integer fields) contain an unsigned integral + value (\c uint64_t). + + Create with bt_field_class_integer_unsigned_create(). +
    + +
    Signed integer field class
    +
    + Its instances (signed integer fields) contain a signed integral + value (\c int64_t). + + Create with bt_field_class_integer_signed_create(). +
    +
    + +Integer field classes have the following common properties: + +
    +
    + \anchor api-tir-fc-int-prop-size + Field value range +
    +
    + Expected range of values that the instances (integer fields) + of the integer field class can contain. + + For example, if the field value range of an unsigned integer + field class is [0, 16383], then its unsigned integer fields + can only contain the values from 0 to 16383. + + \bt_cp_sink_comp can benefit from this property to make some space + optimizations when writing trace data. + + Use bt_field_class_integer_set_field_value_range() and + bt_field_class_integer_get_field_value_range(). +
    + +
    + \anchor api-tir-fc-int-prop-base + Preferred display base +
    +
    + Preferred base (2, 8, 10, or 16) to use when displaying the + instances (integer fields) of the integer field class. + + Use bt_field_class_integer_set_preferred_display_base() and + bt_field_class_integer_get_preferred_display_base(). +
    +
    + +

    \anchor api-tir-fc-enum Enumeration field classes

    + +@image html fc-enum.png + +Enumeration field classes are classes +of \bt_p_enum_field. + +Enumeration field classes \em are \bt_p_int_fc: they have the integer +field classes properties. + +Enumeration fields \em are integer fields: they contain integral values. + +Enumeration field classes associate labels (strings) to specific +ranges of integral values. This association is called an enumeration +field class mapping. + +For example, if an enumeration field class maps the label \c SUGAR to +the integer ranges [1, 19] and [25, 31], then an instance +(enumeration field) of this field class with the value 15 or 28 has the +label SUGAR. + +An enumeration field class is an \em abstract field class: you cannot +create one. The concrete enumeration field classes are: + +
    +
    Unsigned enumeration field class
    +
    + Its instances (unsigned enumeration fields) contain an unsigned + value (\c uint64_t). + + Create with bt_field_class_enumeration_unsigned_create(). +
    + +
    Signed enumeration field class
    +
    + Its instances (signed enumeration fields) contain a signed value + (\c int64_t). + + Create with bt_field_class_enumeration_signed_create(). +
    +
    + +Enumeration field classes have the following common property: + +
    +
    + \anchor api-tir-fc-enum-prop-mappings + Mappings +
    +
    + Set of mappings of the enumeration field class. + + An enumeration field class mapping is a label (string) and an + \bt_int_rs. + + The integer ranges of a given mapping or of multiple mappings of + the same enumeration field class can overlap. For example, + an enumeration field class can have those two mappings: + + - CALORIES: [1, 11], [15, 37] + - SODIUM: [7, 13] + + In that case, the values 2 and 30 correpond to the label + CALORIES, the value 12 to the label + SODIUM, and the value 10 to the labels + \c CALORIES \em and SODIUM. + + Two mappings of the same enumeration field class cannot have the + same label. + + Add a mapping to an enumeration field class with + bt_field_class_enumeration_unsigned_add_mapping() or + bt_field_class_enumeration_signed_add_mapping(). + + Get the number of mappings in an enumeration field class with + bt_field_class_enumeration_get_mapping_count(). + + Borrow a mapping from an enumeration field class with + bt_field_class_enumeration_unsigned_borrow_mapping_by_index_const(), + bt_field_class_enumeration_signed_borrow_mapping_by_index_const(), + bt_field_class_enumeration_unsigned_borrow_mapping_by_label_const(), + and + bt_field_class_enumeration_signed_borrow_mapping_by_label_const(). + + An enumeration field class mapping is a + \ref api-fund-unique-object "unique object": it + belongs to the enumeration field class which contains it. + + There are two enumeration field class mapping types, depending on + the field class's type: + #bt_field_class_enumeration_unsigned_mapping and + #bt_field_class_enumeration_signed_mapping. + + There is also the #bt_field_class_enumeration_mapping type for + common properties and operations (for example, + bt_field_class_enumeration_mapping_get_label()). + \ref api-fund-c-typing "Upcast" a specific enumeration field class + mapping to the #bt_field_class_enumeration_mapping type with + bt_field_class_enumeration_unsigned_mapping_as_mapping_const() or + bt_field_class_enumeration_signed_mapping_as_mapping_const(). + + Get all the enumeration field class labels mapped to a given integer + value with + bt_field_class_enumeration_unsigned_get_mapping_labels_for_value() + and + bt_field_class_enumeration_signed_get_mapping_labels_for_value(). +
    +
    + +

    \anchor api-tir-fc-real Real field classes

    + +@image html fc-real.png + +Real field classes are classes +of \bt_p_real_field. + +Real fields contain +real +values (\c float or \c double types). + +A real field class is an \em abstract field class: you cannot create +one. The concrete real field classes are: + +
    +
    Single-precision real field class
    +
    + Its instances (single-precision real fields) contain a \c float + value. + + Create with bt_field_class_real_single_precision_create(). +
    + +
    Double-precision real field class
    +
    + Its instances (double-precision real fields) contain a \c double + value. + + Create with bt_field_class_real_double_precision_create(). +
    +
    + +Real field classes have no specific properties. + +

    \anchor api-tir-fc-string String field class

    + +@image html fc-string.png + +A string field class is the class +of \bt_p_string_field. + +A string field contains an UTF-8 string value. + +Create a string field class with bt_field_class_string_create(). + +A string field class has no specific properties. + +

    \anchor api-tir-fc-array Array field classes

    + +@image html fc-array.png + +Array field classes are classes +of \bt_p_array_field. + +Array fields contain zero or more fields which have the same class. + +An array field class is an \em abstract field class: you cannot create +one. The concrete array field classes are: + +
    +
    Static array field class
    +
    + Its instances (static array fields) contain a fixed number of + fields. + + Create with bt_field_class_array_static_create(). + + A static array field class has the following specific property: + +
    +
    + \anchor api-tir-fc-sarray-prop-len + Length +
    +
    + Number of fields contained in the instances (static array + fields) of the static array field class. + + You cannot change the length once the static array field class + is created. + + Get a static array field class's length with + bt_field_class_array_static_get_length(). +
    +
    +
    + +
    Dynamic array field class
    +
    + Its instances (dynamic array fields) contain a variable number array + of fields. + + There are two types of dynamic array field classes: without or + with a length field. See + \ref api-tir-fc-link "Field classes with links to other field classes" + to learn more. + + @image html darray-link.png "Dynamic array field class with a length field." + + Create with bt_field_class_array_dynamic_create(). + + A dynamic array field class with a length field has the + specific property: + +
    +
    + \anchor api-tir-fc-darray-prop-len-fp + Length field path +
    +
    + Field path of the linked length field class. + + Get a dynamic array field class's length field path with + bt_field_class_array_dynamic_with_length_field_borrow_length_field_path_const(). +
    +
    +
    +
    + +Array field classes have the following common property: + +
    +
    + \anchor api-tir-fc-array-prop-elem-fc + Element field class +
    +
    + Class of the fields contained in the instances (array fields) of the + array field class. + + You cannot change the element field class once the array field class + is created. + + Borrow an array field class's element field class with + Use bt_field_class_array_borrow_element_field_class() and + bt_field_class_array_borrow_element_field_class_const(). +
    +
    + +

    \anchor api-tir-fc-struct Structure field class

    + +@image html fc-struct.png + +A structure field class is the class +of a \bt_struct_field. + +A structure field contains an ordered list of zero or more members. Each +structure field member is the instance of a structure field class +member. A structure field class member has a name, a field class, +and user attributes. + +Create a structure field class with bt_field_class_structure_create(). + +A structure field class has the following specific property: + +
    +
    + \anchor api-tir-fc-struct-prop-members + Members +
    +
    + Ordered list of members (zero or more) of the structure field class. + + Each member has: + + - A name, unique amongst all the member names of the same + structure field class. + - A field class. + - User attributes. + + The instances (structure fields) of a structure field class have + members which are instances of the corresponding structure field + class members. + + Append a member to a structure field class with + bt_field_class_structure_append_member(). + + Borrow a member from a structure field class with + bt_field_class_structure_borrow_member_by_index(), + bt_field_class_structure_borrow_member_by_name(), + bt_field_class_structure_borrow_member_by_index_const(), and + bt_field_class_structure_borrow_member_by_name_const(). + + A structure field class member is a + \ref api-fund-unique-object "unique object": it + belongs to the structure field class which contains it. + + The type of a structure field class member is + #bt_field_class_structure_member. + + Get a structure field class member's name with + bt_field_class_structure_member_get_name(). + + Borrow a structure field class member's field class with + bt_field_class_structure_member_borrow_field_class() and + bt_field_class_structure_member_borrow_field_class_const(). + + Set a structure field class member's user attributes with + bt_field_class_structure_member_set_user_attributes(). + + Borrow a structure field class member's user attributes with + bt_field_class_structure_member_borrow_user_attributes() and + bt_field_class_structure_member_borrow_user_attributes_const(). +
    +
    + +

    \anchor api-tir-fc-opt Option field classes

    + +@image html fc-opt.png + +Option field classes are classes +of \bt_p_opt_field. + +An option field either does or doesn't contain a field, called its +optional field. + +An option field class is an \em abstract field class: you cannot create +one. An option field class either has a selector field (it's linked to a +selector field class; see +\ref api-tir-fc-link "Field classes with links to other field classes") +or none. Therefore, the concrete option field classes are: + +
    +
    Option field class without a selector field
    +
    + Create with bt_field_class_option_without_selector_create(). + + An option field class without a selector field has no specific + properties. +
    + +
    Option field class with a boolean selector field
    +
    + The linked selector field of an option field class's instance + (an option field) is a \bt_bool_field. + + Consequently, the option field class's selector field class is + a \bt_bool_fc. + + @image html opt-link.png "Option field class with a boolean selector field." + + Create with bt_field_class_option_with_selector_field_bool_create(). + + An option field class with a boolean selector field has the + following specific property: + +
    +
    + \anchor api-tir-fc-opt-prop-sel-rev + Selector is reversed? +
    +
    + Whether or not the linked boolean selector field makes the + option field class's instance (an option field) contain a field + when it's #BT_TRUE or when it's #BT_FALSE. + + If this property is #BT_TRUE, then if the linked selector field + has the value #BT_FALSE, the option field contains a field. + + Use + bt_field_class_option_with_selector_field_bool_set_selector_is_reversed() + and + bt_field_class_option_with_selector_field_bool_selector_is_reversed(). +
    +
    +
    + +
    Option field class with an unsigned selector field
    +
    + The linked selector field of an option field class's instance + (an option field) is an \bt_uint_field. + + Consequently, the option field class's selector field class is + an \bt_uint_fc. + + Create with + bt_field_class_option_with_selector_field_integer_unsigned_create(). + + Pass an \bt_uint_rs on creation to set which values of the selector + field can make the option field contain a field. + + An option field class with an unsigned integer selector field has + the following specific property: + +
    +
    + \anchor api-tir-fc-opt-prop-uint-rs + Selector's unsigned integer ranges +
    +
    + If the linked unsigned integer selector field of an option + field class's instance (an option field) has a value which + intersects with the selector's unsigned integer ranges, then + the option field contains a field. + + You cannot change the selector's unsigned integer ranges once + the option field class is created. + + Borrow the selector's unsigned integer ranges from an + option field class with an unsigned integer selector field with + bt_field_class_option_with_selector_field_integer_unsigned_borrow_selector_ranges_const(). +
    +
    +
    + +
    Option field class with a signed selector field
    +
    + The linked selector field of an option field class's instance + (an option field) is a \bt_sint_field. + + Consequently, the option field class's selector field class is + a \bt_sint_fc. + + Create with + bt_field_class_option_with_selector_field_integer_signed_create(). + + Pass a \bt_sint_rs on creation to set which values of the selector + field can make the option field contain a field. + + An option field class with a signed integer selector field has + the following specific property: + +
    +
    + \anchor api-tir-fc-opt-prop-sint-rs + Selector's signed integer ranges +
    +
    + If the linked signed integer selector field of an option + field class's instance (an option field) has a value which + intersects with the selector's signed integer ranges, then + the option field contains a field. + + You cannot change the selector's signed integer ranges once + the option field class is created. + + Borrow the selector's signed integer ranges from an + option field class with a signed integer selector field with + bt_field_class_option_with_selector_field_integer_signed_borrow_selector_ranges_const(). +
    +
    +
    +
    + +Option field classes with a selector have the following common +property: + +
    +
    + \anchor api-tir-fc-opt-prop-sel-fp + Selector field path +
    +
    + Field path of the linked selector field class. + + Borrow such an option field class's selector field path with + bt_field_class_option_with_selector_field_borrow_selector_field_path_const(). +
    +
    + +Option field classes have the following common property: + +
    +
    + \anchor api-tir-fc-opt-prop-fc + Optional field class +
    +
    + Class of the optional field of an instance (option field) of the + option field class. + + You cannot change the optional field class once the option field + class is created. + + Borrow an option field class's optional field class with + Use bt_field_class_option_borrow_field_class() and + bt_field_class_option_borrow_field_class_const(). +
    +
    + +

    \anchor api-tir-fc-var Variant field classes

    + +@image html fc-var.png + +Variant field classes are classes +of \bt_p_var_field. + +A variant field contains a field amongst one or more possible fields. + +Variant field classes contain one or more options. Each variant field +class option has a name, a field class, user attributes, and integer +ranges, depending on the exact type. + +A variant field class is an \em abstract field class: you cannot create +one. A variant field class either has a selector field (it's linked to a +selector field class; see +\ref api-tir-fc-link "Field classes with links to other field classes") +or none. Therefore, the concrete variant field classes are: + +
    +
    Variant field class without a selector field
    +
    + Create with bt_field_class_variant_create(), passing \c NULL as + the selector field class. + + Append an option to such a variant field class with + bt_field_class_variant_without_selector_append_option(). + + A variant field class without a selector field has no specific + properties. +
    + +
    Variant field class with an unsigned selector field
    +
    + The linked selector field of a variant field class's instance + (a variant field) is an \bt_uint_field. + + Consequently, the variant field class's selector field class is + an \bt_uint_fc. + + @image html var-link.png "Variant field class with an unsigned integer selector field." + + Create with bt_field_class_variant_create(), passing an + unsigned integer field class as the selector field class. + + Append an option to such a variant field class with + bt_field_class_variant_with_selector_field_integer_unsigned_append_option(). + + Pass an \bt_uint_rs when you append an option to set which values of + the selector field can make the variant field have a given + current option. + + Borrow such a variant field class's option with + bt_field_class_variant_with_selector_field_integer_unsigned_borrow_option_by_index_const() + and + bt_field_class_variant_with_selector_field_integer_unsigned_borrow_option_by_name_const(). +
    + +
    Variant field class with a signed selector field
    +
    + The linked selector field of a variant field class's instance + (a variant field) is a \bt_sint_field. + + Consequently, the variant field class's selector field class is + a \bt_sint_fc. + + Create with bt_field_class_variant_create(), passing a + signed integer field class as the selector field class. + + Append an option to such a variant field class with + bt_field_class_variant_with_selector_field_integer_signed_append_option(). + + Pass a \bt_sint_rs when you append an option to set which values of + the selector field can make the variant field have a given + current option. + + Borrow such a variant field class's option with + bt_field_class_variant_with_selector_field_integer_signed_borrow_option_by_index_const() + and + bt_field_class_variant_with_selector_field_integer_signed_borrow_option_by_name_const(). +
    +
    + +Variant field classes with a selector have the following common +property: + +
    +
    + \anchor api-tir-fc-var-prop-sel-fp + Selector field path +
    +
    + Field path of the linked selector field class. + + Borrow such a variant field class's selector field path with + bt_field_class_variant_with_selector_field_borrow_selector_field_path_const(). +
    +
    + +Variant field classes have the following common property: + +
    +
    + \anchor api-tir-fc-var-prop-opts + Options +
    +
    + Options of the variant field class. + + Each option has: + + - A name, unique amongst all the option names of the same + variant field class. + - A field class. + - User attributes. + + If the variant field class is linked to a selector field class, then + each option also has an \bt_int_rs. In that case, the ranges of a + given option cannot overlap any range of any other option. + + A variant field class must contain at least one option. + + Depending on whether or not the variant field class has a selector + field class, append an option to a variant field class + with bt_field_class_variant_without_selector_append_option(), + bt_field_class_variant_with_selector_field_integer_unsigned_append_option(), + or + bt_field_class_variant_with_selector_field_integer_signed_append_option(). + + Get the number of options contained in a variant field class + with bt_field_class_variant_get_option_count(). + + A variant field class option is a + \ref api-fund-unique-object "unique object": it + belongs to the variant field class which contains it. + + Borrow any variant field class's option with + bt_field_class_variant_borrow_option_by_index(), + bt_field_class_variant_borrow_option_by_name(), + bt_field_class_variant_borrow_option_by_index_const(), and + bt_field_class_variant_borrow_option_by_name_const(). + + Those functions return the common #bt_field_class_variant_option + type. Get the name of a variant field class option with + bt_field_class_variant_option_get_name(). Borrow a variant field + class option's field class with + bt_field_class_variant_option_borrow_field_class() and + bt_field_class_variant_option_borrow_field_class_const(). + + Borrow the option of a variant field classes with a selector field + class with + bt_field_class_variant_with_selector_field_integer_unsigned_borrow_option_by_index_const(), + bt_field_class_variant_with_selector_field_integer_unsigned_borrow_option_by_name_const(), + bt_field_class_variant_with_selector_field_integer_signed_borrow_option_by_index_const(), or + bt_field_class_variant_with_selector_field_integer_signed_borrow_option_by_name_const(), + depending on the selector field class's type. + + Those functions return the + #bt_field_class_variant_with_selector_field_integer_unsigned_option or + #bt_field_class_variant_with_selector_field_integer_signed_option type. + \ref api-fund-c-typing "Upcast" those types to the + #bt_field_class_variant_option type with + bt_field_class_variant_with_selector_field_integer_unsigned_option_as_option_const() + or + bt_field_class_variant_with_selector_field_integer_signed_option_as_option_const(). + + Borrow the option's ranges from a variant field class with a + selector field class with + bt_field_class_variant_with_selector_field_integer_unsigned_option_borrow_ranges_const() + or + bt_field_class_variant_with_selector_field_integer_signed_option_borrow_ranges_const(). + + Set a variant field class option's user attributes with + bt_field_class_variant_option_set_user_attributes(). + + Borrow a variant field class option's user attributes with + bt_field_class_variant_option_borrow_user_attributes() and + bt_field_class_variant_option_borrow_user_attributes_const(). +
    +
    + +

    \anchor api-tir-fc-link Field classes with links to other field classes

    + +\bt_cp_darray_fc, \bt_p_opt_fc, and \bt_p_var_fc \em can have links to +other, preceding field classes. + +When a field class A has a link to another field class B, then +an instance (\bt_field) of A has a link to an instance of B. + +This feature exists so that the linked field can contain the value of a +dynamic property of the field. Those properties are: + +
    +
    \bt_c_darray_field
    +
    + The linked field, a \bt_uint_field, contains the \b length of the + dynamic array field. +
    + +
    \bt_c_opt_field
    +
    + The linked field, either a \bt_bool_field or an \bt_int_field, + indicates whether or not the option field has a field. +
    + +
    \bt_c_var_field
    +
    + The linked field, an \bt_int_field, indicates the variant field's + current selected field. +
    +
    + +Having a linked field class is optional: you always set the +field properties with a dedicated function anyway. For example, even if +a dynamic array field is linked to a preceding length field, you must +still set its length with bt_field_array_dynamic_set_length(). In that +case, the value of the length field must match what you pass to +bt_field_array_dynamic_set_length(). + +The purpose of this feature is to eventually save space when a +\bt_sink_comp writes trace files: if the trace format can convey that +a preceding, existing field represents the length of a dynamic array +field, then the sink component doesn't need to write the dynamic array +field's length twice. This is the case of the +Common Trace Format, for +example. + +@image html darray-link.png "A dynamic array field class linked to an unsigned integer field class." + +To link a field class A to a preceding field class B, pass +field class B when you create field class A. For example, pass +the \bt_uint_fc to bt_field_class_array_dynamic_create() to create a +\bt_darray_fc with a length field. + +When you call bt_stream_class_set_packet_context_field_class(), +bt_stream_class_set_event_common_context_field_class(), +bt_event_class_set_specific_context_field_class(), or +bt_event_class_set_payload_field_class() with a field class containing +a field class A with a linked field class B, the path to +B becomes available in A. The functions to borrow this field path are: + +- bt_field_class_array_dynamic_with_length_field_borrow_length_field_path_const() +- bt_field_class_option_with_selector_field_borrow_selector_field_path_const() +- bt_field_class_variant_with_selector_field_borrow_selector_field_path_const() + +A field path indicates how to reach a linked field from a given +root scope. The available scopes are: + +
    +
    #BT_FIELD_PATH_SCOPE_PACKET_CONTEXT
    +
    + Packet context field. + + See bt_packet_borrow_context_field_const(). +
    + +
    #BT_FIELD_PATH_SCOPE_EVENT_COMMON_CONTEXT
    +
    + Event common context field. + + See bt_event_borrow_common_context_field_const(). +
    + +
    #BT_FIELD_PATH_SCOPE_EVENT_SPECIFIC_CONTEXT
    +
    + Event specific context field. + + See bt_event_borrow_specific_context_field_const(). +
    + +
    #BT_FIELD_PATH_SCOPE_EVENT_PAYLOAD
    +
    + Event payload field. + + See bt_event_borrow_payload_field_const(). +
    +
    + +The rules regarding field class A vs. field class B (linked +field class) are: + +- If A is within a packet context field class, B must also be in the + same packet context field class. + + See bt_stream_class_set_packet_context_field_class(). + +- If A is within a event common context field class, B must be in one + of: + + - The same event common context field class. + - The packet context field class of the same \bt_stream_cls. + + See bt_stream_class_set_event_common_context_field_class(). + +- If A is within an event specific context field class, B must be in + one of: + + - The same event specific context field class. + - The event common context field class of the same stream class. + - The packet context field class of the same stream class. + + See bt_event_class_set_specific_context_field_class(). + +- If A is within an event payload field class, B must be in one of: + + - The same event payload field class. + - The event specific context field class of the same \bt_ev_cls. + - The event common context field class of the same stream class. + - The packet context field class of the same stream class. + + See bt_event_class_set_payload_field_class(). + +- If both A and B are in the same scope, then: + + - The lowest common ancestor field class of A and B must be a + \bt_struct_fc. + + - B must precede A. + + Considering that the members of a structure field class are ordered, + then B must be part of a member that's before the member which + contains A in their lowest common ancestor structure field class. + + - The path from the lowest common ancestor structure field class of A + and B to A and to B must only contain structure field classes. + +- If A is in a different scope than B, the path from the root scope of B + to B must only contain structure field classes. +*/ + +/*! @{ */ + +/*! +@name Type +@{ + +@typedef struct bt_field_class bt_field_class; + +@brief + Field class. + +@} +*/ + +/*! +@name Type query +@{ +*/ + +/*! +@brief + Field class type enumerators. +*/ +typedef enum bt_field_class_type { + /*! + @brief + \bt_c_bool_fc. + */ + BT_FIELD_CLASS_TYPE_BOOL = 1ULL << 0, + + /*! + @brief + \bt_c_ba_fc. + */ + BT_FIELD_CLASS_TYPE_BIT_ARRAY = 1ULL << 1, + + /*! + @brief + \bt_c_int_fc. + + No field class has this type: use it with + bt_field_class_type_is(). + */ + BT_FIELD_CLASS_TYPE_INTEGER = 1ULL << 2, + + /*! + @brief + \bt_c_uint_fc. + + This type conceptually inherits #BT_FIELD_CLASS_TYPE_INTEGER. + */ + BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER = (1ULL << 3) | BT_FIELD_CLASS_TYPE_INTEGER, + + /*! + @brief + \bt_c_sint_fc. + + This type conceptually inherits #BT_FIELD_CLASS_TYPE_INTEGER. + */ + BT_FIELD_CLASS_TYPE_SIGNED_INTEGER = (1ULL << 4) | BT_FIELD_CLASS_TYPE_INTEGER, + + /*! + @brief + \bt_c_enum_fc. + + This type conceptually inherits #BT_FIELD_CLASS_TYPE_INTEGER. + + No field class has this type: use it with + bt_field_class_type_is(). + */ + BT_FIELD_CLASS_TYPE_ENUMERATION = 1ULL << 5, + + /*! + @brief + \bt_c_uenum_fc. + + This type conceptually inherits #BT_FIELD_CLASS_TYPE_ENUMERATION + and #BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER. + */ + BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION = BT_FIELD_CLASS_TYPE_ENUMERATION | BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER, + + /*! + @brief + \bt_c_senum_fc. + + This type conceptually inherits #BT_FIELD_CLASS_TYPE_ENUMERATION + and #BT_FIELD_CLASS_TYPE_SIGNED_INTEGER. + */ + BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION = BT_FIELD_CLASS_TYPE_ENUMERATION | BT_FIELD_CLASS_TYPE_SIGNED_INTEGER, + + /*! + @brief + \bt_c_real_fc. + + No field class has this type: use it with + bt_field_class_type_is(). + */ + BT_FIELD_CLASS_TYPE_REAL = 1ULL << 6, + + /*! + @brief + Single-precision \bt_real_fc. + + This type conceptually inherits #BT_FIELD_CLASS_TYPE_REAL. + */ + BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL = (1ULL << 7) | BT_FIELD_CLASS_TYPE_REAL, + + /*! + @brief + Double-precision \bt_real_fc. + + This type conceptually inherits #BT_FIELD_CLASS_TYPE_REAL. + */ + BT_FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL = (1ULL << 8) | BT_FIELD_CLASS_TYPE_REAL, + + /*! + @brief + \bt_c_string_fc.. + */ + BT_FIELD_CLASS_TYPE_STRING = 1ULL << 9, + + /*! + @brief + \bt_c_struct_fc. + */ + BT_FIELD_CLASS_TYPE_STRUCTURE = 1ULL << 10, + + /*! + @brief + \bt_c_array_fc. + + No field class has this type: use it with + bt_field_class_type_is(). + */ + BT_FIELD_CLASS_TYPE_ARRAY = 1ULL << 11, + + /*! + @brief + \bt_c_sarray_fc. + + This type conceptually inherits #BT_FIELD_CLASS_TYPE_ARRAY. + */ + BT_FIELD_CLASS_TYPE_STATIC_ARRAY = (1ULL << 12) | BT_FIELD_CLASS_TYPE_ARRAY, + + /*! + @brief + \bt_c_darray_fc. + + This type conceptually inherits #BT_FIELD_CLASS_TYPE_ARRAY. + + No field class has this type: use it with + bt_field_class_type_is(). + */ + BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY = (1ULL << 13) | BT_FIELD_CLASS_TYPE_ARRAY, + + /*! + @brief + \bt_c_darray_fc (without a length field). + + This type conceptually inherits + #BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY. + */ + BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD = (1ULL << 14) | BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY, + + /*! + @brief + \bt_c_darray_fc (with a length field). + + This type conceptually inherits + #BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY. + */ + BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD = (1ULL << 15) | BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY, + + /*! + @brief + \bt_c_opt_fc. + + No field class has this type: use it with + bt_field_class_type_is(). + */ + BT_FIELD_CLASS_TYPE_OPTION = 1ULL << 16, + + /*! + @brief + \bt_c_opt_fc (without a selector field). + */ + BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR_FIELD = (1ULL << 17) | BT_FIELD_CLASS_TYPE_OPTION, + + /*! + @brief + \bt_c_opt_fc (with a selector field). + + This type conceptually inherits #BT_FIELD_CLASS_TYPE_OPTION. + + No field class has this type: use it with + bt_field_class_type_is(). + */ + BT_FIELD_CLASS_TYPE_OPTION_WITH_SELECTOR_FIELD = (1ULL << 18) | BT_FIELD_CLASS_TYPE_OPTION, + + /*! + @brief + \bt_c_opt_fc (with a boolean selector field). + + This type conceptually inherits + #BT_FIELD_CLASS_TYPE_OPTION_WITH_SELECTOR_FIELD. + */ + BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD = (1ULL << 19) | BT_FIELD_CLASS_TYPE_OPTION_WITH_SELECTOR_FIELD, + + /*! + @brief + \bt_c_opt_fc (with an integer selector field). + + This type conceptually inherits + #BT_FIELD_CLASS_TYPE_OPTION_WITH_SELECTOR_FIELD. + + No field class has this type: use it with + bt_field_class_type_is(). + */ + BT_FIELD_CLASS_TYPE_OPTION_WITH_INTEGER_SELECTOR_FIELD = (1ULL << 20) | BT_FIELD_CLASS_TYPE_OPTION_WITH_SELECTOR_FIELD, + + /*! + @brief + \bt_c_opt_fc (with an unsigned integer selector field). + + This type conceptually inherits + #BT_FIELD_CLASS_TYPE_OPTION_WITH_INTEGER_SELECTOR_FIELD. + */ + BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD = (1ULL << 21) | BT_FIELD_CLASS_TYPE_OPTION_WITH_INTEGER_SELECTOR_FIELD, + + /*! + @brief + \bt_c_opt_fc (with a signed integer selector field). + + This type conceptually inherits + #BT_FIELD_CLASS_TYPE_OPTION_WITH_INTEGER_SELECTOR_FIELD. + */ + BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR_FIELD = (1ULL << 22) | BT_FIELD_CLASS_TYPE_OPTION_WITH_INTEGER_SELECTOR_FIELD, + + /*! + @brief + \bt_c_var_fc. + + No field class has this type: use it with + bt_field_class_type_is(). + */ + BT_FIELD_CLASS_TYPE_VARIANT = 1ULL << 23, + + /*! + @brief + \bt_c_var_fc (without a selector field). + */ + BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR_FIELD = (1ULL << 24) | BT_FIELD_CLASS_TYPE_VARIANT, + + /*! + @brief + \bt_c_var_fc (with a selector field). + + This type conceptually inherits + #BT_FIELD_CLASS_TYPE_VARIANT. + + No field class has this type: use it with + bt_field_class_type_is(). + */ + BT_FIELD_CLASS_TYPE_VARIANT_WITH_SELECTOR_FIELD = (1ULL << 25) | BT_FIELD_CLASS_TYPE_VARIANT, + + /*! + @brief + \bt_c_var_fc (with an integer selector field). + + This type conceptually inherits + #BT_FIELD_CLASS_TYPE_VARIANT_WITH_SELECTOR_FIELD. + + No field class has this type: use it with + bt_field_class_type_is(). + */ + BT_FIELD_CLASS_TYPE_VARIANT_WITH_INTEGER_SELECTOR_FIELD = (1ULL << 26) | BT_FIELD_CLASS_TYPE_VARIANT_WITH_SELECTOR_FIELD, + + /*! + @brief + \bt_c_opt_fc (with an unsigned integer selector field). + + This type conceptually inherits + #BT_FIELD_CLASS_TYPE_VARIANT_WITH_INTEGER_SELECTOR_FIELD. + */ + BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD = (1ULL << 27) | BT_FIELD_CLASS_TYPE_VARIANT_WITH_INTEGER_SELECTOR_FIELD, + + /*! + @brief + \bt_c_opt_fc (with a signed integer selector field). + + This type conceptually inherits + #BT_FIELD_CLASS_TYPE_VARIANT_WITH_INTEGER_SELECTOR_FIELD. + */ + BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD = (1ULL << 28) | BT_FIELD_CLASS_TYPE_VARIANT_WITH_INTEGER_SELECTOR_FIELD, + + /* + * Make sure the enumeration type is a 64-bit integer in case + * the project needs field class types in the future. + * + * This is not part of the API. + */ + __BT_FIELD_CLASS_TYPE_BIG_VALUE = 1ULL << 62, +} bt_field_class_type; + +/*! +@brief + Returns the type enumerator of the field class \bt_p{field_class}. + +@param[in] field_class + Field class of which to get the type enumerator + +@returns + Type enumerator of \bt_p{field_class}. + +@bt_pre_not_null{field_class} + +@sa bt_field_class_type_is() — + Returns whether or not the type of a field class conceptually is a + given type. +*/ +extern bt_field_class_type bt_field_class_get_type( + const bt_field_class *field_class); + +/*! +@brief + Returns whether or not the field class type \bt_p{type} conceptually + \em is the field class type \bt_p{other_type}. + +For example, an \bt_uint_fc conceptually \em is an integer field class, +so + +@code +bt_field_class_type_is(BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER, BT_FIELD_CLASS_TYPE_INTEGER) +@endcode + +returns #BT_TRUE. + +@param[in] type + Field class type to check against \bt_p{other_type}. +@param[in] other_type + Field class type against which to check \bt_p{type}. + +@returns + #BT_TRUE if \bt_p{type} conceptually \em is \bt_p{other_type}. + +@sa bt_field_class_get_type() — + Returns the type enumerator of a field class. +*/ +static inline +bt_bool bt_field_class_type_is(const bt_field_class_type type, + const bt_field_class_type other_type) +{ + return (type & other_type) == other_type; +} + +/*! @} */ + +/*! +@name Common property +@{ +*/ + +/*! +@brief + Sets the user attributes of the field class \bt_p{field_class} to + \bt_p{user_attributes}. + +See the \ref api-tir-fc-prop-user-attrs "user attributes" property. + +@note + When you create a field class with one of the + bt_field_class_*_create() functions, the field class's + initial user attributes is an empty \bt_map_val. Therefore you can + borrow it with bt_field_class_borrow_user_attributes() and fill it + directly instead of setting a new one with this function. + +@param[in] field_class + Field class of which to set the user attributes to + \bt_p{user_attributes}. +@param[in] user_attributes + New user attributes of \bt_p{field_class}. + +@bt_pre_not_null{field_class} +@bt_pre_hot{field_class} +@bt_pre_not_null{user_attributes} +@bt_pre_is_map_val{user_attributes} + +@sa bt_field_class_borrow_user_attributes() — + Borrows the user attributes of a field class. +*/ extern void bt_field_class_set_user_attributes( bt_field_class *field_class, const bt_value *user_attributes); -extern bt_value *bt_field_class_borrow_user_attributes( - bt_field_class *field_class); +/*! +@brief + Borrows the user attributes of the field class \bt_p{field_class}. + +See the \ref api-tir-fc-prop-user-attrs "user attributes" property. + +@note + When you create a field class with one of the + bt_field_class_*_create() functions, the field class's + initial user attributes is an empty \bt_map_val. + +@param[in] field_class + Field class from which to borrow the user attributes. + +@returns + User attributes of \bt_p{field_class} (a \bt_map_val). + +@bt_pre_not_null{field_class} + +@sa bt_field_class_set_user_attributes() — + Sets the user attributes of a field class. +@sa bt_field_class_borrow_user_attributes_const() — + \c const version of this function. +*/ +extern bt_value *bt_field_class_borrow_user_attributes( + bt_field_class *field_class); + +/*! +@brief + Borrows the user attributes of the field class \bt_p{field_class} + (\c const version). + +See bt_field_class_borrow_user_attributes(). +*/ +extern const bt_value *bt_field_class_borrow_user_attributes_const( + const bt_field_class *field_class); + +/*! @} */ + +/*! +@name Boolean field class +@{ +*/ + +/*! +@brief + Creates a \bt_bool_fc from the trace class \bt_p{trace_class}. + +On success, the returned boolean field class has the following +property value: + + + + +
    Property + Value +
    \ref api-tir-fc-prop-user-attrs "User attributes" + Empty \bt_map_val +
    + +@param[in] trace_class + Trace class from which to create a boolean field class. + +@returns + New boolean field class reference, or \c NULL on memory error. + +@bt_pre_not_null{trace_class} +*/ +extern bt_field_class *bt_field_class_bool_create( + bt_trace_class *trace_class); + +/*! +@} +*/ + +/*! +@name Bit array field class +@{ +*/ + +/*! +@brief + Creates a \bt_ba_fc with the length \bt_p{length} from the trace + class \bt_p{trace_class}. + +On success, the returned bit array field class has the following +property values: + + + + + +
    Property + Value +
    \ref api-tir-fc-ba-prop-len "Length" + \bt_p{length} +
    \ref api-tir-fc-prop-user-attrs "User attributes" + Empty \bt_map_val +
    + +@param[in] trace_class + Trace class from which to create a bit array field class. +@param[in] length + Length (number of bits) of the instances of the bit array field + class to create. + +@returns + New bit array field class reference, or \c NULL on memory error. + +@bt_pre_not_null{trace_class} +@pre + 0 < \bt_p{length} ≤ 64. +*/ +extern bt_field_class *bt_field_class_bit_array_create( + bt_trace_class *trace_class, uint64_t length); + +/*! +@brief + Returns the length of the \bt_ba_fc \bt_p{field_class}. + +See the \ref api-tir-fc-ba-prop-len "length" property. + +@param[in] field_class + Bit array field class of which to get the length. + +@returns + Length of \bt_p{field_class}. + +@bt_pre_not_null{field_class} +@bt_pre_is_ba_fc{field_class} +*/ +extern uint64_t bt_field_class_bit_array_get_length( + const bt_field_class *field_class); + +/*! +@} +*/ + +/*! +@name Integer field class +@{ +*/ + +/*! +@brief + Sets the field value range of the \bt_int_fc \bt_p{field_class} + to \bt_p{n}. + +See the \ref api-tir-fc-int-prop-size "field value range" property. + +@param[in] field_class + Integer field class of which to set the field value range to + \bt_p{n}. +@param[in] n + @parblock + \em N in: + +
    +
    Unsigned integer field class
    +
    [0, 2N - 1]
    + +
    Signed integer field class
    +
    [-2N, 2N - 1]
    +
    + @endparblock + +@bt_pre_not_null{field_class} +@bt_pre_hot{field_class} +@bt_pre_is_int_fc{field_class} +@pre + \bt_p{n} ⩽ 64. + +@sa bt_field_class_integer_get_field_value_range() — + Returns the field value range of an integer field class. +*/ +extern void bt_field_class_integer_set_field_value_range( + bt_field_class *field_class, uint64_t n); + +/*! +@brief + Returns the field value range of the \bt_int_fc \bt_p{field_class}. + +See the \ref api-tir-fc-int-prop-size "field value range" property. + +@param[in] field_class + Integer field class of which to get the field value range. + +@returns + @parblock + Field value range of \bt_p{field_class}, that is, \em N in: + +
    +
    Unsigned integer field class
    +
    [0, 2N - 1]
    + +
    Signed integer field class
    +
    [-2N, 2N - 1]
    +
    + @endparblock + +@bt_pre_not_null{field_class} +@bt_pre_is_int_fc{field_class} + +@sa bt_field_class_integer_set_field_value_range() — + Sets the field value range of an integer field class. +*/ +extern uint64_t bt_field_class_integer_get_field_value_range( + const bt_field_class *field_class); + +/*! +@brief + Integer field class preferred display bases. +*/ +typedef enum bt_field_class_integer_preferred_display_base { + /*! + @brief + Binary (2). + */ + BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_BINARY = 2, + + /*! + @brief + Octal (8). + */ + BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_OCTAL = 8, + + /*! + @brief + Decimal (10). + */ + BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_DECIMAL = 10, + + /*! + @brief + Hexadecimal (16). + */ + BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_HEXADECIMAL = 16, +} bt_field_class_integer_preferred_display_base; + +/*! +@brief + Sets the preferred display base of the \bt_int_fc \bt_p{field_class} + to \bt_p{preferred_display_base}. + +See the \ref api-tir-fc-int-prop-base "preferred display base" property. + +@param[in] field_class + Integer field class of which to set the preferred display base to + \bt_p{preferred_display_base}. +@param[in] preferred_display_base + New preferred display base of \bt_p{field_class}. + +@bt_pre_not_null{field_class} +@bt_pre_hot{field_class} +@bt_pre_is_int_fc{field_class} + +@sa bt_field_class_integer_get_preferred_display_base() — + Returns the preferred display base of an integer field class. +*/ +extern void bt_field_class_integer_set_preferred_display_base( + bt_field_class *field_class, + bt_field_class_integer_preferred_display_base preferred_display_base); + +/*! +@brief + Returns the preferred display base of the \bt_int_fc + \bt_p{field_class}. + +See the \ref api-tir-fc-int-prop-base "preferred display base" property. + +@param[in] field_class + Integer field class of which to get the preferred display base. + +@retval #BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_BINARY + 2 (binary) +@retval #BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_OCTAL + 8 (octal) +@retval #BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_DECIMAL + 10 (decimal) +@retval #BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_HEXADECIMAL + 16 (hexadecimal) + +@bt_pre_not_null{field_class} +@bt_pre_is_int_fc{field_class} + +@sa bt_field_class_integer_set_preferred_display_base() — + Sets the preferred display base of an integer field class. +*/ +extern bt_field_class_integer_preferred_display_base +bt_field_class_integer_get_preferred_display_base( + const bt_field_class *field_class); + +/*! @} */ + +/*! +@name Unsigned integer field class +@{ +*/ + +/*! +@brief + Creates an \bt_uint_fc from the trace class \bt_p{trace_class}. + +On success, the returned unsigned integer field class has the following +property values: + + + + + + +
    Property + Value +
    \ref api-tir-fc-int-prop-size "Field value range" + [0, 264 - 1] +
    \ref api-tir-fc-int-prop-base "Preferred display base" + #BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_DECIMAL +
    \ref api-tir-fc-prop-user-attrs "User attributes" + Empty \bt_map_val +
    + +@param[in] trace_class + Trace class from which to create an unsigned integer field class. + +@returns + New unsigned integer field class reference, or \c NULL on memory error. + +@bt_pre_not_null{trace_class} +*/ +extern bt_field_class *bt_field_class_integer_unsigned_create( + bt_trace_class *trace_class); + +/*! @} */ + +/*! +@name Signed integer field class +@{ +*/ + +/*! +@brief + Creates an \bt_sint_fc from the trace class \bt_p{trace_class}. + +On success, the returned signed integer field class has the following +property values: + + + + + + +
    Property + Value +
    \ref api-tir-fc-int-prop-size "Field value range" + [-263, 263 - 1] +
    \ref api-tir-fc-int-prop-base "Preferred display base" + #BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_DECIMAL +
    \ref api-tir-fc-prop-user-attrs "User attributes" + Empty \bt_map_val +
    + +@param[in] trace_class + Trace class from which to create a signed integer field class. + +@returns + New signed integer field class reference, or \c NULL on memory error. + +@bt_pre_not_null{trace_class} +*/ +extern bt_field_class *bt_field_class_integer_signed_create( + bt_trace_class *trace_class); + +/*! @} */ + +/*! +@name Single-precision real field class +@{ +*/ + +/*! +@brief + Creates a single-precision \bt_real_fc from the trace class + \bt_p{trace_class}. + +On success, the returned single-precision real field class has the +following property value: + + + + +
    Property + Value +
    \ref api-tir-fc-prop-user-attrs "User attributes" + Empty \bt_map_val +
    + +@param[in] trace_class + Trace class from which to create a single-preicision real + field class. + +@returns + New single-precision real field class reference, or \c NULL on + memory error. + +@bt_pre_not_null{trace_class} +*/ +extern bt_field_class *bt_field_class_real_single_precision_create( + bt_trace_class *trace_class); + +/*! @} */ + +/*! +@name Double-precision real field class +@{ +*/ + +/*! +@brief + Creates a double-precision \bt_real_fc from the trace class + \bt_p{trace_class}. + +On success, the returned double-precision real field class has the +following property value: + + + + +
    Property + Value +
    \ref api-tir-fc-prop-user-attrs "User attributes" + Empty \bt_map_val +
    + +@param[in] trace_class + Trace class from which to create a double-preicision real + field class. + +@returns + New double-precision real field class reference, or \c NULL on + memory error. + +@bt_pre_not_null{trace_class} +*/ +extern bt_field_class *bt_field_class_real_double_precision_create( + bt_trace_class *trace_class); + +/*! @} */ + +/*! +@name Enumeration field class +@{ +*/ + +/*! +@brief + Array of \c const \bt_enum_fc labels. + +Returned by bt_field_class_enumeration_unsigned_get_mapping_labels_for_value() +and bt_field_class_enumeration_signed_get_mapping_labels_for_value(). +*/ +typedef char const * const *bt_field_class_enumeration_mapping_label_array; + +/*! +@brief + Status codes for + bt_field_class_enumeration_unsigned_get_mapping_labels_for_value() + and + bt_field_class_enumeration_signed_get_mapping_labels_for_value(). +*/ +typedef enum bt_field_class_enumeration_get_mapping_labels_for_value_status { + /*! + @brief + Success. + */ + BT_FIELD_CLASS_ENUMERATION_GET_MAPPING_LABELS_BY_VALUE_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_FIELD_CLASS_ENUMERATION_GET_MAPPING_LABELS_BY_VALUE_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, +} bt_field_class_enumeration_get_mapping_labels_for_value_status; + +/*! +@brief + Status codes for bt_field_class_enumeration_unsigned_add_mapping() + and bt_field_class_enumeration_signed_add_mapping(). +*/ +typedef enum bt_field_class_enumeration_add_mapping_status { + /*! + @brief + Success. + */ + BT_FIELD_CLASS_ENUMERATION_ADD_MAPPING_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_FIELD_CLASS_ENUMERATION_ADD_MAPPING_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, +} bt_field_class_enumeration_add_mapping_status; + +/*! @} */ + +/*! +@name Enumeration field class mapping +@{ +*/ + +/*! +@typedef struct bt_field_class_enumeration_mapping bt_field_class_enumeration_mapping; + +@brief + Enumeration field class mapping. +*/ + +/*! +@brief + Returns the number of mappings contained in the \bt_enum_fc + \bt_p{field_class}. + +See the \ref api-tir-fc-enum-prop-mappings "mappings" property. + +@param[in] field_class + Enumeration field class of which to get the number of contained + mappings. + +@returns + Number of contained mappings in \bt_p{field_class}. + +@bt_pre_not_null{field_class} +@bt_pre_is_enum_fc{field_class} +*/ +extern uint64_t bt_field_class_enumeration_get_mapping_count( + const bt_field_class *field_class); + +/*! +@brief + Returns the label of the \bt_enum_fc mapping \bt_p{mapping}. + +See the \ref api-tir-fc-enum-prop-mappings "mappings" property. + +@param[in] mapping + Enumeration field class mapping of which to get the label. + +@returns + @parblock + Label of \bt_p{mapping}. + + The returned pointer remains valid as long as \bt_p{mapping} exists. + @endparblock + +@bt_pre_not_null{mapping} +*/ +extern const char *bt_field_class_enumeration_mapping_get_label( + const bt_field_class_enumeration_mapping *mapping); + +/*! @} */ + +/*! +@name Unsigned enumeration field class +@{ +*/ + +/*! +@brief + Creates an \bt_uenum_fc from the trace class \bt_p{trace_class}. + +On success, the returned unsigned enumeration field class has the +following property values: + + + + + + + +
    Property + Value +
    \ref api-tir-fc-int-prop-size "Field value range" + [0, 264 - 1] +
    \ref api-tir-fc-int-prop-base "Preferred display base" + #BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_DECIMAL +
    \ref api-tir-fc-enum-prop-mappings "Mappings" + \em None +
    \ref api-tir-fc-prop-user-attrs "User attributes" + Empty \bt_map_val +
    + +@param[in] trace_class + Trace class from which to create an unsigned enumeration field + class. + +@returns + New unsigned enumeration field class reference, or \c NULL on memory + error. + +@bt_pre_not_null{trace_class} +*/ +extern bt_field_class *bt_field_class_enumeration_unsigned_create( + bt_trace_class *trace_class); + +/*! +@brief + Adds a mapping to the \bt_uenum_fc \bt_p{field_class} having the + label \bt_p{label} and the unsigned integer ranges \bt_p{ranges}. + +See the \ref api-tir-fc-enum-prop-mappings "mappings" property. + +@param[in] field_class + Unsigned enumeration field class to which to add a mapping having + the label \bt_p{label} and the integer ranges \bt_p{ranges}. +@param[in] label + Label of the mapping to add to \bt_p{field_class} (copied). +@param[in] ranges + Unsigned integer ranges of the mapping to add to + \bt_p{field_class}. + +@retval #BT_FIELD_CLASS_ENUMERATION_ADD_MAPPING_STATUS_OK + Success. +@retval #BT_FIELD_CLASS_ENUMERATION_ADD_MAPPING_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{field_class} +@bt_pre_hot{field_class} +@bt_pre_is_uenum_fc{field_class} +@bt_pre_not_null{label} +@pre + \bt_p{field_class} has no mapping with the label \bt_p{label}. +@bt_pre_not_null{ranges} +@pre + \bt_p{ranges} contains one or more unsigned integer ranges. +*/ +extern bt_field_class_enumeration_add_mapping_status +bt_field_class_enumeration_unsigned_add_mapping( + bt_field_class *field_class, const char *label, + const bt_integer_range_set_unsigned *ranges); + +/*! +@brief + Borrows the mapping at index \bt_p{index} from the + \bt_uenum_fc \bt_p{field_class}. + +See the \ref api-tir-fc-enum-prop-mappings "mappings" property. + +@param[in] field_class + Unsigned enumeration field class from which to borrow the mapping at + index \bt_p{index}. +@param[in] index + Index of the mapping to borrow from \bt_p{field_class}. + +@returns + @parblock + \em Borrowed reference of the mapping of + \bt_p{field_class} at index \bt_p{index}. + + The returned pointer remains valid as long as \bt_p{field_class} + is not modified. + @endparblock + +@bt_pre_not_null{field_class} +@bt_pre_is_uenum_fc{field_class} +@pre + \bt_p{index} is less than the number of mappings in + \bt_p{field_class} (as returned by + bt_field_class_enumeration_get_mapping_count()). + +@sa bt_field_class_enumeration_get_mapping_count() — + Returns the number of mappings contained in an + enumeration field class. +*/ +extern const bt_field_class_enumeration_unsigned_mapping * +bt_field_class_enumeration_unsigned_borrow_mapping_by_index_const( + const bt_field_class *field_class, uint64_t index); + +/*! +@brief + Borrows the mapping having the label \bt_p{label} from the + \bt_uenum_fc \bt_p{field_class}. + +See the \ref api-tir-fc-enum-prop-mappings "mappings" property. + +If there's no mapping having the label \bt_p{label} in +\bt_p{field_class}, this function returns \c NULL. + +@param[in] field_class + Unsigned enumeration field class from which to borrow the mapping + having the label \bt_p{label}. +@param[in] label + Label of the mapping to borrow from \bt_p{field_class}. + +@returns + @parblock + \em Borrowed reference of the mapping of + \bt_p{field_class} having the label \bt_p{label}, or \c NULL + if none. + + The returned pointer remains valid as long as \bt_p{field_class} + is not modified. + @endparblock + +@bt_pre_not_null{field_class} +@bt_pre_is_uenum_fc{field_class} +@bt_pre_not_null{label} +*/ +extern const bt_field_class_enumeration_unsigned_mapping * +bt_field_class_enumeration_unsigned_borrow_mapping_by_label_const( + const bt_field_class *field_class, const char *label); + +/*! +@brief + Returns an array of all the labels of the mappings of the + \bt_uenum_fc \bt_p{field_class} of which the \bt_p_uint_rg contain + the integral value \bt_p{value}. + +See the \ref api-tir-fc-enum-prop-mappings "mappings" property. + +This function sets \bt_p{*labels} to the resulting array and +\bt_p{*count} to the number of labels in \bt_p{*labels}. + +On success, if there's no mapping ranges containing the value +\bt_p{value}, \bt_p{*count} is 0. + +@param[in] field_class + Unsigned enumeration field class from which to get the labels of the + mappings of which the ranges contain \bt_p{value}. +@param[in] value + Value for which to get the mapped labels in \bt_p{field_class}. +@param[out] labels + @parblock + On success, \bt_p{*labels} + is an array of labels of the mappings of \bt_p{field_class} + containing \bt_p{value}. + + The number of labels in \bt_p{*labels} is \bt_p{*count}. + + The array is owned by \bt_p{field_class} and remains valid as long + as \bt_p{field_class} is not modified. + @endparblock +@param[out] count + On success, \bt_p{*count} is the number of labels + in \bt_p{*labels} (can be 0). + +@retval #BT_FIELD_CLASS_ENUMERATION_GET_MAPPING_LABELS_BY_VALUE_STATUS_OK + Success. +@retval #BT_FIELD_CLASS_ENUMERATION_GET_MAPPING_LABELS_BY_VALUE_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{field_class} +@bt_pre_is_uenum_fc{field_class} +@bt_pre_not_null{labels} +@bt_pre_not_null{count} +*/ +extern bt_field_class_enumeration_get_mapping_labels_for_value_status +bt_field_class_enumeration_unsigned_get_mapping_labels_for_value( + const bt_field_class *field_class, uint64_t value, + bt_field_class_enumeration_mapping_label_array *labels, + uint64_t *count); + +/*! @} */ + +/*! +@name Unsigned enumeration field class mapping +@{ +*/ + +/*! +@typedef struct bt_field_class_enumeration_unsigned_mapping bt_field_class_enumeration_unsigned_mapping; + +@brief + Unsigned enumeration field class mapping. +*/ + +/*! +@brief + Borrows the \bt_p_uint_rg from the \bt_uenum_fc mapping + \bt_p{mapping}. + +See the \ref api-tir-fc-enum-prop-mappings "mappings" property. + +@param[in] mapping + Unsigned enumeration field class mapping from which to borrow the + unsigned integer ranges. + +@returns + Unsigned integer ranges of \bt_p{mapping}. + +@bt_pre_not_null{mapping} +*/ +extern const bt_integer_range_set_unsigned * +bt_field_class_enumeration_unsigned_mapping_borrow_ranges_const( + const bt_field_class_enumeration_unsigned_mapping *mapping); + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the \bt_uenum_fc mapping + \bt_p{mapping} to the common #bt_field_class_enumeration_mapping + type. + +See the \ref api-tir-fc-enum-prop-mappings "mappings" property. + +@param[in] mapping + @parblock + Unsigned enumeration field class mapping to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{mapping} as a common enumeration field class mapping. +*/ +static inline +const bt_field_class_enumeration_mapping * +bt_field_class_enumeration_unsigned_mapping_as_mapping_const( + const bt_field_class_enumeration_unsigned_mapping *mapping) +{ + return __BT_UPCAST_CONST(bt_field_class_enumeration_mapping, mapping); +} + +/*! @} */ + +/*! +@name Signed enumeration field class +@{ +*/ + +/*! +@brief + Creates a \bt_senum_fc from the trace class \bt_p{trace_class}. + +On success, the returned signed enumeration field class has the +following property values: + + + + + + + +
    Property + Value +
    \ref api-tir-fc-int-prop-size "Field value range" + [-263, 263 - 1] +
    \ref api-tir-fc-int-prop-base "Preferred display base" + #BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_DECIMAL +
    \ref api-tir-fc-enum-prop-mappings "Mappings" + \em None +
    \ref api-tir-fc-prop-user-attrs "User attributes" + Empty \bt_map_val +
    + +@param[in] trace_class + Trace class from which to create a signed enumeration field + class. + +@returns + New signed enumeration field class reference, or \c NULL on memory + error. + +@bt_pre_not_null{trace_class} +*/ +extern bt_field_class *bt_field_class_enumeration_signed_create( + bt_trace_class *trace_class); + +/*! +@brief + Adds a mapping to the \bt_senum_fc \bt_p{field_class} having the + label \bt_p{label} and the \bt_p_sint_rg \bt_p{ranges}. + +See the \ref api-tir-fc-enum-prop-mappings "mappings" property. + +@param[in] field_class + Signed enumeration field class to which to add a mapping having + the label \bt_p{label} and the integer ranges \bt_p{ranges}. +@param[in] label + Label of the mapping to add to \bt_p{field_class} (copied). +@param[in] ranges + Signed integer ranges of the mapping to add to + \bt_p{field_class}. + +@retval #BT_FIELD_CLASS_ENUMERATION_ADD_MAPPING_STATUS_OK + Success. +@retval #BT_FIELD_CLASS_ENUMERATION_ADD_MAPPING_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{field_class} +@bt_pre_hot{field_class} +@bt_pre_is_senum_fc{field_class} +@bt_pre_not_null{label} +@pre + \bt_p{field_class} has no mapping with the label \bt_p{label}. +@bt_pre_not_null{ranges} +@pre + \bt_p{ranges} contains one or more signed integer ranges. +*/ +extern bt_field_class_enumeration_add_mapping_status +bt_field_class_enumeration_signed_add_mapping( + bt_field_class *field_class, const char *label, + const bt_integer_range_set_signed *ranges); + +/*! +@brief + Borrows the mapping at index \bt_p{index} from the + \bt_senum_fc \bt_p{field_class}. + +See the \ref api-tir-fc-enum-prop-mappings "mappings" property. + +@param[in] field_class + Signed enumeration field class from which to borrow the mapping at + index \bt_p{index}. +@param[in] index + Index of the mapping to borrow from \bt_p{field_class}. + +@returns + @parblock + \em Borrowed reference of the mapping of + \bt_p{field_class} at index \bt_p{index}. + + The returned pointer remains valid as long as \bt_p{field_class} + is not modified. + @endparblock + +@bt_pre_not_null{field_class} +@bt_pre_is_senum_fc{field_class} +@pre + \bt_p{index} is less than the number of mappings in + \bt_p{field_class} (as returned by + bt_field_class_enumeration_get_mapping_count()). + +@sa bt_field_class_enumeration_get_mapping_count() — + Returns the number of mappings contained in an + enumeration field class. +*/ +extern const bt_field_class_enumeration_signed_mapping * +bt_field_class_enumeration_signed_borrow_mapping_by_index_const( + const bt_field_class *field_class, uint64_t index); + +/*! +@brief + Borrows the mapping having the label \bt_p{label} from the + \bt_senum_fc \bt_p{field_class}. + +See the \ref api-tir-fc-enum-prop-mappings "mappings" property. + +If there's no mapping having the label \bt_p{label} in +\bt_p{field_class}, this function returns \c NULL. + +@param[in] field_class + Signed enumeration field class from which to borrow the mapping + having the label \bt_p{label}. +@param[in] label + Label of the mapping to borrow from \bt_p{field_class}. + +@returns + @parblock + \em Borrowed reference of the mapping of + \bt_p{field_class} having the label \bt_p{label}, or \c NULL + if none. + + The returned pointer remains valid as long as \bt_p{field_class} + is not modified. + @endparblock + +@bt_pre_not_null{field_class} +@bt_pre_is_senum_fc{field_class} +@bt_pre_not_null{label} +*/ +extern const bt_field_class_enumeration_signed_mapping * +bt_field_class_enumeration_signed_borrow_mapping_by_label_const( + const bt_field_class *field_class, const char *label); + +/*! +@brief + Returns an array of all the labels of the mappings of the + \bt_senum_fc \bt_p{field_class} of which the \bt_p_sint_rg contain + the integral value \bt_p{value}. + +See the \ref api-tir-fc-enum-prop-mappings "mappings" property. + +This function sets \bt_p{*labels} to the resulting array and +\bt_p{*count} to the number of labels in \bt_p{*labels}. + +On success, if there's no mapping ranges containing the value +\bt_p{value}, \bt_p{*count} is 0. + +@param[in] field_class + Signed enumeration field class from which to get the labels of the + mappings of which the ranges contain \bt_p{value}. +@param[in] value + Value for which to get the mapped labels in \bt_p{field_class}. +@param[out] labels + @parblock + On success, \bt_p{*labels} + is an array of labels of the mappings of \bt_p{field_class} + containing \bt_p{value}. + + The number of labels in \bt_p{*labels} is \bt_p{*count}. + + The array is owned by \bt_p{field_class} and remains valid as long + as \bt_p{field_class} is not modified. + @endparblock +@param[out] count + On success, \bt_p{*count} is the number of labels + in \bt_p{*labels} (can be 0). + +@retval #BT_FIELD_CLASS_ENUMERATION_GET_MAPPING_LABELS_BY_VALUE_STATUS_OK + Success. +@retval #BT_FIELD_CLASS_ENUMERATION_GET_MAPPING_LABELS_BY_VALUE_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{field_class} +@bt_pre_is_senum_fc{field_class} +@bt_pre_not_null{labels} +@bt_pre_not_null{count} +*/ +extern bt_field_class_enumeration_get_mapping_labels_for_value_status +bt_field_class_enumeration_signed_get_mapping_labels_for_value( + const bt_field_class *field_class, int64_t value, + bt_field_class_enumeration_mapping_label_array *labels, + uint64_t *count); + +/*! @} */ + +/*! +@name Signed enumeration field class mapping +@{ +*/ + +/*! +@typedef struct bt_field_class_enumeration_signed_mapping bt_field_class_enumeration_signed_mapping; + +@brief + Signed enumeration field class mapping. +*/ + +/*! +@brief + Borrows the \bt_p_sint_rg from the \bt_senum_fc mapping + \bt_p{mapping}. + +See the \ref api-tir-fc-enum-prop-mappings "mappings" property. + +@param[in] mapping + Signed enumeration field class mapping from which to borrow the + signed integer ranges. + +@returns + Signed integer ranges of \bt_p{mapping}. + +@bt_pre_not_null{mapping} +*/ +extern const bt_integer_range_set_signed * +bt_field_class_enumeration_signed_mapping_borrow_ranges_const( + const bt_field_class_enumeration_signed_mapping *mapping); + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the \bt_senum_fc mapping + \bt_p{mapping} to the common #bt_field_class_enumeration_mapping + type. + +See the \ref api-tir-fc-enum-prop-mappings "mappings" property. + +@param[in] mapping + @parblock + Signed enumeration field class mapping to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{mapping} as a common enumeration field class mapping. +*/ +static inline +const bt_field_class_enumeration_mapping * +bt_field_class_enumeration_signed_mapping_as_mapping_const( + const bt_field_class_enumeration_signed_mapping *mapping) +{ + return __BT_UPCAST_CONST(bt_field_class_enumeration_mapping, mapping); +} + +/*! @} */ + +/*! +@name String field class +@{ +*/ + +/*! +@brief + Creates a \bt_string_fc from the trace class \bt_p{trace_class}. + +On success, the returned string field class has the following property +value: + + + + +
    Property + Value +
    \ref api-tir-fc-prop-user-attrs "User attributes" + Empty \bt_map_val +
    + +@param[in] trace_class + Trace class from which to create a string field class. + +@returns + New string field class reference, or \c NULL on memory error. + +@bt_pre_not_null{trace_class} +*/ +extern bt_field_class *bt_field_class_string_create( + bt_trace_class *trace_class); + +/*! @} */ + +/*! +@name Array field class +@{ +*/ + +/*! +@brief + Borrows the element field class from the \bt_array_fc + \bt_p{field_class}. + +See the \ref api-tir-fc-array-prop-elem-fc "element field class" +property. + +@param[in] field_class + Array field class from which to borrow the element field class. + +@returns + Element field class of \bt_p{field_class}. + +@bt_pre_not_null{field_class} +@bt_pre_is_array_fc{field_class} + +@sa bt_field_class_array_borrow_element_field_class_const() — + \c const version of this function. +*/ +extern bt_field_class *bt_field_class_array_borrow_element_field_class( + bt_field_class *field_class); + +/*! +@brief + Borrows the element field class from the \bt_array_fc + \bt_p{field_class} (\c const version). + +See bt_field_class_array_borrow_element_field_class(). +*/ +extern const bt_field_class * +bt_field_class_array_borrow_element_field_class_const( + const bt_field_class *field_class); + +/*! @} */ + +/*! +@name Static array field class +@{ +*/ + +/*! +@brief + Creates a \bt_sarray_fc having the element field class + \bt_p{element_field_class} and the length \bt_p{length} from the + trace class \bt_p{trace_class}. + +On success, the returned static array field class has the following +property values: + + + + + + +
    Property + Value +
    \ref api-tir-fc-array-prop-elem-fc "Element field class" + \bt_p{element_field_class} +
    \ref api-tir-fc-sarray-prop-len "Length" + \bt_p{length} +
    \ref api-tir-fc-prop-user-attrs "User attributes" + Empty \bt_map_val +
    + +@param[in] trace_class + Trace class from which to create a static array field class. +@param[in] element_field_class + Class of the element fields of the instances of the static array + field class to create. +@param[in] length + Length of the instances of the static array field class to create. + +@returns + New static array field class reference, or \c NULL on memory error. + +@bt_pre_not_null{trace_class} +@bt_pre_not_null{element_field_class} +bt_pre_fc_not_in_tc{element_field_class} + +@bt_post_success_frozen{element_field_class} +*/ +extern bt_field_class *bt_field_class_array_static_create( + bt_trace_class *trace_class, + bt_field_class *element_field_class, uint64_t length); + +/*! +@brief + Returns the length of the \bt_sarray_fc \bt_p{field_class}. + +See the \ref api-tir-fc-sarray-prop-len "length" property. + +@param[in] field_class + Static array field class of which to get the length. + +@returns + Length of \bt_p{field_class}. + +@bt_pre_not_null{field_class} +@bt_pre_is_sarray_fc{field_class} +*/ +extern uint64_t bt_field_class_array_static_get_length( + const bt_field_class *field_class); + +/*! @} */ + +/*! +@name Dynamic array field class +@{ +*/ + +/*! +@brief + Creates a \bt_darray_fc having the element field class + \bt_p{element_field_class} from the trace class \bt_p{trace_class}. + +If \bt_p{length_field_class} is not \c NULL, then the created dynamic +array field class has a linked length field class. +See +\ref api-tir-fc-link "Field classes with links to other field classes" +to learn more. + +On success, the returned dynamic array field class has the following +property values: + + + + + + +
    Property + Value +
    \ref api-tir-fc-array-prop-elem-fc "Element field class" + \bt_p{element_field_class} +
    \ref api-tir-fc-darray-prop-len-fp "Length field path" + + \em None (if \bt_p{length_field_class} is not \c NULL, this + property becomes available when the returned field class becomes + part of an \bt_ev_cls or of a \bt_stream_cls) +
    \ref api-tir-fc-prop-user-attrs "User attributes" + Empty \bt_map_val +
    + +@param[in] trace_class + Trace class from which to create a dynamic array field class. +@param[in] element_field_class + Class of the element fields of the instances of the dynamic array + field class to create. +@param[in] length_field_class + @parblock + Linked length field class of the dynamic array field class to + create. + + Can be \c NULL. + @endparblock + +@returns + New dynamic array field class reference, or \c NULL on memory error. + +@bt_pre_not_null{trace_class} +@bt_pre_not_null{element_field_class} +@bt_pre_fc_not_in_tc{element_field_class} +@pre + If \bt_p{length_field_class} is not \c NULL, + \bt_p{length_field_class} is an \bt_uint_fc. + +@bt_post_success_frozen{element_field_class} +@bt_post_success_frozen{length_field_class} +*/ +extern bt_field_class *bt_field_class_array_dynamic_create( + bt_trace_class *trace_class, + bt_field_class *element_field_class, + bt_field_class *length_field_class); + +/*! @} */ + +/*! +@name Dynamic array field class with length field +@{ +*/ + +/*! +@brief + Borrows the length field path from the \bt_darray_fc (with a length + field) \bt_p{field_class}. + +See the \ref api-tir-fc-darray-prop-len-fp "length field path" property. + +This property is only available when a \bt_struct_fc containing +(recursively) \bt_p{field_class} is passed to one of: + +- bt_stream_class_set_packet_context_field_class() +- bt_stream_class_set_event_common_context_field_class() +- bt_event_class_set_specific_context_field_class() +- bt_event_class_set_payload_field_class() + +In the meantime, this function returns \c NULL. + +@param[in] field_class + Dynamic array field class from which to borrow the length + field path. + +@returns + Length field path of \bt_p{field_class}. + +@bt_pre_not_null{field_class} +@bt_pre_is_darray_wl_fc{field_class} +*/ +extern const bt_field_path * +bt_field_class_array_dynamic_with_length_field_borrow_length_field_path_const( + const bt_field_class *field_class); + +/*! @} */ + +/*! +@name Structure field class +@{ +*/ + +/*! +@brief + Creates a \bt_struct_fc from the trace class \bt_p{trace_class}. + +On success, the returned structure field class has the following +property values: + + + + + +
    Property + Value +
    \ref api-tir-fc-struct-prop-members "Members" + \em None +
    \ref api-tir-fc-prop-user-attrs "User attributes" + Empty \bt_map_val +
    + +@param[in] trace_class + Trace class from which to create a structure field class. + +@returns + New structure field class reference, or \c NULL on memory error. + +@bt_pre_not_null{trace_class} +*/ +extern bt_field_class *bt_field_class_structure_create( + bt_trace_class *trace_class); + +/*! +@brief + Status codes for bt_field_class_structure_append_member(). +*/ +typedef enum bt_field_class_structure_append_member_status { + /*! + @brief + Success. + */ + BT_FIELD_CLASS_STRUCTURE_APPEND_MEMBER_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_FIELD_CLASS_STRUCTURE_APPEND_MEMBER_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, +} bt_field_class_structure_append_member_status; + +/*! +@brief + Appends a member to the \bt_struct_fc \bt_p{field_class} having the + name \bt_p{name} and the field class \bt_p{member_field_class}. + +See the \ref api-tir-fc-struct-prop-members "members" property. + +@param[in] field_class + Structure field class to which to append a member having + the name \bt_p{name} and the field class \bt_p{member_field_class}. +@param[in] name + Name of the member to append to \bt_p{field_class} (copied). +@param[in] member_field_class + Field class of the member to append to \bt_p{field_class}. + +@retval #BT_FIELD_CLASS_STRUCTURE_APPEND_MEMBER_STATUS_OK + Success. +@retval #BT_FIELD_CLASS_STRUCTURE_APPEND_MEMBER_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{field_class} +@bt_pre_hot{field_class} +@bt_pre_is_struct_fc{field_class} +@pre + \bt_p{field_class} has no member with the name \bt_p{name}. +@bt_pre_not_null{name} +@bt_pre_not_null{member_field_class} +@bt_pre_fc_not_in_tc{member_field_class} + +@bt_post_success_frozen{member_field_class} +*/ +extern bt_field_class_structure_append_member_status +bt_field_class_structure_append_member( + bt_field_class *field_class, + const char *name, bt_field_class *member_field_class); + +/*! +@brief + Returns the number of members contained in the \bt_struct_fc + \bt_p{field_class}. + +See the \ref api-tir-fc-struct-prop-members "members" property. + +@param[in] field_class + Structure field class of which to get the number of contained + members. + +@returns + Number of contained members in \bt_p{field_class}. + +@bt_pre_not_null{field_class} +@bt_pre_is_struct_fc{field_class} +*/ +extern uint64_t bt_field_class_structure_get_member_count( + const bt_field_class *field_class); + +/*! +@brief + Borrows the member at index \bt_p{index} from the + \bt_struct_fc \bt_p{field_class}. + +See the \ref api-tir-fc-struct-prop-members "members" property. + +@param[in] field_class + Structure field class from which to borrow the member at + index \bt_p{index}. +@param[in] index + Index of the member to borrow from \bt_p{field_class}. + +@returns + @parblock + \em Borrowed reference of the member of + \bt_p{field_class} at index \bt_p{index}. + + The returned pointer remains valid as long as \bt_p{field_class} + is not modified. + @endparblock + +@bt_pre_not_null{field_class} +@bt_pre_is_struct_fc{field_class} +@pre + \bt_p{index} is less than the number of members in + \bt_p{field_class} (as returned by + bt_field_class_structure_get_member_count()). + +@sa bt_field_class_structure_get_member_count() — + Returns the number of members contained in a structure field class. +@sa bt_field_class_structure_borrow_member_by_index_const() — + \c const version of this function. +*/ +extern bt_field_class_structure_member * +bt_field_class_structure_borrow_member_by_index( + bt_field_class *field_class, uint64_t index); + +/*! +@brief + Borrows the member at index \bt_p{index} from the + \bt_struct_fc \bt_p{field_class} (\c const version). + +See bt_field_class_structure_borrow_member_by_index(). +*/ +extern const bt_field_class_structure_member * +bt_field_class_structure_borrow_member_by_index_const( + const bt_field_class *field_class, uint64_t index); + +/*! +@brief + Borrows the member having the name \bt_p{name} from the + \bt_struct_fc \bt_p{field_class}. + +See the \ref api-tir-fc-struct-prop-members "members" property. + +If there's no member having the name \bt_p{name} in +\bt_p{field_class}, this function returns \c NULL. + +@param[in] field_class + Structure field class from which to borrow the member having the + name \bt_p{name}. +@param[in] name + Name of the member to borrow from \bt_p{field_class}. + +@returns + @parblock + \em Borrowed reference of the member of + \bt_p{field_class} having the name \bt_p{name}, or \c NULL + if none. + + The returned pointer remains valid as long as \bt_p{field_class} + is not modified. + @endparblock + +@bt_pre_not_null{field_class} +@bt_pre_is_struct_fc{field_class} +@bt_pre_not_null{name} + +@sa bt_field_class_structure_borrow_member_by_name_const() — + \c const version of this function. +*/ +extern bt_field_class_structure_member * +bt_field_class_structure_borrow_member_by_name( + bt_field_class *field_class, const char *name); + +/*! +@brief + Borrows the member having the name \bt_p{name} from the + \bt_struct_fc \bt_p{field_class} (\c const version). + +See bt_field_class_structure_borrow_member_by_name(). +*/ +extern const bt_field_class_structure_member * +bt_field_class_structure_borrow_member_by_name_const( + const bt_field_class *field_class, const char *name); + +/*! @} */ + +/*! +@name Structure field class member +@{ +*/ + +/*! +@typedef struct bt_field_class_structure_member bt_field_class_structure_member; + +@brief + Structure field class member. +*/ + +/*! +@brief + Returns the name of the \bt_struct_fc member \bt_p{member}. + +See the \ref api-tir-fc-struct-prop-members "members" property. + +@param[in] member + Structure field class member of which to get the name. + +@returns + @parblock + Name of \bt_p{member}. + + The returned pointer remains valid as long as \bt_p{member} exists. + @endparblock + +@bt_pre_not_null{member} +*/ +extern const char *bt_field_class_structure_member_get_name( + const bt_field_class_structure_member *member); + +/*! +@brief + Borrows the field class from the \bt_struct_fc member + \bt_p{member}. + +See the \ref api-tir-fc-struct-prop-members "members" property. + +@param[in] member + Structure field class member from which to borrow the field class. + +@returns + Field class of \bt_p{member}. + +@bt_pre_not_null{member} + +@sa bt_field_class_structure_member_borrow_field_class_const() — + \c const version of this function. +*/ +extern bt_field_class * +bt_field_class_structure_member_borrow_field_class( + bt_field_class_structure_member *member); + +/*! +@brief + Borrows the field class from the \bt_struct_fc member + \bt_p{member} (\c const version). + +See bt_field_class_structure_member_borrow_field_class(). +*/ +extern const bt_field_class * +bt_field_class_structure_member_borrow_field_class_const( + const bt_field_class_structure_member *member); + +/*! +@brief + Sets the user attributes of the \bt_struct_fc member \bt_p{member} + to \bt_p{user_attributes}. + +See the \ref api-tir-fc-struct-prop-members "members" property. + +@note + When you append a member to a structure field class with + bt_field_class_structure_append_member(), the member's + initial user attributes is an empty \bt_map_val. Therefore you can + borrow it with + bt_field_class_structure_member_borrow_user_attributes() and fill it + directly instead of setting a new one with this function. + +@param[in] member + Structure field class member of which to set the user attributes to + \bt_p{user_attributes}. +@param[in] user_attributes + New user attributes of \bt_p{member}. + +@bt_pre_not_null{member} +@bt_pre_hot{member} +@bt_pre_not_null{user_attributes} +@bt_pre_is_map_val{user_attributes} + +@sa bt_field_class_structure_member_borrow_user_attributes() — + Borrows the user attributes of a structure field class member. +*/ +extern void bt_field_class_structure_member_set_user_attributes( + bt_field_class_structure_member *member, + const bt_value *user_attributes); + +/*! +@brief + Borrows the user attributes of the \bt_struct_fc member + \bt_p{member}. + +See the \ref api-tir-fc-struct-prop-members "members" property. + +@note + When you append a member to a structure field class with + bt_field_class_structure_append_member(), the member's + initial user attributes is an empty \bt_map_val. + +@param[in] member + Structure field class member from which to borrow the user + attributes. + +@returns + User attributes of \bt_p{member} (a \bt_map_val). + +@bt_pre_not_null{member} + +@sa bt_field_class_structure_member_set_user_attributes() — + Sets the user attributes of a structure field class member. +@sa bt_field_class_structure_member_borrow_user_attributes_const() — + \c const version of this function. +*/ +extern bt_value * +bt_field_class_structure_member_borrow_user_attributes( + bt_field_class_structure_member *member); + +/*! +@brief + Borrows the user attributes of the \bt_struct_fc member + \bt_p{member} (\c const version). + +See bt_field_class_structure_member_borrow_user_attributes(). +*/ +extern const bt_value * +bt_field_class_structure_member_borrow_user_attributes_const( + const bt_field_class_structure_member *member); + +/*! @} */ + +/*! +@name Option field class +@{ +*/ + +/*! +@brief + Borrows the optional field class from the \bt_opt_fc + \bt_p{field_class}. + +See the \ref api-tir-fc-opt-prop-fc "optional field class" property. + +@param[in] field_class + Option field class from which to borrow the optional field class. + +@returns + Optional field class of \bt_p{field_class}. + +@bt_pre_not_null{field_class} +@bt_pre_is_opt_fc{field_class} + +@sa bt_field_class_option_borrow_field_class_const() — + \c const version of this function. +*/ +extern bt_field_class *bt_field_class_option_borrow_field_class( + bt_field_class *field_class); + +/*! +@brief + Borrows the optional field class from the \bt_opt_fc + \bt_p{field_class} (\c const version). + +See bt_field_class_option_borrow_field_class(). +*/ +extern const bt_field_class * +bt_field_class_option_borrow_field_class_const( + const bt_field_class *field_class); + +/*! @} */ + +/*! +@name Option field class without a selector field +@{ +*/ + +/*! +@brief + Creates an \bt_opt_fc (without a selector field) having the optional + field class \bt_p{optional_field_class} from the trace class + \bt_p{trace_class}. + +On success, the returned option field class has the following property +values: + + + + + +
    Property + Value +
    \ref api-tir-fc-opt-prop-fc "Optional field class" + \bt_p{optional_field_class} +
    \ref api-tir-fc-prop-user-attrs "User attributes" + Empty \bt_map_val +
    + +@param[in] trace_class + Trace class from which to create an option field class. +@param[in] optional_field_class + Class of the optional fields of the instances of the option field + class to create. + +@returns + New option field class reference, or \c NULL on memory error. + +@bt_pre_not_null{trace_class} +@bt_pre_not_null{optional_field_class} +@bt_pre_fc_not_in_tc{optional_field_class} + +@bt_post_success_frozen{optional_field_class} +*/ +extern bt_field_class *bt_field_class_option_without_selector_create( + bt_trace_class *trace_class, + bt_field_class *optional_field_class); + +/*! @} */ + +/*! +@name Option field class with a selector field +@{ +*/ + +/*! +@brief + Borrows the selector field path from the \bt_opt_fc (with a selector + field) \bt_p{field_class}. + +See the \ref api-tir-fc-opt-prop-sel-fp "selector field path" property. + +This property is only available when a \bt_struct_fc containing +(recursively) \bt_p{field_class} is passed to one of: + +- bt_stream_class_set_packet_context_field_class() +- bt_stream_class_set_event_common_context_field_class() +- bt_event_class_set_specific_context_field_class() +- bt_event_class_set_payload_field_class() + +In the meantime, this function returns \c NULL. + +@param[in] field_class + Option field class from which to borrow the selector field path. + +@returns + Selector field path of \bt_p{field_class}. + +@bt_pre_not_null{field_class} +@bt_pre_is_opt_ws_fc{field_class} +*/ +extern const bt_field_path * +bt_field_class_option_with_selector_field_borrow_selector_field_path_const( + const bt_field_class *field_class); + +/*! @} */ + +/*! +@name Option field class with a boolean selector field +@{ +*/ + +/*! +@brief + Creates an \bt_opt_fc (with a boolean selector field) having the + optional field class \bt_p{optional_field_class} from the trace + class \bt_p{trace_class}. + +On success, the returned option field class has the following property +values: + + + + + + + +
    Property + Value +
    \ref api-tir-fc-opt-prop-fc "Optional field class" + \bt_p{optional_field_class} +
    \ref api-tir-fc-opt-prop-sel-fp "Selector field path" + + \em None (this property becomes available when the returned field + class becomes part of an \bt_ev_cls or of a \bt_stream_cls) +
    \ref api-tir-fc-opt-prop-sel-rev "Selector is reversed?" + #BT_FALSE +
    \ref api-tir-fc-prop-user-attrs "User attributes" + Empty \bt_map_val +
    + +@param[in] trace_class + Trace class from which to create an option field class. +@param[in] optional_field_class + Class of the optional fields of the instances of the option field + class to create. +@param[in] selector_field_class + Linked selector field class of the option field class to create. + +@returns + New option field class reference, or \c NULL on memory error. + +@bt_pre_not_null{trace_class} +@bt_pre_not_null{optional_field_class} +@bt_pre_fc_not_in_tc{optional_field_class} +@bt_pre_not_null{selector_field_class} +@pre + \bt_p{selector_field_class} is a \bt_bool_fc. + +@bt_post_success_frozen{optional_field_class} +@bt_post_success_frozen{selector_field_class} +*/ +extern bt_field_class *bt_field_class_option_with_selector_field_bool_create( + bt_trace_class *trace_class, + bt_field_class *optional_field_class, + bt_field_class *selector_field_class); + +/*! +@brief + Sets whether or not the selector of the \bt_opt_fc (with a boolean + selector field) \bt_p{field_class} is reversed. + +See the \ref api-tir-fc-opt-prop-sel-rev "selector is reversed?" +property. + +@param[in] field_class + Option field class of which to set whether or not its selector + is reversed. +@param[in] selector_is_reversed + #BT_TRUE to make \bt_p{field_class} have a reversed selector. + +@bt_pre_not_null{field_class} +@bt_pre_hot{field_class} +@bt_pre_is_opt_wbs_fc{field_class} + +@sa bt_field_class_option_with_selector_field_bool_selector_is_reversed() — + Returns whether or not the selector of an option field class (with + a boolean selector field) is reversed. +*/ +extern void +bt_field_class_option_with_selector_field_bool_set_selector_is_reversed( + bt_field_class *field_class, bt_bool selector_is_reversed); + +/*! +@brief + Returns whether or not the selector of the + \bt_opt_fc (with a boolean selector field) is reversed. + +See the \ref api-tir-fc-opt-prop-sel-rev "selector is reversed?" +property. + +@param[in] field_class + Option field class of which to get whether or not its selector is + reversed. + +@returns + #BT_TRUE if the selector of \bt_p{field_class} is reversed. + +@bt_pre_not_null{field_class} +@bt_pre_is_opt_wbs_fc{field_class} + +@sa bt_field_class_option_with_selector_field_bool_set_selector_is_reversed() — + Sets whether or not the selector of an option field class (with + a boolean selector field) is reversed. +*/ +extern bt_bool +bt_field_class_option_with_selector_field_bool_selector_is_reversed( + const bt_field_class *field_class); + +/*! @} */ + +/*! +@name Option field class with an unsigned integer selector field +@{ +*/ + +/*! +@brief + Creates an \bt_opt_fc (with an unsigned integer selector field) + having the optional field class \bt_p{optional_field_class} from the + trace class \bt_p{trace_class}. + +On success, the returned option field class has the following property +values: + + + + + + + +
    Property + Value +
    \ref api-tir-fc-opt-prop-fc "Optional field class" + \bt_p{optional_field_class} +
    \ref api-tir-fc-opt-prop-sel-fp "Selector field path" + + \em None (this property becomes available when the returned field + class becomes part of an \bt_ev_cls or of a \bt_stream_cls) +
    \ref api-tir-fc-opt-prop-uint-rs "Selector's unsigned integer ranges" + \bt_p{ranges} +
    \ref api-tir-fc-prop-user-attrs "User attributes" + Empty \bt_map_val +
    + +@param[in] trace_class + Trace class from which to create an option field class. +@param[in] optional_field_class + Class of the optional fields of the instances of the option field + class to create. +@param[in] selector_field_class + Linked selector field class of the option field class to create. +@param[in] ranges + Selector's unsigned integer ranges of the option field class to + create. + +@returns + New option field class reference, or \c NULL on memory error. + +@bt_pre_not_null{trace_class} +@bt_pre_not_null{optional_field_class} +@bt_pre_fc_not_in_tc{optional_field_class} +@bt_pre_not_null{selector_field_class} +@pre + \bt_p{selector_field_class} is a \bt_uint_fc. +@bt_pre_not_null{ranges} +@pre + \bt_p{ranges} contains one or more \bt_p_uint_rg. + +@bt_post_success_frozen{optional_field_class} +@bt_post_success_frozen{selector_field_class} +@bt_post_success_frozen{ranges} +*/ +extern bt_field_class * +bt_field_class_option_with_selector_field_integer_unsigned_create( + bt_trace_class *trace_class, + bt_field_class *optional_field_class, + bt_field_class *selector_field_class, + const bt_integer_range_set_unsigned *ranges); + +/*! +@brief + Borrows the \bt_p_uint_rg from the \bt_opt_fc (with an unsigned + integer selector field) \bt_p{field_class}. + +See the +\ref api-tir-fc-opt-prop-uint-rs "selector's unsigned integer ranges" +property. + +@param[in] field_class + Option field class from which to borrow the unsigned integer ranges. + +@returns + Unsigned integer ranges of \bt_p{field_class}. + +@bt_pre_not_null{field_class} +@bt_pre_is_opt_wuis_fc{field_class} +*/ +extern const bt_integer_range_set_unsigned * +bt_field_class_option_with_selector_field_integer_unsigned_borrow_selector_ranges_const( + const bt_field_class *field_class); + +/*! @} */ + +/*! +@name Option field class with a signed integer selector field +@{ +*/ + +/*! +@brief + Creates an \bt_opt_fc (with a signed integer selector field) + having the optional field class \bt_p{optional_field_class} from the + trace class \bt_p{trace_class}. + +On success, the returned option field class has the following property +values: + + + + + + + +
    Property + Value +
    \ref api-tir-fc-opt-prop-fc "Optional field class" + \bt_p{optional_field_class} +
    \ref api-tir-fc-opt-prop-sel-fp "Selector field path" + + \em None (this property becomes available when the returned field + class becomes part of an \bt_ev_cls or of a \bt_stream_cls) +
    \ref api-tir-fc-opt-prop-sint-rs "Selector's signed integer ranges" + \bt_p{ranges} +
    \ref api-tir-fc-prop-user-attrs "User attributes" + Empty \bt_map_val +
    + +@param[in] trace_class + Trace class from which to create an option field class. +@param[in] optional_field_class + Class of the optional fields of the instances of the option field + class to create. +@param[in] selector_field_class + Linked selector field class of the option field class to create. +@param[in] ranges + Selector's signed integer ranges of the option field class to + create. + +@returns + New option field class reference, or \c NULL on memory error. + +@bt_pre_not_null{trace_class} +@bt_pre_not_null{optional_field_class} +@bt_pre_fc_not_in_tc{optional_field_class} +@bt_pre_not_null{selector_field_class} +@pre + \bt_p{selector_field_class} is a \bt_uint_fc. +@bt_pre_not_null{ranges} +@pre + \bt_p{ranges} contains one or more \bt_p_uint_rg. + +@bt_post_success_frozen{optional_field_class} +@bt_post_success_frozen{selector_field_class} +@bt_post_success_frozen{ranges} +*/ +extern bt_field_class * +bt_field_class_option_with_selector_field_integer_signed_create( + bt_trace_class *trace_class, + bt_field_class *optional_field_class, + bt_field_class *selector_field_class, + const bt_integer_range_set_signed *ranges); + +/*! +@brief + Borrows the \bt_p_sint_rg from the \bt_opt_fc (with a signed + integer selector field) \bt_p{field_class}. -extern bt_field_class *bt_field_class_bool_create( - bt_trace_class *trace_class); +See the +\ref api-tir-fc-opt-prop-sint-rs "selector's signed integer ranges" +property. -extern bt_field_class *bt_field_class_bit_array_create( - bt_trace_class *trace_class, uint64_t length); +@param[in] field_class + Option field class from which to borrow the signed integer ranges. -extern bt_field_class *bt_field_class_integer_unsigned_create( - bt_trace_class *trace_class); +@returns + Signed integer ranges of \bt_p{field_class}. -extern bt_field_class *bt_field_class_integer_signed_create( - bt_trace_class *trace_class); +@bt_pre_not_null{field_class} +@bt_pre_is_opt_wsis_fc{field_class} +*/ +extern const bt_integer_range_set_signed * +bt_field_class_option_with_selector_field_integer_signed_borrow_selector_ranges_const( + const bt_field_class *field_class); -extern void bt_field_class_integer_set_field_value_range( - bt_field_class *field_class, uint64_t size); +/*! @} */ -extern void bt_field_class_integer_set_preferred_display_base( - bt_field_class *field_class, - bt_field_class_integer_preferred_display_base base); +/*! +@name Variant field class +@{ +*/ -extern bt_field_class *bt_field_class_real_single_precision_create( - bt_trace_class *trace_class); +/*! +@brief + Creates a \bt_var_fc from the trace class \bt_p{trace_class}. -extern bt_field_class *bt_field_class_real_double_precision_create( - bt_trace_class *trace_class); +If \bt_p{selector_field_class} is not \c NULL, then the created variant +field class has a linked selector field class. +See +\ref api-tir-fc-link "Field classes with links to other field classes" +to learn more. -extern bt_field_class *bt_field_class_enumeration_unsigned_create( - bt_trace_class *trace_class); +On success, the returned variant field class has the following +property values: -extern bt_field_class *bt_field_class_enumeration_signed_create( - bt_trace_class *trace_class); + + + + + +
    Property + Value +
    \ref api-tir-fc-var-prop-sel-fp "Selector field path" + + \em None (if \bt_p{selector_field_class} is not \c NULL, this + property becomes available when the returned field class becomes + part of an \bt_ev_cls or of a \bt_stream_cls) +
    \ref api-tir-fc-var-prop-opts "Options" + \em None +
    \ref api-tir-fc-prop-user-attrs "User attributes" + Empty \bt_map_val +
    -typedef enum bt_field_class_enumeration_add_mapping_status { - BT_FIELD_CLASS_ENUMERATION_ADD_MAPPING_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, - BT_FIELD_CLASS_ENUMERATION_ADD_MAPPING_STATUS_OK = __BT_FUNC_STATUS_OK, -} bt_field_class_enumeration_add_mapping_status; +@param[in] trace_class + Trace class from which to create a variant field class. +@param[in] selector_field_class + @parblock + Linked selector field class of the variant field class to create. -extern bt_field_class_enumeration_add_mapping_status -bt_field_class_enumeration_unsigned_add_mapping( - bt_field_class *field_class, const char *label, - const bt_integer_range_set_unsigned *range_set); + Can be \c NULL. + @endparblock -extern bt_field_class_enumeration_add_mapping_status -bt_field_class_enumeration_signed_add_mapping( - bt_field_class *field_class, const char *label, - const bt_integer_range_set_signed *range_set); +@returns + New variant field class reference, or \c NULL on memory error. -extern bt_field_class *bt_field_class_string_create( - bt_trace_class *trace_class); +@bt_pre_not_null{trace_class} +@pre + If \bt_p{selector_field_class} is not \c NULL, + \bt_p{selector_field_class} is an \bt_int_fc. -extern bt_field_class *bt_field_class_structure_create( - bt_trace_class *trace_class); +@bt_post_success_frozen{element_field_class} +@bt_post_success_frozen{selector_field_class} +*/ +extern bt_field_class *bt_field_class_variant_create( + bt_trace_class *trace_class, + bt_field_class *selector_field_class); -typedef enum bt_field_class_structure_append_member_status { - BT_FIELD_CLASS_STRUCTURE_APPEND_MEMBER_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, - BT_FIELD_CLASS_STRUCTURE_APPEND_MEMBER_STATUS_OK = __BT_FUNC_STATUS_OK, -} bt_field_class_structure_append_member_status; +/*! +@brief + Returns the number of options contained in the \bt_var_fc + \bt_p{field_class}. -extern bt_field_class_structure_append_member_status -bt_field_class_structure_append_member( - bt_field_class *struct_field_class, - const char *name, bt_field_class *field_class); +See the \ref api-tir-fc-var-prop-opts "options" property. -extern bt_field_class_structure_member * -bt_field_class_structure_borrow_member_by_index( +@param[in] field_class + Variant field class of which to get the number of contained + options. + +@returns + Number of contained options in \bt_p{field_class}. + +@bt_pre_not_null{field_class} +@bt_pre_is_var_fc{field_class} +*/ +extern uint64_t bt_field_class_variant_get_option_count( + const bt_field_class *field_class); + +/*! +@brief + Borrows the option at index \bt_p{index} from the + \bt_var_fc \bt_p{field_class}. + +See the \ref api-tir-fc-var-prop-opts "options" property. + +@param[in] field_class + Variant field class from which to borrow the option at + index \bt_p{index}. +@param[in] index + Index of the option to borrow from \bt_p{field_class}. + +@returns + @parblock + \em Borrowed reference of the option of + \bt_p{field_class} at index \bt_p{index}. + + The returned pointer remains valid as long as \bt_p{field_class} + is not modified. + @endparblock + +@bt_pre_not_null{field_class} +@bt_pre_is_var_fc{field_class} +@pre + \bt_p{index} is less than the number of options in + \bt_p{field_class} (as returned by + bt_field_class_variant_get_option_count()). + +@sa bt_field_class_variant_get_option_count() — + Returns the number of options contained in a variant field class. +@sa bt_field_class_variant_borrow_option_by_index_const() — + \c const version of this function. +*/ +extern bt_field_class_variant_option * +bt_field_class_variant_borrow_option_by_index( bt_field_class *field_class, uint64_t index); -extern bt_field_class_structure_member * -bt_field_class_structure_borrow_member_by_name( +/*! +@brief + Borrows the option at index \bt_p{index} from the + \bt_var_fc \bt_p{field_class} (\c const version). + +See bt_field_class_variant_borrow_option_by_index(). +*/ +extern const bt_field_class_variant_option * +bt_field_class_variant_borrow_option_by_index_const( + const bt_field_class *field_class, uint64_t index); + +/*! +@brief + Borrows the option having the name \bt_p{name} from the + \bt_var_fc \bt_p{field_class}. + +See the \ref api-tir-fc-var-prop-opts "options" property. + +If there's no option having the name \bt_p{name} in +\bt_p{field_class}, this function returns \c NULL. + +@param[in] field_class + Variant field class from which to borrow the option having the + name \bt_p{name}. +@param[in] name + Name of the option to borrow from \bt_p{field_class}. + +@returns + @parblock + \em Borrowed reference of the option of + \bt_p{field_class} having the name \bt_p{name}, or \c NULL + if none. + + The returned pointer remains valid as long as \bt_p{field_class} + is not modified. + @endparblock + +@bt_pre_not_null{field_class} +@bt_pre_is_var_fc{field_class} +@bt_pre_not_null{name} + +@sa bt_field_class_variant_borrow_option_by_name_const() — + \c const version of this function. +*/ +extern bt_field_class_variant_option * +bt_field_class_variant_borrow_option_by_name( bt_field_class *field_class, const char *name); -extern bt_field_class * -bt_field_class_structure_member_borrow_field_class( - bt_field_class_structure_member *member); +/*! +@brief + Borrows the option having the name \bt_p{name} from the + \bt_var_fc \bt_p{field_class} (\c const version). -extern bt_value *bt_field_class_structure_member_borrow_user_attributes( - bt_field_class_structure_member *member); +See bt_field_class_variant_borrow_option_by_name(). +*/ +extern const bt_field_class_variant_option * +bt_field_class_variant_borrow_option_by_name_const( + const bt_field_class *field_class, const char *name); -extern void bt_field_class_structure_member_set_user_attributes( - bt_field_class_structure_member *member, +/*! @} */ + +/*! +@name Variant field class option +@{ +*/ + +/*! +@typedef struct bt_field_class_variant_option bt_field_class_variant_option; + +@brief + Variant field class option. +*/ + +/*! +@brief + Returns the name of the \bt_var_fc option \bt_p{option}. + +See the \ref api-tir-fc-var-prop-opts "options" property. + +@param[in] option + Variant field class option of which to get the name. + +@returns + @parblock + Name of \bt_p{option}. + + The returned pointer remains valid as long as \bt_p{option} exists. + @endparblock + +@bt_pre_not_null{option} +*/ +extern const char *bt_field_class_variant_option_get_name( + const bt_field_class_variant_option *option); + +/*! +@brief + Borrows the field class from the \bt_var_fc option + \bt_p{option}. + +See the \ref api-tir-fc-var-prop-opts "options" property. + +@param[in] option + Variant field class option from which to borrow the field class. + +@returns + Field class of \bt_p{option}. + +@bt_pre_not_null{option} + +@sa bt_field_class_variant_option_borrow_field_class_const() — + \c const version of this function. +*/ +extern bt_field_class *bt_field_class_variant_option_borrow_field_class( + bt_field_class_variant_option *option); + +/*! +@brief + Borrows the field class from the \bt_var_fc option + \bt_p{option} (\c const version). + +See bt_field_class_variant_option_borrow_field_class(). +*/ +extern const bt_field_class * +bt_field_class_variant_option_borrow_field_class_const( + const bt_field_class_variant_option *option); + +/*! +@brief + Sets the user attributes of the \bt_var_fc option \bt_p{option} + to \bt_p{user_attributes}. + +See the \ref api-tir-fc-var-prop-opts "options" property. + +@note + When you append an option to a variant field class with + bt_field_class_variant_without_selector_append_option(), + bt_field_class_variant_with_selector_field_integer_unsigned_append_option(), + or + bt_field_class_variant_with_selector_field_integer_signed_append_option(), + the option's initial user attributes is an empty \bt_map_val. + Therefore you can borrow it with + bt_field_class_variant_option_borrow_user_attributes() and fill it + directly instead of setting a new one with this function. + +@param[in] option + Variant field class option of which to set the user attributes to + \bt_p{user_attributes}. +@param[in] user_attributes + New user attributes of \bt_p{option}. + +@bt_pre_not_null{option} +@bt_pre_hot{option} +@bt_pre_not_null{user_attributes} +@bt_pre_is_map_val{user_attributes} + +@sa bt_field_class_variant_option_borrow_user_attributes() — + Borrows the user attributes of a variant field class option. +*/ +extern void bt_field_class_variant_option_set_user_attributes( + bt_field_class_variant_option *option, const bt_value *user_attributes); -extern bt_field_class *bt_field_class_array_static_create( - bt_trace_class *trace_class, - bt_field_class *elem_field_class, uint64_t length); +/*! +@brief + Borrows the user attributes of the \bt_var_fc option \bt_p{option}. -extern bt_field_class *bt_field_class_array_dynamic_create( - bt_trace_class *trace_class, - bt_field_class *elem_field_class, - bt_field_class *length_field_class); +See the \ref api-tir-fc-var-prop-opts "options" property. -extern bt_field_class *bt_field_class_array_borrow_element_field_class( - bt_field_class *field_class); +@note + When you append an option to a variant field class with + bt_field_class_variant_without_selector_append_option(), + bt_field_class_variant_with_selector_field_integer_unsigned_append_option(), + or + bt_field_class_variant_with_selector_field_integer_signed_append_option(), + the option's initial user attributes is an empty \bt_map_val. -extern bt_field_class *bt_field_class_option_without_selector_create( - bt_trace_class *trace_class, - bt_field_class *content_field_class); +@param[in] option + Variant field class option from which to borrow the user + attributes. -extern bt_field_class *bt_field_class_option_with_selector_field_bool_create( - bt_trace_class *trace_class, - bt_field_class *content_field_class, - bt_field_class *selector_field_class); +@returns + User attributes of \bt_p{option} (a \bt_map_val). -extern void bt_field_class_option_with_selector_field_bool_set_selector_is_reversed( - bt_field_class *field_class, bt_bool selector_is_reversed); +@bt_pre_not_null{option} -extern bt_field_class * -bt_field_class_option_with_selector_field_integer_unsigned_create( - bt_trace_class *trace_class, - bt_field_class *content_field_class, - bt_field_class *selector_field_class, - const bt_integer_range_set_unsigned *range_set); +@sa bt_field_class_variant_option_set_user_attributes() — + Sets the user attributes of a variant field class option. +@sa bt_field_class_variant_option_borrow_user_attributes_const() — + \c const version of this function. +*/ +extern bt_value *bt_field_class_variant_option_borrow_user_attributes( + bt_field_class_variant_option *option); -extern bt_field_class * -bt_field_class_option_with_selector_field_integer_signed_create( - bt_trace_class *trace_class, - bt_field_class *content_field_class, - bt_field_class *selector_field_class, - const bt_integer_range_set_signed *range_set); +/*! +@brief + Borrows the user attributes of the \bt_var_fc option \bt_p{option} + (\c const version). -extern bt_field_class *bt_field_class_option_borrow_field_class( - bt_field_class *field_class); +See bt_field_class_variant_option_borrow_user_attributes(). +*/ +extern const bt_value *bt_field_class_variant_option_borrow_user_attributes_const( + const bt_field_class_variant_option *option); -extern bt_field_class *bt_field_class_variant_create( - bt_trace_class *trace_class, - bt_field_class *selector_field_class); +/*! @} */ + +/*! +@name Variant field class without a selector field +@{ +*/ +/*! +@brief + Status codes for + bt_field_class_variant_without_selector_append_option(). +*/ typedef enum bt_field_class_variant_without_selector_append_option_status { - BT_FIELD_CLASS_VARIANT_WITHOUT_SELECTOR_FIELD_APPEND_OPTION_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + /*! + @brief + Success. + */ BT_FIELD_CLASS_VARIANT_WITHOUT_SELECTOR_FIELD_APPEND_OPTION_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_FIELD_CLASS_VARIANT_WITHOUT_SELECTOR_FIELD_APPEND_OPTION_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, } bt_field_class_variant_without_selector_append_option_status; +/*! +@brief + Appends an option to the \bt_var_fc (without a selector field) + \bt_p{field_class} having the name \bt_p{name} and the + field class \bt_p{option_field_class}. + +See the \ref api-tir-fc-var-prop-opts "options" property. + +@param[in] field_class + Variant field class to which to append an option having + the name \bt_p{name} and the field class \bt_p{option_field_class}. +@param[in] name + Name of the option to append to \bt_p{field_class} (copied). +@param[in] option_field_class + Field class of the option to append to \bt_p{field_class}. + +@retval #BT_FIELD_CLASS_VARIANT_WITHOUT_SELECTOR_FIELD_APPEND_OPTION_STATUS_OK + Success. +@retval #BT_FIELD_CLASS_VARIANT_WITHOUT_SELECTOR_FIELD_APPEND_OPTION_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{field_class} +@bt_pre_hot{field_class} +@bt_pre_is_var_wos_fc{field_class} +@pre + \bt_p{field_class} has no option with the name \bt_p{name}. +@bt_pre_not_null{name} +@bt_pre_not_null{option_field_class} +@bt_pre_fc_not_in_tc{option_field_class} + +@bt_post_success_frozen{option_field_class} +*/ extern bt_field_class_variant_without_selector_append_option_status bt_field_class_variant_without_selector_append_option( - bt_field_class *var_field_class, const char *name, - bt_field_class *field_class); + bt_field_class *field_class, const char *name, + bt_field_class *option_field_class); + +/*! @} */ +/*! +@name Variant field class with a selector field +@{ +*/ + +/*! +@brief + Status codes for + bt_field_class_variant_with_selector_field_integer_unsigned_append_option() + and + bt_field_class_variant_with_selector_field_integer_signed_append_option(). +*/ typedef enum bt_field_class_variant_with_selector_field_integer_append_option_status { - BT_FIELD_CLASS_VARIANT_WITH_SELECTOR_FIELD_APPEND_OPTION_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + /*! + @brief + Success. + */ BT_FIELD_CLASS_VARIANT_WITH_SELECTOR_FIELD_APPEND_OPTION_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_FIELD_CLASS_VARIANT_WITH_SELECTOR_FIELD_APPEND_OPTION_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, } bt_field_class_variant_with_selector_field_integer_append_option_status; +/*! +@brief + Borrows the selector field path from the \bt_var_fc (with a selector + field) \bt_p{field_class}. + +See the \ref api-tir-fc-var-prop-sel-fp "selector field path" property. + +This property is only available when a \bt_struct_fc containing +(recursively) \bt_p{field_class} is passed to one of: + +- bt_stream_class_set_packet_context_field_class() +- bt_stream_class_set_event_common_context_field_class() +- bt_event_class_set_specific_context_field_class() +- bt_event_class_set_payload_field_class() + +In the meantime, this function returns \c NULL. + +@param[in] field_class + Variant field class from which to borrow the selector field path. + +@returns + Selector field path of \bt_p{field_class}. + +@bt_pre_not_null{field_class} +@bt_pre_is_var_ws_fc{field_class} +*/ +extern const bt_field_path * +bt_field_class_variant_with_selector_field_borrow_selector_field_path_const( + const bt_field_class *field_class); + +/*! @} */ + +/*! +@name Variant field class with an unsigned integer selector field +@{ +*/ + +/*! +@brief + Appends an option to the \bt_var_fc (with an unsigned integer + selector field) \bt_p{field_class} having the name \bt_p{name}, + the field class \bt_p{option_field_class}, and the + \bt_p_uint_rg \bt_p{ranges}. + +See the \ref api-tir-fc-var-prop-opts "options" property. + +@param[in] field_class + Variant field class to which to append an option having + the name \bt_p{name}, the field class \bt_p{option_field_class}, + and the unsigned integer ranges \bt_p{ranges}. +@param[in] name + Name of the option to append to \bt_p{field_class} (copied). +@param[in] option_field_class + Field class of the option to append to \bt_p{field_class}. +@param[in] ranges + Unsigned integer ranges of the option to append to + \bt_p{field_class}. + +@retval #BT_FIELD_CLASS_VARIANT_WITH_SELECTOR_FIELD_APPEND_OPTION_STATUS_OK + Success. +@retval #BT_FIELD_CLASS_VARIANT_WITH_SELECTOR_FIELD_APPEND_OPTION_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{field_class} +@bt_pre_hot{field_class} +@bt_pre_is_var_wuis_fc{field_class} +@pre + \bt_p{field_class} has no option with the name \bt_p{name}. +@bt_pre_not_null{name} +@bt_pre_not_null{option_field_class} +@bt_pre_fc_not_in_tc{option_field_class} +@bt_pre_not_null{ŗanges} +@pre + \bt_p{ranges} contains one or more unsigned integer ranges. +@pre + The unsigned integer ranges in \bt_p{ranges} do not overlap + any unsigned integer range of any existing option in + \bt_p{field_class}. + +@bt_post_success_frozen{option_field_class} +*/ extern bt_field_class_variant_with_selector_field_integer_append_option_status bt_field_class_variant_with_selector_field_integer_unsigned_append_option( - bt_field_class *var_field_class, const char *name, - bt_field_class *field_class, - const bt_integer_range_set_unsigned *range_set); + bt_field_class *field_class, const char *name, + bt_field_class *option_field_class, + const bt_integer_range_set_unsigned *ranges); + +/*! +@brief + Borrows the option at index \bt_p{index} from the + \bt_var_fc (with an unsigned integer selector field) + \bt_p{field_class}. + +See the \ref api-tir-fc-var-prop-opts "options" property. + +@param[in] field_class + Variant field class from which to borrow the option at + index \bt_p{index}. +@param[in] index + Index of the option to borrow from \bt_p{field_class}. + +@returns + @parblock + \em Borrowed reference of the option of + \bt_p{field_class} at index \bt_p{index}. + + The returned pointer remains valid as long as \bt_p{field_class} + is not modified. + @endparblock + +@bt_pre_not_null{field_class} +@bt_pre_is_var_wuis_fc{field_class} +@pre + \bt_p{index} is less than the number of options in + \bt_p{field_class} (as returned by + bt_field_class_variant_get_option_count()). + +@sa bt_field_class_variant_get_option_count() — + Returns the number of options contained in a variant field class. +*/ +extern const bt_field_class_variant_with_selector_field_integer_unsigned_option * +bt_field_class_variant_with_selector_field_integer_unsigned_borrow_option_by_index_const( + const bt_field_class *field_class, uint64_t index); + +/*! +@brief + Borrows the option having the name \bt_p{name} from the + \bt_var_fc (with an unsigned integer selector field) + \bt_p{field_class}. + +See the \ref api-tir-fc-var-prop-opts "options" property. + +If there's no option having the name \bt_p{name} in +\bt_p{field_class}, this function returns \c NULL. + +@param[in] field_class + Variant field class from which to borrow the option having the + name \bt_p{name}. +@param[in] name + Name of the option to borrow from \bt_p{field_class}. + +@returns + @parblock + \em Borrowed reference of the option of + \bt_p{field_class} having the name \bt_p{name}, or \c NULL + if none. + + The returned pointer remains valid as long as \bt_p{field_class} + is not modified. + @endparblock + +@bt_pre_not_null{field_class} +@bt_pre_is_var_wuis_fc{field_class} +@bt_pre_not_null{name} + +@sa bt_field_class_variant_borrow_option_by_name_const() — + Borrows an option by name from a variant field class. +*/ +extern const bt_field_class_variant_with_selector_field_integer_unsigned_option * +bt_field_class_variant_with_selector_field_integer_unsigned_borrow_option_by_name_const( + const bt_field_class *field_class, const char *name); + +/*! @} */ + +/*! +@name Variant field class (with an unsigned integer selector field) option +@{ +*/ + +/*! +@typedef struct bt_field_class_variant_with_selector_field_integer_unsigned_option bt_field_class_variant_with_selector_field_integer_unsigned_option; + +@brief + Variant field class (with an unsigned integer selector field) option. +*/ + +/*! +@brief + Borrows the \bt_p_uint_rg from the \bt_var_fc (with an unsigned + integer selector field) option \bt_p{option}. + +See the \ref api-tir-fc-var-prop-opts "options" property. + +@param[in] option + Variant field class option from which to borrow the + unsigned integer ranges. + +@returns + Unsigned integer ranges of \bt_p{option}. + +@bt_pre_not_null{option} +*/ +extern const bt_integer_range_set_unsigned * +bt_field_class_variant_with_selector_field_integer_unsigned_option_borrow_ranges_const( + const bt_field_class_variant_with_selector_field_integer_unsigned_option *option); + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the \bt_var_fc (with an + unsigned integer selector field) option \bt_p{option} to the + common #bt_field_class_variant_option type. + +See the \ref api-tir-fc-var-prop-opts "options" property. + +@param[in] option + @parblock + Variant field class option to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{option} as a common variant field class option. +*/ +static inline +const bt_field_class_variant_option * +bt_field_class_variant_with_selector_field_integer_unsigned_option_as_option_const( + const bt_field_class_variant_with_selector_field_integer_unsigned_option *option) +{ + return __BT_UPCAST_CONST(bt_field_class_variant_option, option); +} + +/*! @} */ + +/*! +@name Variant field class with a signed integer selector field +@{ +*/ + +/*! +@brief + Appends an option to the \bt_var_fc (with a signed integer + selector field) \bt_p{field_class} having the name \bt_p{name}, + the field class \bt_p{option_field_class}, and the + \bt_p_sint_rg \bt_p{ranges}. + +See the \ref api-tir-fc-var-prop-opts "options" property. +@param[in] field_class + Variant field class to which to append an option having + the name \bt_p{name} and the field class \bt_p{option_field_class}, + and the signed integer ranges \bt_p{ranges}. +@param[in] name + Name of the option to append to \bt_p{field_class} (copied). +@param[in] option_field_class + Field class of the option to append to \bt_p{field_class}. +@param[in] ranges + Signed integer ranges of the option to append to + \bt_p{field_class}. + +@retval #BT_FIELD_CLASS_VARIANT_WITH_SELECTOR_FIELD_APPEND_OPTION_STATUS_OK + Success. +@retval #BT_FIELD_CLASS_VARIANT_WITH_SELECTOR_FIELD_APPEND_OPTION_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{field_class} +@bt_pre_hot{field_class} +@bt_pre_is_var_wsis_fc{field_class} +@pre + \bt_p{field_class} has no option with the name \bt_p{name}. +@bt_pre_not_null{name} +@bt_pre_not_null{option_field_class} +@bt_pre_fc_not_in_tc{option_field_class} +@bt_pre_not_null{ŗanges} +@pre + \bt_p{ranges} contains one or more signed integer ranges. +@pre + The signed integer ranges in \bt_p{ranges} do not overlap with + any signed integer range of any existing option in + \bt_p{field_class}. + +@bt_post_success_frozen{option_field_class} +*/ extern bt_field_class_variant_with_selector_field_integer_append_option_status bt_field_class_variant_with_selector_field_integer_signed_append_option( - bt_field_class *var_field_class, const char *name, - bt_field_class *field_class, - const bt_integer_range_set_signed *range_set); + bt_field_class *field_class, const char *name, + bt_field_class *option_field_class, + const bt_integer_range_set_signed *ranges); -extern bt_field_class_variant_option * -bt_field_class_variant_borrow_option_by_index( - bt_field_class *field_class, uint64_t index); +/*! +@brief + Borrows the option at index \bt_p{index} from the + \bt_var_fc (with a signed integer selector field) + \bt_p{field_class}. -extern bt_field_class_variant_option * -bt_field_class_variant_borrow_option_by_name( - bt_field_class *field_class, const char *name); +See the \ref api-tir-fc-var-prop-opts "options" property. -extern bt_field_class *bt_field_class_variant_option_borrow_field_class( - bt_field_class_variant_option *option); +@param[in] field_class + Variant field class from which to borrow the option at + index \bt_p{index}. +@param[in] index + Index of the option to borrow from \bt_p{field_class}. -extern bt_value *bt_field_class_variant_option_borrow_user_attributes( - bt_field_class_variant_option *option); +@returns + @parblock + \em Borrowed reference of the option of + \bt_p{field_class} at index \bt_p{index}. -extern void bt_field_class_variant_option_set_user_attributes( - bt_field_class_variant_option *option, - const bt_value *user_attributes); + The returned pointer remains valid as long as \bt_p{field_class} + is not modified. + @endparblock + +@bt_pre_not_null{field_class} +@bt_pre_is_var_wsis_fc{field_class} +@pre + \bt_p{index} is less than the number of options in + \bt_p{field_class} (as returned by + bt_field_class_variant_get_option_count()). + +@sa bt_field_class_variant_get_option_count() — + Returns the number of options contained in a variant field class. +*/ +extern const bt_field_class_variant_with_selector_field_integer_signed_option * +bt_field_class_variant_with_selector_field_integer_signed_borrow_option_by_index_const( + const bt_field_class *field_class, uint64_t index); + +/*! +@brief + Borrows the option having the name \bt_p{name} from the + \bt_var_fc (with a signed integer selector field) + \bt_p{field_class}. + +See the \ref api-tir-fc-var-prop-opts "options" property. + +If there's no option having the name \bt_p{name} in +\bt_p{field_class}, this function returns \c NULL. + +@param[in] field_class + Variant field class from which to borrow the option having the + name \bt_p{name}. +@param[in] name + Name of the option to borrow from \bt_p{field_class}. + +@returns + @parblock + \em Borrowed reference of the option of + \bt_p{field_class} having the name \bt_p{name}, or \c NULL + if none. + + The returned pointer remains valid as long as \bt_p{field_class} + is not modified. + @endparblock + +@bt_pre_not_null{field_class} +@bt_pre_is_var_wsis_fc{field_class} +@bt_pre_not_null{name} + +@sa bt_field_class_variant_borrow_option_by_name_const() — + Borrows an option by name from a variant field class. +*/ +extern const bt_field_class_variant_with_selector_field_integer_signed_option * +bt_field_class_variant_with_selector_field_integer_signed_borrow_option_by_name_const( + const bt_field_class *field_class, const char *name); + +/*! @} */ + +/*! +@name Variant field class (with a signed integer selector field) option +@{ +*/ + +/*! +@typedef struct bt_field_class_variant_with_selector_field_integer_signed_option bt_field_class_variant_with_selector_field_integer_signed_option; + +@brief + Variant field class (with a signed integer selector field) option. +*/ + +/*! +@brief + Borrows the \bt_p_sint_rg from the \bt_var_fc (with a signed + integer selector field) option \bt_p{option}. + +See the \ref api-tir-fc-var-prop-opts "options" property. + +@param[in] option + Variant field class option from which to borrow the + signed integer ranges. + +@returns + Signed integer ranges of \bt_p{option}. + +@bt_pre_not_null{option} +*/ +extern const bt_integer_range_set_signed * +bt_field_class_variant_with_selector_field_integer_signed_option_borrow_ranges_const( + const bt_field_class_variant_with_selector_field_integer_signed_option *option); + +/*! +@brief + \ref api-fund-c-typing "Upcasts" the \bt_var_fc (with a signed + integer selector field) option \bt_p{option} to the + common #bt_field_class_variant_option type. + +See the \ref api-tir-fc-var-prop-opts "options" property. + +@param[in] option + @parblock + Variant field class option to upcast. + + Can be \c NULL. + @endparblock + +@returns + \bt_p{option} as a common variant field class option. +*/ +static inline +const bt_field_class_variant_option * +bt_field_class_variant_with_selector_field_integer_signed_option_as_option_const( + const bt_field_class_variant_with_selector_field_integer_signed_option *option) +{ + return __BT_UPCAST_CONST(bt_field_class_variant_option, option); +} + +/*! @} */ + +/*! +@name Reference count +@{ +*/ + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the field class \bt_p{field_class}. + +@param[in] field_class + @parblock + Field class of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_field_class_put_ref() — + Decrements the reference count of a field class. +*/ +extern void bt_field_class_get_ref(const bt_field_class *field_class); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the field class \bt_p{field_class}. + +@param[in] field_class + @parblock + Field class of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_field_class_get_ref() — + Increments the reference count of a field class. +*/ +extern void bt_field_class_put_ref(const bt_field_class *field_class); + +/*! +@brief + Decrements the reference count of the field class + \bt_p{_field_class}, and then sets \bt_p{_field_class} to \c NULL. + +@param _field_class + @parblock + Field class of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_field_class} +*/ +#define BT_FIELD_CLASS_PUT_REF_AND_RESET(_field_class) \ + do { \ + bt_field_class_put_ref(_field_class); \ + (_field_class) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the field class \bt_p{_dst}, sets + \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} to \c NULL. + +This macro effectively moves a field class reference from the expression +\bt_p{_src} to the expression \bt_p{_dst}, putting the existing +\bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_FIELD_CLASS_MOVE_REF(_dst, _src) \ + do { \ + bt_field_class_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! @} */ #ifdef __cplusplus } diff --git a/include/babeltrace2/trace-ir/field-const.h b/include/babeltrace2/trace-ir/field-const.h deleted file mode 100644 index c6529df2..00000000 --- a/include/babeltrace2/trace-ir/field-const.h +++ /dev/null @@ -1,118 +0,0 @@ -#ifndef BABELTRACE2_TRACE_IR_FIELD_CONST_H -#define BABELTRACE2_TRACE_IR_FIELD_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern const bt_field_class *bt_field_borrow_class_const( - const bt_field *field); - -extern bt_field_class_type bt_field_get_class_type( - const bt_field *field); - -extern bt_bool bt_field_bool_get_value(const bt_field *field); - -extern uint64_t bt_field_bit_array_get_value_as_integer( - const bt_field *field); - -extern int64_t bt_field_integer_signed_get_value(const bt_field *field); - -extern uint64_t bt_field_integer_unsigned_get_value( - const bt_field *field); - -extern float bt_field_real_single_precision_get_value(const bt_field *field); - -extern double bt_field_real_double_precision_get_value(const bt_field *field); - -typedef enum bt_field_enumeration_get_mapping_labels_status { - BT_FIELD_ENUMERATION_GET_MAPPING_LABELS_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, - BT_FIELD_ENUMERATION_GET_MAPPING_LABELS_STATUS_OK = __BT_FUNC_STATUS_OK, -} bt_field_enumeration_get_mapping_labels_status; - -extern bt_field_enumeration_get_mapping_labels_status -bt_field_enumeration_unsigned_get_mapping_labels(const bt_field *field, - bt_field_class_enumeration_mapping_label_array *label_array, - uint64_t *count); - -extern bt_field_enumeration_get_mapping_labels_status -bt_field_enumeration_signed_get_mapping_labels(const bt_field *field, - bt_field_class_enumeration_mapping_label_array *label_array, - uint64_t *count); - -extern const char *bt_field_string_get_value(const bt_field *field); - -extern uint64_t bt_field_string_get_length(const bt_field *field); - -extern const bt_field * -bt_field_structure_borrow_member_field_by_index_const( - const bt_field *field, uint64_t index); - -extern const bt_field * -bt_field_structure_borrow_member_field_by_name_const( - const bt_field *field, const char *name); - -extern uint64_t bt_field_array_get_length(const bt_field *field); - -extern const bt_field * -bt_field_array_borrow_element_field_by_index_const( - const bt_field *field, uint64_t index); - -extern const bt_field * -bt_field_option_borrow_field_const(const bt_field *field); - -extern uint64_t bt_field_variant_get_selected_option_index( - const bt_field *field); - -extern const bt_field * -bt_field_variant_borrow_selected_option_field_const( - const bt_field *field); - -extern const bt_field_class_variant_option * -bt_field_variant_borrow_selected_option_class_const( - const bt_field *field); - -extern const bt_field_class_variant_with_selector_field_integer_unsigned_option * -bt_field_variant_with_selector_field_integer_unsigned_borrow_selected_option_class_const( - const bt_field *field); - -extern const bt_field_class_variant_with_selector_field_integer_signed_option * -bt_field_variant_with_selector_field_integer_signed_borrow_selected_option_class_const( - const bt_field *field); - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_TRACE_IR_FIELD_CONST_H */ diff --git a/include/babeltrace2/trace-ir/field-path-const.h b/include/babeltrace2/trace-ir/field-path-const.h deleted file mode 100644 index 06dfe052..00000000 --- a/include/babeltrace2/trace-ir/field-path-const.h +++ /dev/null @@ -1,87 +0,0 @@ -#ifndef BABELTRACE2_TRACE_IR_FIELD_PATH_CONST_H -#define BABELTRACE2_TRACE_IR_FIELD_PATH_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum bt_field_path_item_type { - BT_FIELD_PATH_ITEM_TYPE_INDEX = 1 << 0, - BT_FIELD_PATH_ITEM_TYPE_CURRENT_ARRAY_ELEMENT = 1 << 1, - BT_FIELD_PATH_ITEM_TYPE_CURRENT_OPTION_CONTENT = 1 << 2, -} bt_field_path_item_type; - -typedef enum bt_field_path_scope { - BT_FIELD_PATH_SCOPE_PACKET_CONTEXT = 0, - BT_FIELD_PATH_SCOPE_EVENT_COMMON_CONTEXT = 1, - BT_FIELD_PATH_SCOPE_EVENT_SPECIFIC_CONTEXT = 2, - BT_FIELD_PATH_SCOPE_EVENT_PAYLOAD = 3, -} bt_field_path_scope; - -extern bt_field_path_scope bt_field_path_get_root_scope( - const bt_field_path *field_path); - -extern uint64_t bt_field_path_get_item_count( - const bt_field_path *field_path); - -extern const bt_field_path_item *bt_field_path_borrow_item_by_index_const( - const bt_field_path *field_path, uint64_t index); - -extern bt_field_path_item_type bt_field_path_item_get_type( - const bt_field_path_item *field_path_item); - -extern uint64_t bt_field_path_item_index_get_index( - const bt_field_path_item *field_path_item); - -extern void bt_field_path_get_ref(const bt_field_path *field_path); - -extern void bt_field_path_put_ref(const bt_field_path *field_path); - -#define BT_FIELD_PATH_PUT_REF_AND_RESET(_var) \ - do { \ - bt_field_path_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_FIELD_PATH_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_field_path_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_TRACE_IR_FIELD_PATH_CONST_H */ diff --git a/include/babeltrace2/trace-ir/field-path.h b/include/babeltrace2/trace-ir/field-path.h new file mode 100644 index 00000000..fdb17e75 --- /dev/null +++ b/include/babeltrace2/trace-ir/field-path.h @@ -0,0 +1,471 @@ +#ifndef BABELTRACE2_TRACE_IR_FIELD_PATH_H +#define BABELTRACE2_TRACE_IR_FIELD_PATH_H + +/* + * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef __BT_IN_BABELTRACE_H +# error "Please include instead." +#endif + +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*! +@defgroup api-tir-field-path Field path +@ingroup api-tir + +@brief + Path to a \bt_field. + +A field path indicates how to reach a given +\bt_field from a given root scope. + +More specifically, a field path indicates how to reach: + +- The length field of a \bt_darray_field (with a length field). +- The selector field of a \bt_opt_field (with a selector field). +- The selector field of a \bt_var_field (with a selector field). + +You can borrow the field path from the \ref api-tir-fc "classes" of such +fields with +bt_field_class_array_dynamic_with_length_field_borrow_length_field_path_const(), +bt_field_class_option_with_selector_field_borrow_selector_field_path_const(), +and +bt_field_class_variant_with_selector_field_borrow_selector_field_path_const(). +Note that the field path properties of those field classes only becomes +available when the field class becomes part of an \bt_ev_cls or of a +\bt_stream_cls. See +\ref api-tir-fc-link "Field classes with links to other field classes". + +A field path is a \ref api-tir "trace IR" metadata object. + +A field path is a \ref api-fund-shared-object "shared object": get a +new reference with bt_field_path_get_ref() and put an existing +reference with bt_field_path_put_ref(). + +The type of a field path is #bt_field_path. + +

    Properties

    + +A field path has the following properties: + +
    +
    + \anchor api-tir-field-path-prop-root + Root scope +
    +
    + Indicates from which \bt_struct_field to start a lookup. + + See \ref api-tir-field-path-lookup-algo "Lookup algorithm" to + learn more. + + Get a field path's root scope with bt_field_path_get_root_scope(). +
    + +
    + \anchor api-tir-field-path-prop-items + Items +
    +
    + Each item in a field path's item list indicates which action to take + to follow the path to the linked \bt_field. + + See \ref api-tir-field-path-lookup-algo "Lookup algorithm" to + learn more. + + Get the number of items in a field path with + bt_field_path_get_item_count(). + + Borrow an item from a field path with + bt_field_path_borrow_item_by_index_const(). This function + returns the #bt_field_path_item type. + + A field path item is a \ref api-fund-unique-object "unique object": + it belongs to the field path which contains it. +
    +
    + +

    \anchor api-tir-field-path-lookup-algo Lookup algorithm

    + +The field resolution algorithm using a field path is: + +-# Use the appropriate function to set a current field variable + from the root scope (as returned by bt_field_path_get_root_scope()): + +
    +
    #BT_FIELD_PATH_SCOPE_PACKET_CONTEXT
    +
    + bt_packet_borrow_context_field_const(). +
    +
    #BT_FIELD_PATH_SCOPE_EVENT_COMMON_CONTEXT
    +
    + bt_event_borrow_common_context_field_const(). +
    +
    #BT_FIELD_PATH_SCOPE_EVENT_SPECIFIC_CONTEXT
    +
    + bt_event_borrow_specific_context_field_const(). +
    +
    #BT_FIELD_PATH_SCOPE_EVENT_PAYLOAD
    +
    + bt_event_borrow_payload_field_const(). +
    +
    + +-# For each field path item (use bt_field_path_get_item_count() + and bt_field_path_borrow_item_by_index_const()), depending on + the item's type (as returned by bt_field_path_item_get_type()): + +
    +
    #BT_FIELD_PATH_ITEM_TYPE_INDEX
    +
    + Call bt_field_path_item_index_get_index() to get the item's + index value. + + Depending on the current field's class's type (as + returned by bt_field_get_class_type()): + +
    +
    \bt_c_struct_fc
    +
    + Call bt_field_structure_borrow_member_field_by_index_const() + with the current field and with the item's index to set the + new current field. +
    + +
    \bt_c_var_fc
    +
    + Call bt_field_variant_borrow_selected_option_field_const() + with the current field to set the new current field. +
    +
    +
    + +
    #BT_FIELD_PATH_ITEM_TYPE_CURRENT_ARRAY_ELEMENT
    +
    + Call bt_field_array_borrow_element_field_by_index_const() + with the index of the field eventually containing the + field with a link (\bt_darray_field, \bt_opt_field, or + \bt_var_field) and the current field to set the new current + field. +
    + +
    #BT_FIELD_PATH_ITEM_TYPE_CURRENT_OPTION_CONTENT
    +
    + Call bt_field_option_borrow_field_const() with the current + field to set the new current field. +
    +
    + +After applying this procedure, the current field is the linked +field. +*/ + +/*! @{ */ + +/*! +@name Field path +@{ + +@typedef struct bt_field_path bt_field_path; + +@brief + Field path. + +*/ + +/*! +@brief + Field path scopes. +*/ +typedef enum bt_field_path_scope { + /*! + @brief + Packet context. + */ + BT_FIELD_PATH_SCOPE_PACKET_CONTEXT = 0, + + /*! + @brief + Event common context. + */ + BT_FIELD_PATH_SCOPE_EVENT_COMMON_CONTEXT = 1, + + /*! + @brief + Event specific context. + */ + BT_FIELD_PATH_SCOPE_EVENT_SPECIFIC_CONTEXT = 2, + + /*! + @brief + Event payload. + */ + BT_FIELD_PATH_SCOPE_EVENT_PAYLOAD = 3, +} bt_field_path_scope; + +/*! +@brief + Returns the root scope of the field path \bt_p{field_path}. + +See the \ref api-tir-field-path-prop-root "root scope" property. + +@param[in] field_path + Field path of which to get the root scope. + +@returns + Root scope of \bt_p{field_path}. + +@bt_pre_not_null{field_path} +*/ +extern bt_field_path_scope bt_field_path_get_root_scope( + const bt_field_path *field_path); + +/*! +@brief + Returns the number of items contained in the field path + \bt_p{field_path}. + +See the \ref api-tir-field-path-prop-items "items" property. + +@param[in] field_path + Field path of which to get the number of contained items. + +@returns + Number of contained items in \bt_p{field_path}. + +@bt_pre_not_null{field_path} +*/ +extern uint64_t bt_field_path_get_item_count( + const bt_field_path *field_path); + +/*! +@brief + Borrows the item at index \bt_p{index} from the + field path \bt_p{field_path}. + +See the \ref api-tir-field-path-prop-items "items" property. + +@param[in] field_path + Field path from which to borrow the item at index \bt_p{index}. +@param[in] index + Index of the item to borrow from \bt_p{field_path}. + +@returns + @parblock + \em Borrowed reference of the item of + \bt_p{field_path} at index \bt_p{index}. + + The returned pointer remains valid as long as \bt_p{field_path} + exists. + @endparblock + +@bt_pre_not_null{field_path} +@pre + \bt_p{index} is less than the number of items in + \bt_p{field_path} (as returned by bt_field_path_get_item_count()). + +@sa bt_field_path_get_item_count() — + Returns the number of items contained in a field path. +*/ +extern const bt_field_path_item *bt_field_path_borrow_item_by_index_const( + const bt_field_path *field_path, uint64_t index); + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the field path \bt_p{field_path}. + +@param[in] field_path + @parblock + Field path of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_field_path_put_ref() — + Decrements the reference count of a field path. +*/ +extern void bt_field_path_get_ref(const bt_field_path *field_path); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the field path \bt_p{field_path}. + +@param[in] field_path + @parblock + Field path of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_field_path_get_ref() — + Increments the reference count of a field path. +*/ +extern void bt_field_path_put_ref(const bt_field_path *field_path); + +/*! +@brief + Decrements the reference count of the field path + \bt_p{_field_path}, and then sets \bt_p{_field_path} to \c NULL. + +@param _field_path + @parblock + Field path of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_field_path} +*/ +#define BT_FIELD_PATH_PUT_REF_AND_RESET(_field_path) \ + do { \ + bt_field_path_put_ref(_field_path); \ + (_field_path) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the field path \bt_p{_dst}, sets + \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} to \c NULL. + +This macro effectively moves a field path reference from the expression +\bt_p{_src} to the expression \bt_p{_dst}, putting the existing +\bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_FIELD_PATH_MOVE_REF(_dst, _src) \ + do { \ + bt_field_path_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! +@name Field path item +@{ + +@typedef struct bt_field_path_item bt_field_path_item; + +@brief + Field path item. + +*/ + +/*! +@brief + Field path item type enumerators. +*/ +typedef enum bt_field_path_item_type { + /*! + @brief + Index of a \bt_struct_field member or selected \bt_var_field + option's field. + */ + BT_FIELD_PATH_ITEM_TYPE_INDEX = 1 << 0, + + /*! + @brief + Common field of an \bt_array_field. + */ + BT_FIELD_PATH_ITEM_TYPE_CURRENT_ARRAY_ELEMENT = 1 << 1, + + /*! + @brief + Current field of an \bt_opt_field. + */ + BT_FIELD_PATH_ITEM_TYPE_CURRENT_OPTION_CONTENT = 1 << 2, +} bt_field_path_item_type; + +/*! +@brief + Returns the type enumerator of the field path item + \bt_p{item}. + +See the \ref api-tir-field-path-prop-items "items" property. + +@param[in] item + Field path item of which to get the type enumerator + +@returns + Type enumerator of \bt_p{item}. + +@bt_pre_not_null{item} +*/ +extern bt_field_path_item_type bt_field_path_item_get_type( + const bt_field_path_item *item); + +/*! +@brief + Returns the index value of the index field path item + \bt_p{item}. + +See the \ref api-tir-field-path-prop-items "items" property. + +@param[in] item + Index field path item of which to get the index value. + +@returns + Index value of \bt_p{item}. + +@bt_pre_not_null{item} +@pre + \bt_p{item} is an index field path item + (bt_field_path_item_get_type() returns + #BT_FIELD_PATH_ITEM_TYPE_INDEX). +*/ +extern uint64_t bt_field_path_item_index_get_index( + const bt_field_path_item *item); + +/*! @} */ + +/*! @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* BABELTRACE2_TRACE_IR_FIELD_PATH_H */ diff --git a/include/babeltrace2/trace-ir/field.h b/include/babeltrace2/trace-ir/field.h index f95298de..572118ee 100644 --- a/include/babeltrace2/trace-ir/field.h +++ b/include/babeltrace2/trace-ir/field.h @@ -35,79 +35,1502 @@ extern "C" { #endif +/*! +@defgroup api-tir-field Fields +@ingroup api-tir + +@brief + Containers of trace data. + +Fields are containers of trace data: they are +found in \bt_p_ev and \bt_p_pkt. + +Fields are instances of \bt_p_fc: + +@image html field-class-zoom.png + +Borrow the class of a field with bt_field_borrow_class() and +bt_field_borrow_class_const(). + +Fields are \ref api-tir "trace IR" data objects. + +There are many types of fields. They can be divided into two main +categories: + +
    +
    Scalar
    +
    + Fields which contain a simple value. + + The scalar fields are: + + - \ref api-tir-field-bool "Boolean" + - \ref api-tir-field-ba "Bit array" + - \ref api-tir-field-int "Integer" (unsigned and signed) + - \ref api-tir-field-enum "Enumeration" (unsigned and signed) + - \ref api-tir-field-real "Real" (single-precision and double-precision) + - \ref api-tir-field-string "String" +
    + +
    Container
    +
    + Fields which contain other fields. + + The container fields are: + + - \ref api-tir-field-array "Array" (static and dynamic) + - \ref api-tir-field-struct "Structure" + - \ref api-tir-field-opt "Option" + - \ref api-tir-field-var "Variant" +
    +
    + +@image html fc-to-field.png "Fields (green) are instances of field classes (orange)." + +You cannot directly create a field: there are no +bt_field_*_create() functions. The \bt_name library +creates fields within an \bt_ev or a \bt_pkt from \bt_p_fc. +Therefore, to fill the payload fields of an \bt_ev, you must first +borrow the event's existing payload \bt_struct_field with +bt_event_borrow_payload_field() and then borrow each field, recursively, +to set their values. + +The functions to borrow a field from an event or a packet are: + +- bt_packet_borrow_context_field() and + bt_packet_borrow_context_field_const() +- bt_event_borrow_common_context_field() and + bt_event_borrow_common_context_field_const() +- bt_event_borrow_specific_context_field() and + bt_event_borrow_specific_context_field_const() +- bt_event_borrow_payload_field() and + bt_event_borrow_payload_field_const() + +Some fields conceptually inherit other fields, eventually +making an inheritance hierarchy. For example, an \bt_enum_field +\em is an \bt_int_field. Therefore, an enumeration field holds an +integral value, just like an integer field does. + +The complete field inheritance hierarchy is: + +@image html all-fields.png + +This is the same inheritance hierarchy as the \bt_fc inheritance +hierarchy. + +In the illustration above: + +- A field with a dark background is instantiated from a concrete \bt_fc, + which you can directly create with a dedicated + bt_field_class_*_create() function. + +- A field with a pale background is an \em abstract field: it's not a + concrete instance, but it can have properties, therefore there can be + functions which apply to it. + + For example, bt_field_integer_signed_set_value() applies to any + \bt_sint_field. + +Fields are \ref api-fund-unique-object "unique objects": they belong +to an \bt_ev or to a \bt_pkt. + +Some library functions \ref api-fund-freezing "freeze" fields on +success. The documentation of those functions indicate this +postcondition. + +All the field types share the same C type, #bt_field. + +Get the type enumerator of a field's class with bt_field_get_class_type(). +Get whether or not a field class type conceptually \em is a given type +with the inline bt_field_class_type_is() function. + +

    \anchor api-tir-field-bool Boolean field

    + +A boolean field is a \bt_bool_fc instance. + +A boolean field contains a boolean value (#BT_TRUE or #BT_FALSE). + +Set the value of a boolean field with bt_field_bool_set_value(). + +Get the value of a boolean field with bt_field_bool_get_value(). + +

    \anchor api-tir-field-ba Bit array field

    + +A bit array field is a \bt_ba_fc instance. + +A bit array field contains a fixed-length array of bits. Its length +is \ref api-tir-fc-ba-prop-len "given by its class". + +The bit array field API interprets the array as an unsigned integer +value: the least significant bit's index is 0. + +For example, to get whether or not bit 3 of a bit array field is +set: + +@code +uint64_t value = bt_field_bit_array_get_value_as_integer(field); + +if (value & (UINT64_C(1) << UINT64_C(3))) { + // Bit 3 is set +} +@endcode + +Set the bits of a bit array field with +bt_field_bit_array_set_value_as_integer(). + +Get the bits of a bit array field with +bt_field_bit_array_get_value_as_integer(). + +

    \anchor api-tir-field-int Integer fields

    + +Integer fields are \bt_int_fc instances. + +Integer fields contain integral values. + +An integer field is an \em abstract field. The concrete integer fields +are: + +
    +
    Unsigned integer field
    +
    + An \bt_uint_fc instance. + + An unsigned integer field contains an unsigned integral value + (\c uint64_t). + + Set the value of an unsigned integer field with + bt_field_integer_unsigned_set_value(). + + Get the value of an unsigned integer field with + bt_field_integer_unsigned_get_value(). +
    + +
    Signed integer field
    +
    + A \bt_sint_fc instance. + + A signed integer field contains a signed integral value (\c int64_t). + + Set the value of a signed integer field with + bt_field_integer_signed_set_value(). + + Get the value of a signed integer field with + bt_field_integer_signed_get_value(). +
    +
    + +

    \anchor api-tir-field-enum Enumeration fields

    + +Enumeration fields are \bt_enum_fc instances. + +Enumeration fields \em are \bt_p_int_field: they contain integral +values. + +An enumeration field is an \em abstract field. +The concrete enumeration fields are: + +
    +
    Unsigned enumeration field
    +
    + An \bt_uenum_fc instance. + + An unsigned enumeration field contains an unsigned integral value + (\c uint64_t). + + Set the value of an unsigned enumeration field with + bt_field_integer_unsigned_set_value(). + + Get the value of an unsigned enumeration field with + bt_field_integer_unsigned_get_value(). + + Get all the enumeration field class labels mapped to the value of a + given unsigned enumeration field with + bt_field_enumeration_unsigned_get_mapping_labels(). +
    + +
    Signed enumeration field
    +
    + A \bt_senum_fc instance. + + A signed enumeration field contains a signed integral value + (\c int64_t). + + Set the value of a signed enumeration field with + bt_field_integer_signed_set_value(). + + Get the value of a signed enumeration field with + bt_field_integer_signed_get_value(). + + Get all the enumeration field class labels mapped to the value of a + given signed enumeration field with + bt_field_enumeration_signed_get_mapping_labels(). +
    +
    + +

    \anchor api-tir-field-real Real fields

    + +Real fields are \bt_real_fc instances. + +Real fields contain +real +values (\c float or \c double types). + +A real field is an \em abstract field. The concrete real fields are: + +
    +
    Single-precision real field
    +
    + A single-precision real field class instance. + + A single-precision real field contains a \c float value. + + Set the value of a single-precision real field with + bt_field_real_single_precision_set_value(). + + Get the value of a single-precision real field with + bt_field_real_single_precision_get_value(). +
    + +
    Double-precision real field
    +
    + A double-precision real field class instance. + + A double-precision real field contains a \c double value. + + Set the value of a double-precision real field with + bt_field_real_double_precision_set_value(). + + Get the value of a double-precision real field with + bt_field_real_double_precision_get_value(). +
    +
    + +

    \anchor api-tir-field-string String field

    + +A string field is a \bt_string_fc instance. + +A string field contains an UTF-8 string value. + +Set the value of a string field with +bt_field_string_set_value(). + +Get the value of a string field with +bt_field_string_get_value(). + +Get the length of a string field with +bt_field_string_get_length(). + +Append a string to a string field's current value with +bt_field_string_append() and bt_field_string_append_with_length(). + +Clear a string field with bt_field_string_clear(). + +

    \anchor api-tir-field-array Array fields

    + +Array fields are \bt_array_fc instances. + +Array fields contain zero or more fields which have the same class. + +An array field is an \em abstract field. The concrete array fields are: + +
    +
    Static array field
    +
    + A \bt_sarray_fc instance. + + A static array field contains a fixed number of fields. Its length + is \ref api-tir-fc-sarray-prop-len "given by its class". +
    + +
    Dynamic array field class
    +
    + A \bt_darray_fc instance. + + A dynamic array field contains a variable number of fields, that is, + each instance of the same dynamic array field class can contain a + different number of elements. + + Set a dynamic array field's length with + bt_field_array_dynamic_set_length() before you borrow any of its + fields. +
    +
    + +Get an array field's length with bt_field_array_get_length(). + +Borrow a field from an array field at a given index with +bt_field_array_borrow_element_field_by_index() and +bt_field_array_borrow_element_field_by_index_const(). + +

    \anchor api-tir-field-struct Structure field

    + +A structure field is a \bt_struct_fc instance. + +A structure field contains an ordered list of zero or more members. A +structure field member contains a field: it's an instance of a structure +field class member. + +Borrow a member's field from a structure field at a given index with +bt_field_structure_borrow_member_field_by_index() and +bt_field_structure_borrow_member_field_by_index_const(). + +Borrow a member's field from a structure field by name with +bt_field_structure_borrow_member_field_by_name() and +bt_field_structure_borrow_member_field_by_name_const(). + +

    \anchor api-tir-field-opt Option field

    + +An option field is an \bt_opt_fc instance. + +An option field either does or doesn't contain a field. + +Set whether or not an option field has a field with +bt_field_option_set_has_field(). + +Borrow the field from an option field with +bt_field_option_borrow_field() or +bt_field_option_borrow_field_const(). + +

    \anchor api-tir-field-var Variant field

    + +A variant field is a \bt_var_fc instance. + +A variant field has a single selected option amongst one or more +possible options. A variant field option contains a field: it's an +instance of a variant field class option. + +Set the current option of a variant field with +bt_field_variant_select_option_by_index(). + +Get a variant field's selected option's index with +bt_field_variant_get_selected_option_index(). + +Borrow a variant field's selected option's field with +bt_field_variant_borrow_selected_option_field() and +bt_field_variant_borrow_selected_option_field_const(). + +Borrow the class of a variant field's selected +option with bt_field_variant_borrow_selected_option_class_const(), +bt_field_variant_with_selector_field_integer_unsigned_borrow_selected_option_class_const(), +and +bt_field_variant_with_selector_field_integer_signed_borrow_selected_option_class_const(). +*/ + +/*! @{ */ + +/*! +@name Type +@{ + +@typedef struct bt_field bt_field; + +@brief + Field. + +@} +*/ + +/*! +@name Type query +@{ +*/ + +/*! +@brief + Returns the type enumerator of the \ref api-tir-fc "class" of the + field \bt_p{field}. + +This function returns + +@code +bt_field_class_get_type(bt_field_borrow_class(field)) +@endcode + +@param[in] field + Field of which to get the class's type enumerator + +@returns + Type enumerator of the class of \bt_p{field}. + +@bt_pre_not_null{field} + +@sa bt_field_class_get_type() — + Returns the type enumerator of a \bt_fc. +*/ +extern bt_field_class_type bt_field_get_class_type( + const bt_field *field); + +/*! @} */ + +/*! +@name Class access +@{ +*/ + +/*! +@brief + Borrows the \ref api-tir-fc "class" of the field \bt_p{field}. + +@param[in] field + Field of which to borrow the class. + +@returns + \em Borrowed reference of the class of \bt_p{field}. + +@bt_pre_not_null{field} + +@sa bt_field_borrow_class_const() — + \c const version of this function. +*/ extern bt_field_class *bt_field_borrow_class(bt_field *field); +/*! +@brief + Borrows the \ref api-tir-fc "class" of the field \bt_p{field} + (\c const version). + +See bt_field_borrow_class(). +*/ +extern const bt_field_class *bt_field_borrow_class_const( + const bt_field *field); + +/*! @} */ + +/*! +@name Boolean field +@{ +*/ + +/*! +@brief + Sets the value of the \bt_bool_field \bt_p{field} to + \bt_p{value}. + +@param[in] field + Boolean field of which to set the value to \bt_p{value}. +@param[in] value + New value of \bt_p{field}. + +@bt_pre_not_null{field} +@bt_pre_is_bool_field{field} +@bt_pre_hot{field} + +@sa bt_field_bool_get_value() — + Returns the value of a boolean field. +*/ extern void bt_field_bool_set_value(bt_field *field, bt_bool value); +/*! +@brief + Returns the value of the \bt_bool_field \bt_p{field}. + +@param[in] field + Boolean field of which to get the value. + +@returns + Value of \bt_p{field}. + +@bt_pre_not_null{field} +@bt_pre_is_bool_field{field} + +@sa bt_field_bool_set_value() — + Sets the value of a boolean field. +*/ +extern bt_bool bt_field_bool_get_value(const bt_field *field); + +/*! @} */ + +/*! +@name Bit array field +@{ +*/ + +/*! +@brief + Sets the bits of the \bt_ba_field \bt_p{field} to the bits of + \bt_p{bits}. + +The least significant bit's index is 0. + +See \bt_c_ba_field to learn more. + +@param[in] field + Bit array field of which to set the bits to \bt_p{bits}. +@param[in] bits + New bits of \bt_p{field}. + +@bt_pre_not_null{field} +@bt_pre_is_ba_field{field} +@bt_pre_hot{field} + +@sa bt_field_bit_array_get_value_as_integer() — + Returns the bits of a bit array field as an integer. +*/ extern void bt_field_bit_array_set_value_as_integer(bt_field *field, + uint64_t bits); + +/*! +@brief + Returns the bits of the \bt_ba_field \bt_p{field} as an + unsigned integer. + +The least significant bit's index is 0. + +See \bt_c_ba_field to learn more. + +@param[in] field + Bit array field of which to get the bits. + +@returns + Bits of \bt_p{field} as an unsigned integer. + +@bt_pre_not_null{field} +@bt_pre_is_ba_field{field} + +@sa bt_field_bit_array_set_value_as_integer() — + Sets the bits of a bit array field from an integer. +*/ +extern uint64_t bt_field_bit_array_get_value_as_integer( + const bt_field *field); + +/*! @} */ + +/*! +@name Integer field +@{ +*/ + +/*! +@brief + Sets the value of the \bt_uint_field \bt_p{field} to + \bt_p{value}. + +@param[in] field + Unsigned integer field of which to set the value to \bt_p{value}. +@param[in] value + New value of \bt_p{field}. + +@bt_pre_not_null{field} +@bt_pre_is_uint_field{field} +@bt_pre_hot{field} +@pre + \bt_p{value} is within the + \ref api-tir-fc-int-prop-size "field value range" of the + class of \bt_p{field}. + +@sa bt_field_integer_unsigned_get_value() — + Returns the value of an unsigned integer field. +*/ +extern void bt_field_integer_unsigned_set_value(bt_field *field, uint64_t value); +/*! +@brief + Returns the value of the \bt_uint_field \bt_p{field}. + +@param[in] field + Unsigned integer field of which to get the value. + +@returns + Value of \bt_p{field}. + +@bt_pre_not_null{field} +@bt_pre_is_uint_field{field} + +@sa bt_field_integer_unsigned_set_value() — + Sets the value of an unsigned integer field. +*/ +extern uint64_t bt_field_integer_unsigned_get_value( + const bt_field *field); + +/*! +@brief + Sets the value of the \bt_sint_field \bt_p{field} to + \bt_p{value}. + +@param[in] field + Signed integer field of which to set the value to \bt_p{value}. +@param[in] value + New value of \bt_p{field}. + +@bt_pre_not_null{field} +@bt_pre_is_sint_field{field} +@bt_pre_hot{field} +@pre + \bt_p{value} is within the + \ref api-tir-fc-int-prop-size "field value range" of the + class of \bt_p{field}. + +@sa bt_field_integer_signed_get_value() — + Returns the value of an signed integer field. +*/ extern void bt_field_integer_signed_set_value(bt_field *field, int64_t value); -extern void bt_field_integer_unsigned_set_value(bt_field *field, - uint64_t value); +/*! +@brief + Returns the value of the \bt_sint_field \bt_p{field}. + +@param[in] field + Signed integer field of which to get the value. + +@returns + Value of \bt_p{field}. + +@bt_pre_not_null{field} +@bt_pre_is_sint_field{field} + +@sa bt_field_integer_signed_set_value() — + Sets the value of an signed integer field. +*/ +extern int64_t bt_field_integer_signed_get_value(const bt_field *field); + +/*! @} */ + +/*! +@name Enumeration field +@{ +*/ + +/*! +@brief + Status codes for + bt_field_enumeration_unsigned_get_mapping_labels() and + bt_field_enumeration_signed_get_mapping_labels(). +*/ +typedef enum bt_field_enumeration_get_mapping_labels_status { + /*! + @brief + Success. + */ + BT_FIELD_ENUMERATION_GET_MAPPING_LABELS_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_FIELD_ENUMERATION_GET_MAPPING_LABELS_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, +} bt_field_enumeration_get_mapping_labels_status; + +/*! +@brief + Returns an array of all the labels of the mappings of the + \ref api-tir-fc-enum "class" of the \bt_uenum_field \bt_p{field} + of which the \bt_p_uint_rg contain the integral value + of \bt_p{field}. + +This function returns + +@code +(bt_field_enumeration_get_mapping_labels_status) +bt_field_class_enumeration_unsigned_get_mapping_labels_for_value( + bt_field_borrow_class_const(field), + bt_field_integer_unsigned_get_value(field), + labels, count) +@endcode + +@param[in] field + Unsigned enumeration field having the class from which to get the + labels of the mappings of which the ranges contain its + integral value. +@param[out] labels + See + bt_field_class_enumeration_unsigned_get_mapping_labels_for_value(). +@param[out] count + See + bt_field_class_enumeration_unsigned_get_mapping_labels_for_value(). + +@retval #BT_FIELD_ENUMERATION_GET_MAPPING_LABELS_STATUS_OK + Success. +@retval #BT_FIELD_ENUMERATION_GET_MAPPING_LABELS_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{field} +@bt_pre_is_uenum_field{field} +@bt_pre_not_null{labels} +@bt_pre_not_null{count} +*/ +extern bt_field_enumeration_get_mapping_labels_status +bt_field_enumeration_unsigned_get_mapping_labels(const bt_field *field, + bt_field_class_enumeration_mapping_label_array *labels, + uint64_t *count); + +/*! +@brief + Returns an array of all the labels of the mappings of the + \ref api-tir-fc-enum "class" of the \bt_senum_field \bt_p{field} + of which the \bt_p_sint_rg contain the integral value + of \bt_p{field}. + +This function returns +@code +(bt_field_enumeration_get_mapping_labels_status) +bt_field_class_enumeration_signed_get_mapping_labels_for_value( + bt_field_borrow_class_const(field), + bt_field_integer_signed_get_value(field), + labels, count) +@endcode + +@param[in] field + Signed enumeration field having the class from which to get the + labels of the mappings of which the ranges contain its + integral value. +@param[out] labels + See + bt_field_class_enumeration_signed_get_mapping_labels_for_value(). +@param[out] count + See + bt_field_class_enumeration_signed_get_mapping_labels_for_value(). + +@retval #BT_FIELD_ENUMERATION_GET_MAPPING_LABELS_STATUS_OK + Success. +@retval #BT_FIELD_ENUMERATION_GET_MAPPING_LABELS_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{field} +@bt_pre_is_senum_field{field} +@bt_pre_not_null{labels} +@bt_pre_not_null{count} +*/ +extern bt_field_enumeration_get_mapping_labels_status +bt_field_enumeration_signed_get_mapping_labels(const bt_field *field, + bt_field_class_enumeration_mapping_label_array *labels, + uint64_t *count); + +/*! @} */ + +/*! +@name Real field +@{ +*/ + +/*! +@brief + Sets the value of the \bt_sreal_field \bt_p{field} to + \bt_p{value}. + +@param[in] field + Single-precision real field of which to set the value to + \bt_p{value}. +@param[in] value + New value of \bt_p{field}. + +@bt_pre_not_null{field} +@bt_pre_is_sreal_field{field} +@bt_pre_hot{field} + +@sa bt_field_real_single_precision_get_value() — + Returns the value of a single-precision real field. +*/ extern void bt_field_real_single_precision_set_value(bt_field *field, float value); +/*! +@brief + Returns the value of the \bt_sreal_field \bt_p{field}. + +@param[in] field + Single-precision real field of which to get the value. + +@returns + Value of \bt_p{field}. + +@bt_pre_not_null{field} +@bt_pre_is_sreal_field{field} + +@sa bt_field_real_single_precision_set_value() — + Sets the value of a single-precision real field. +*/ +extern float bt_field_real_single_precision_get_value(const bt_field *field); + +/*! +@brief + Sets the value of the \bt_dreal_field \bt_p{field} to + \bt_p{value}. + +@param[in] field + Double-precision real field of which to set the value to + \bt_p{value}. +@param[in] value + New value of \bt_p{field}. + +@bt_pre_not_null{field} +@bt_pre_is_dreal_field{field} +@bt_pre_hot{field} + +@sa bt_field_real_double_precision_get_value() — + Returns the value of a double-precision real field. +*/ extern void bt_field_real_double_precision_set_value(bt_field *field, double value); +/*! +@brief + Returns the value of the \bt_dreal_field \bt_p{field}. + +@param[in] field + Double-precision real field of which to get the value. + +@returns + Value of \bt_p{field}. + +@bt_pre_not_null{field} +@bt_pre_is_dreal_field{field} + +@sa bt_field_real_double_precision_set_value() — + Sets the value of a double-precision real field. +*/ +extern double bt_field_real_double_precision_get_value(const bt_field *field); + +/*! @} */ + +/*! +@name String field +@{ +*/ + +/*! +@brief + Status codes for bt_field_string_set_value(). +*/ typedef enum bt_field_string_set_value_status { - BT_FIELD_STRING_SET_VALUE_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + /*! + @brief + Success. + */ BT_FIELD_STRING_SET_VALUE_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_FIELD_STRING_SET_VALUE_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, } bt_field_string_set_value_status; +/*! +@brief + Sets the value of the \bt_string_field \bt_p{field} to + a copy of \bt_p{value}. + +@param[in] field + String field of which to set the value to \bt_p{value}. +@param[in] value + New value of \bt_p{field} (copied). + +@retval #BT_FIELD_STRING_SET_VALUE_STATUS_OK + Success. +@retval #BT_FIELD_STRING_SET_VALUE_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{field} +@bt_pre_is_string_field{field} +@bt_pre_hot{field} +@bt_pre_not_null{value} + +@sa bt_field_string_get_value() — + Returns the value of a string field. +@sa bt_field_string_append() — + Appends a string to a string field. +@sa bt_field_string_clear() — + Clears a string field. +*/ extern bt_field_string_set_value_status bt_field_string_set_value( bt_field *field, const char *value); +/*! +@brief + Returns the length of the \bt_string_field \bt_p{field}. + +@param[in] field + String field of which to get the length. + +@returns + Length of \bt_p{field}. + +@bt_pre_not_null{field} +@bt_pre_is_string_field{field} +*/ +extern uint64_t bt_field_string_get_length(const bt_field *field); + +/*! +@brief + Returns the value of the \bt_string_field \bt_p{field}. + +@param[in] field + String field of which to get the value. + +@returns + @parblock + Value of \bt_p{field}. + + The returned pointer remains valid until \bt_p{field} is modified. + @endparblock + +@bt_pre_not_null{field} +@bt_pre_is_string_field{field} + +@sa bt_field_string_set_value() — + Sets the value of a string field. +*/ +extern const char *bt_field_string_get_value(const bt_field *field); + +/*! +@brief + Status codes for bt_field_string_append() and + bt_field_string_append_with_length(). +*/ typedef enum bt_field_string_append_status { - BT_FIELD_STRING_APPEND_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + /*! + @brief + Success. + */ BT_FIELD_STRING_APPEND_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_FIELD_STRING_APPEND_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, } bt_field_string_append_status; +/*! +@brief + Appends a copy of the string \bt_p{value} to the current value of + the \bt_string_field \bt_p{field}. + +@attention + If you didn't set the value of \bt_p{field} yet, you must call + bt_field_string_clear() before you call this function. + +@param[in] field + String field to which to append the string \bt_p{value}. +@param[in] value + String to append to \bt_p{field} (copied). + +@retval #BT_FIELD_STRING_APPEND_STATUS_OK + Success. +@retval #BT_FIELD_STRING_APPEND_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{field} +@bt_pre_is_string_field{field} +@bt_pre_hot{field} +@bt_pre_not_null{value} + +@sa bt_field_string_append_with_length() — + Appends a string with a given length to a string field. +@sa bt_field_string_set_value() — + Sets the value of a string field. +*/ extern bt_field_string_append_status bt_field_string_append( bt_field *field, const char *value); +/*! +@brief + Appends a copy of the first \bt_p{length} bytes of the string + \bt_p{value} to the current value of the \bt_string_field + \bt_p{field}. + +@attention + If you didn't set the value of \bt_p{field} yet, you must call + bt_field_string_clear() before you call this function. + +@param[in] field + String field to which to append the first \bt_p{length} bytes of + the string \bt_p{value}. +@param[in] value + String of which to append the first \bt_p{length} bytes to + \bt_p{field} (copied). +@param[in] length + Number of bytes of \bt_p{value} to append to \bt_p{field}. + +@retval #BT_FIELD_STRING_APPEND_STATUS_OK + Success. +@retval #BT_FIELD_STRING_APPEND_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{field} +@bt_pre_is_string_field{field} +@bt_pre_hot{field} +@bt_pre_not_null{value} + +@sa bt_field_string_append() — + Appends a string to a string field. +@sa bt_field_string_set_value() — + Sets the value of a string field. +*/ extern bt_field_string_append_status bt_field_string_append_with_length( bt_field *field, const char *value, uint64_t length); +/*! +@brief + Clears the \bt_string_field \bt_p{field}, making its value an empty + string. + +@param[in] field + String field to clear. + +@bt_pre_not_null{field} +@bt_pre_is_string_field{field} +@bt_pre_hot{field} + +@sa bt_field_string_set_value() — + Sets the value of a string field. +*/ extern void bt_field_string_clear(bt_field *field); -extern bt_field *bt_field_structure_borrow_member_field_by_index( - bt_field *field, uint64_t index); +/*! @} */ -extern bt_field *bt_field_structure_borrow_member_field_by_name( - bt_field *field, const char *name); +/*! +@name Array field +@{ +*/ + +/*! +@brief + Returns the length of the \bt_array_field \bt_p{field}. + +@param[in] field + Array field of which to get the length. + +@returns + Length of \bt_p{field}. + +@bt_pre_not_null{field} +@bt_pre_is_array_field{field} +*/ +extern uint64_t bt_field_array_get_length(const bt_field *field); + +/*! +@brief + Borrows the field at index \bt_p{index} from the \bt_array_field + \bt_p{field}. +@attention + If \bt_p{field} is a dynamic array field, it must have a length + (call bt_field_array_dynamic_set_length()) before you call this + function. + +@param[in] field + Array field from which to borrow the field at index \bt_p{index}. +@param[in] index + Index of the field to borrow from \bt_p{field}. + +@returns + @parblock + \em Borrowed reference of the field of \bt_p{field} at index + \bt_p{index}. + + The returned pointer remains valid as long as \bt_p{field} exists. + @endparblock + +@bt_pre_not_null{field} +@bt_pre_is_array_field{field} +@pre + \bt_p{index} is less than the length of \bt_p{field} (as returned by + bt_field_array_get_length()). + +@sa bt_field_array_borrow_element_field_by_index_const() — + \c const version of this function. +*/ extern bt_field *bt_field_array_borrow_element_field_by_index( bt_field *field, uint64_t index); +/*! +@brief + Borrows the field at index \bt_p{index} from the \bt_array_field + \bt_p{field} (\c const version). + +See bt_field_array_borrow_element_field_by_index(). +*/ +extern const bt_field * +bt_field_array_borrow_element_field_by_index_const( + const bt_field *field, uint64_t index); + +/*! +@brief + Status codes for bt_field_array_dynamic_set_length(). +*/ typedef enum bt_field_array_dynamic_set_length_status { - BT_FIELD_DYNAMIC_ARRAY_SET_LENGTH_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + /*! + @brief + Success. + */ BT_FIELD_DYNAMIC_ARRAY_SET_LENGTH_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_FIELD_DYNAMIC_ARRAY_SET_LENGTH_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, } bt_field_array_dynamic_set_length_status; +/*! +@brief + Sets the length of the \bt_darray_field \bt_p{field}. + +@param[in] field + Dynamic array field of which to set the length. +@param[in] length + New length of \bt_p{field}. + +@retval #BT_FIELD_DYNAMIC_ARRAY_SET_LENGTH_STATUS_OK + Success. +@retval #BT_FIELD_DYNAMIC_ARRAY_SET_LENGTH_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{field} +@bt_pre_is_darray_field{field} +@bt_pre_hot{field} +*/ extern bt_field_array_dynamic_set_length_status -bt_field_array_dynamic_set_length( - bt_field *field, uint64_t length); +bt_field_array_dynamic_set_length(bt_field *field, uint64_t length); + +/*! @} */ + +/*! +@name Structure field +@{ +*/ + +/*! +@brief + Borrows the field of the member at index \bt_p{index} from the + \bt_struct_field \bt_p{field}. + +@param[in] field + Structure field from which to borrow the field of the member at + index \bt_p{index}. +@param[in] index + Index of the member containing the field to borrow from + \bt_p{field}. + +@returns + @parblock + \em Borrowed reference of the field of the member of \bt_p{field} at + index \bt_p{index}. + + The returned pointer remains valid as long as \bt_p{field} exists. + @endparblock + +@bt_pre_not_null{field} +@bt_pre_is_struct_field{field} +@pre + \bt_p{index} is less than the number of members in the + \ref api-tir-fc-struct "class" of \bt_p{field} (as + returned by bt_field_class_structure_get_member_count()). + +@sa bt_field_structure_borrow_member_field_by_index_const() — + \c const version of this function. +*/ +extern bt_field *bt_field_structure_borrow_member_field_by_index( + bt_field *field, uint64_t index); + +/*! +@brief + Borrows the field of the member at index \bt_p{index} from the + \bt_struct_field \bt_p{field} (\c const version). + +See bt_field_structure_borrow_member_field_by_index(). +*/ +extern const bt_field * +bt_field_structure_borrow_member_field_by_index_const( + const bt_field *field, uint64_t index); + +/*! +@brief + Borrows the field of the member having the name \bt_p{name} from the + \bt_struct_field \bt_p{field}. + +If there's no member having the name \bt_p{name} in the +\ref api-tir-fc-struct "class" of \bt_p{field}, this function +returns \c NULL. + +@param[in] field + Structure field from which to borrow the field of the member having + the name \bt_p{name}. +@param[in] name + Name of the member containing the field to borrow from \bt_p{field}. + +@returns + @parblock + \em Borrowed reference of the field of the member of \bt_p{field} + having the name \bt_p{name}, or \c NULL if none. + + The returned pointer remains valid as long as \bt_p{field} exists. + @endparblock + +@bt_pre_not_null{field} +@bt_pre_is_struct_field{field} +@bt_pre_not_null{name} + +@sa bt_field_structure_borrow_member_field_by_name_const() — + \c const version of this function. +*/ +extern bt_field *bt_field_structure_borrow_member_field_by_name( + bt_field *field, const char *name); + +/*! +@brief + Borrows the field of the member having the name \bt_p{name} from the + \bt_struct_field \bt_p{field} (\c const version). + +See bt_field_structure_borrow_member_field_by_name(). +*/ +extern const bt_field * +bt_field_structure_borrow_member_field_by_name_const( + const bt_field *field, const char *name); + +/*! @} */ + +/*! +@name Option field +@{ +*/ + +/*! +@brief + Sets whether or not the \bt_opt_field \bt_p{field} + has a field. +@param[in] field + Option field of which to set whether or not it has a field. +@param[in] has_field + #BT_TRUE to make \bt_p{field} have a field. + +@bt_pre_not_null{field} +@bt_pre_is_opt_field{field} +*/ extern void bt_field_option_set_has_field(bt_field *field, bt_bool has_field); +/*! +@brief + Borrows the field of the \bt_opt_field \bt_p{field}. + +@attention + You must call bt_field_option_set_has_field() before you call + this function. + +If \bt_p{field} has no field, this function returns \c NULL. + +@param[in] field + Option field from which to borrow the field. + +@returns + @parblock + \em Borrowed reference of the field of \bt_p{field}, + or \c NULL if none. + + The returned pointer remains valid as long as \bt_p{field} exists. + @endparblock + +@bt_pre_not_null{field} +@bt_pre_is_opt_field{field} + +@sa bt_field_option_set_has_field() — + Sets whether or not an option field has a field. +@sa bt_field_option_borrow_field_const() — + \c const version of this function. +*/ extern bt_field *bt_field_option_borrow_field(bt_field *field); +/*! +@brief + Borrows the field of the \bt_opt_field \bt_p{field} + (\c const version). + +See bt_field_option_borrow_field(). +*/ +extern const bt_field * +bt_field_option_borrow_field_const(const bt_field *field); + +/*! @} */ + +/*! +@name Variant field +@{ +*/ + +/*! +@brief + Status code for bt_field_variant_select_option_by_index(). +*/ typedef enum bt_field_variant_select_option_by_index_status { - BT_FIELD_VARIANT_SELECT_OPTION_STATUS_OK = __BT_FUNC_STATUS_OK, + /*! + @brief + Success. + */ + BT_FIELD_VARIANT_SELECT_OPTION_STATUS_OK = __BT_FUNC_STATUS_OK, } bt_field_variant_select_option_by_index_status; +/*! +@brief + Sets the selected option of the \bt_var_field \bt_p{field} + to the option at index \bt_p{index}. + +@param[in] field + Variant field of which to set the selected option. +@param[in] index + Index of the option to set as the selected option of \bt_p{field}. + +@retval #BT_FIELD_VARIANT_SELECT_OPTION_STATUS_OK + Success. + +@bt_pre_not_null{field} +@bt_pre_is_var_field{field} +@pre + \bt_p{index} is less than the number of options in the + \ref api-tir-fc-var "class" of \bt_p{field} (as + returned by bt_field_class_variant_get_option_count()). +*/ extern bt_field_variant_select_option_by_index_status bt_field_variant_select_option_by_index( bt_field *field, uint64_t index); +/*! +@brief + Borrows the field of the selected option of the \bt_var_field + \bt_p{field}. + +@attention + You must call bt_field_variant_select_option_by_index() before + you call this function. + +@param[in] field + Variant field from which to borrow the selected option's field. + +@returns + @parblock + \em Borrowed reference of the field of the selected option of + \bt_p{field}, or \c NULL if none. + + The returned pointer remains valid as long as \bt_p{field} exists. + @endparblock + +@bt_pre_not_null{field} +@bt_pre_is_var_field{field} + +@sa bt_field_variant_select_option_by_index() — + Sets a variant field's selected option. +@sa bt_field_variant_get_selected_option_index() — + Returns the index of a variant field's selected option. +@sa bt_field_variant_borrow_selected_option_field_const() — + \c const version of this function. +*/ extern bt_field *bt_field_variant_borrow_selected_option_field( bt_field *field); +/*! +@brief + Borrows the field of the selected option of the \bt_var_field + \bt_p{field} (\c const version). + +See bt_field_variant_borrow_selected_option_field(). +*/ +extern const bt_field * +bt_field_variant_borrow_selected_option_field_const( + const bt_field *field); + +/*! +@brief + Returns the index of the selected option of the \bt_var_field + \bt_p{field}. + +@param[in] field + Variant field of which to get the index of the selected option. + +@returns + Index of the selected option of \bt_p{field}. + +@bt_pre_not_null{field} +@bt_pre_is_var_field{field} + +@sa bt_field_variant_borrow_selected_option_field_const() — + Borrows the field of a variant field's selected option. +*/ +extern uint64_t bt_field_variant_get_selected_option_index( + const bt_field *field); + +/*! +@brief + Borrows the class of the selected option of the \bt_var_field + \bt_p{field}. + +This function returns + +@code +bt_field_class_variant_borrow_option_by_index( + bt_field_variant_get_selected_option_index(field)) +@endcode + +@param[in] field + Variant field of which to get the selected option's class. + +@returns + Class of the selected option of \bt_p{field}. + +@bt_pre_not_null{field} +@bt_pre_is_var_field{field} +*/ +extern const bt_field_class_variant_option * +bt_field_variant_borrow_selected_option_class_const( + const bt_field *field); + +/*! +@brief + Borrows the class of the selected option of the \bt_var_field + (with an unsigned integer selector field) \bt_p{field}. + +This function returns + +@code +bt_field_class_variant_with_selector_field_integer_unsigned_borrow_option_by_index_const( + bt_field_variant_get_selected_option_index(field)) +@endcode + +@param[in] field + Variant field of which to get the selected option's class. + +@returns + Class of the selected option of \bt_p{field}. + +@bt_pre_not_null{field} +@bt_pre_is_var_wuis_field{field} +*/ +extern const bt_field_class_variant_with_selector_field_integer_unsigned_option * +bt_field_variant_with_selector_field_integer_unsigned_borrow_selected_option_class_const( + const bt_field *field); + +/*! +@brief + Borrows the class of the selected option of the \bt_var_field + (with a signed integer selector field) \bt_p{field}. + +This function returns + +@code +bt_field_class_variant_with_selector_field_integer_signed_borrow_option_by_index_const( + bt_field_variant_get_selected_option_index(field)) +@endcode + +@param[in] field + Variant field of which to get the selected option's class. + +@returns + Class of the selected option of \bt_p{field}. + +@bt_pre_not_null{field} +@bt_pre_is_var_wsis_field{field} +*/ +extern const bt_field_class_variant_with_selector_field_integer_signed_option * +bt_field_variant_with_selector_field_integer_signed_borrow_selected_option_class_const( + const bt_field *field); + +/*! @} */ + +/*! @} */ + #ifdef __cplusplus } #endif diff --git a/include/babeltrace2/trace-ir/packet-const.h b/include/babeltrace2/trace-ir/packet-const.h deleted file mode 100644 index f3fdd2d6..00000000 --- a/include/babeltrace2/trace-ir/packet-const.h +++ /dev/null @@ -1,67 +0,0 @@ -#ifndef BABELTRACE2_TRACE_IR_PACKET_CONST_H -#define BABELTRACE2_TRACE_IR_PACKET_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern const bt_stream *bt_packet_borrow_stream_const( - const bt_packet *packet); - -extern -const bt_field *bt_packet_borrow_context_field_const( - const bt_packet *packet); - -extern void bt_packet_get_ref(const bt_packet *packet); - -extern void bt_packet_put_ref(const bt_packet *packet); - -#define BT_PACKET_PUT_REF_AND_RESET(_var) \ - do { \ - bt_packet_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_PACKET_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_packet_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_TRACE_IR_PACKET_CONST_H */ diff --git a/include/babeltrace2/trace-ir/packet.h b/include/babeltrace2/trace-ir/packet.h index 6a310854..52d110ee 100644 --- a/include/babeltrace2/trace-ir/packet.h +++ b/include/babeltrace2/trace-ir/packet.h @@ -35,13 +35,306 @@ extern "C" { #endif +/*! +@defgroup api-tir-pkt Packet +@ingroup api-tir + +@brief + Trace packet. + +A packet is a conceptual container of +\bt_p_ev within a \bt_stream. + +Some trace formats group events together within packets. This is the +case, for example, of the +Common Trace Format. + +Because a packet could contain millions of events, there are no actual +links from a packet to its events. However, there are links from a +packet's events to it (see bt_event_borrow_packet() and +bt_event_borrow_packet_const()). + +A packet can contain a context \bt_field which is data associated to +all the events of the packet. + +A packet is a \ref api-tir "trace IR" data object. + +A packet conceptually belongs to a \bt_stream. Borrow the stream of a +packet with bt_packet_borrow_stream() and +bt_packet_borrow_stream_const(). + +Before you create a packet for a given stream, the stream's class must +\ref api-tir-stream-cls-prop-supports-pkt "support packets". + +Create a packet with bt_packet_create(). You can then use this packet to +create a \bt_pb_msg and a \bt_pe_msg. + +A packet is a \ref api-fund-shared-object "shared object": get a +new reference with bt_packet_get_ref() and put an existing +reference with bt_packet_put_ref(). + +Some library functions \ref api-fund-freezing "freeze" packets on +success. The documentation of those functions indicate this +postcondition. + +The type of a packet is #bt_packet. + +

    Property

    + +A packet has the following property: + +
    +
    \anchor api-tir-pkt-prop-ctx Context field
    +
    + Packet's context \bt_field. + + The context of a packet contains data associated to all its + events. + + The \ref api-tir-fc "class" of a packet's context field is set + at the packet's \bt_stream_cls level. See + bt_stream_class_set_packet_context_field_class() + bt_stream_class_borrow_packet_context_field_class(), + and bt_stream_class_borrow_packet_context_field_class_const() + + Use bt_packet_borrow_context_field() and + bt_packet_borrow_context_field_const(). +
    +
    +*/ + +/*! @{ */ + +/*! +@name Type +@{ + +@typedef struct bt_packet bt_packet; + +@brief + Packet. + +@} +*/ + +/*! +@name Creation +@{ +*/ + +/*! +@brief + Creates a packet for the \bt_stream \bt_p{stream}. + +@attention + @parblock + Only use this function if + + @code + bt_stream_class_supports_packets(bt_stream_borrow_class_const(stream)) + @endcode + + returns #BT_TRUE. + @endparblock + +On success, the returned packet has the following property value: + + + + +
    Property + Value +
    \ref api-tir-pkt-prop-ctx "Context field" + + Unset instance of the + \ref api-tir-stream-cls-prop-pc-fc "packet context field class" of + the \ref api-tir-stream-cls "class" of \bt_p{stream}. +
    + +@param[in] stream + Stream for which to create the packet. + +@returns + New packet reference, or \c NULL on memory error. + +@pre + bt_stream_class_supports_packets(bt_stream_borrow_class_const(stream)) + returns #BT_TRUE. +*/ extern bt_packet *bt_packet_create(const bt_stream *stream); +/*! @} */ + +/*! +@name Stream access +@{ +*/ + +/*! +@brief + Borrows the \bt_stream conceptually containing the packet + \bt_p{packet}. + +@param[in] packet + Packet of which to borrow the stream conceptually containing it. + +@returns + \em Borrowed reference of the stream conceptually containing + \bt_p{packet}. + +@bt_pre_not_null{packet} + +@sa bt_packet_borrow_stream_const() — + \c const version of this function. +*/ extern bt_stream *bt_packet_borrow_stream(bt_packet *packet); +/*! +@brief + Borrows the \bt_stream conceptually containing the packet + \bt_p{packet} (\c const version). + +See bt_packet_borrow_stream(). +*/ +extern const bt_stream *bt_packet_borrow_stream_const( + const bt_packet *packet); + +/*! @} */ + +/*! +@name Property +@{ +*/ + +/*! +@brief + Borrows the context \bt_field of the packet \bt_p{packet}. + +See the \ref api-tir-pkt-prop-ctx "context field" property. + +@param[in] packet + Packet of which to borrow the context field. + +@returns + \em Borrowed reference of the context field of + \bt_p{packet}, or \c NULL if none. + +@bt_pre_not_null{packet} + +@sa bt_packet_borrow_context_field_const() — + \c const version of this function. +*/ extern bt_field *bt_packet_borrow_context_field(bt_packet *packet); +/*! +@brief + Borrows the context \bt_field of the packet \bt_p{packet} + (\c const version). + +See bt_packet_borrow_context_field(). +*/ +extern +const bt_field *bt_packet_borrow_context_field_const( + const bt_packet *packet); + +/*! @} */ + +/*! +@name Reference count +@{ +*/ + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the packet \bt_p{packet}. + +@param[in] packet + @parblock + Packet of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_packet_put_ref() — + Decrements the reference count of a packet. +*/ +extern void bt_packet_get_ref(const bt_packet *packet); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the packet \bt_p{packet}. + +@param[in] packet + @parblock + Packet of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_packet_get_ref() — + Increments the reference count of a packet. +*/ +extern void bt_packet_put_ref(const bt_packet *packet); + +/*! +@brief + Decrements the reference count of the packet + \bt_p{_packet}, and then sets \bt_p{_packet} to \c NULL. + +@param _packet + @parblock + Packet of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_packet} +*/ +#define BT_PACKET_PUT_REF_AND_RESET(_packet) \ + do { \ + bt_packet_put_ref(_packet); \ + (_packet) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the packet \bt_p{_dst}, sets + \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} to \c NULL. + +This macro effectively moves a packet reference from the expression +\bt_p{_src} to the expression \bt_p{_dst}, putting the existing +\bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_PACKET_MOVE_REF(_dst, _src) \ + do { \ + bt_packet_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! @} */ + #ifdef __cplusplus } #endif diff --git a/include/babeltrace2/trace-ir/stream-class-const.h b/include/babeltrace2/trace-ir/stream-class-const.h deleted file mode 100644 index 7a7077b9..00000000 --- a/include/babeltrace2/trace-ir/stream-class-const.h +++ /dev/null @@ -1,121 +0,0 @@ -#ifndef BABELTRACE2_TRACE_IR_STREAM_CLASS_CONST_H -#define BABELTRACE2_TRACE_IR_STREAM_CLASS_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern const bt_value *bt_stream_class_borrow_user_attributes_const( - const bt_stream_class *stream_class); - -extern const bt_trace_class *bt_stream_class_borrow_trace_class_const( - const bt_stream_class *stream_class); - -extern const char *bt_stream_class_get_name( - const bt_stream_class *stream_class); - -extern bt_bool bt_stream_class_assigns_automatic_event_class_id( - const bt_stream_class *stream_class); - -extern bt_bool bt_stream_class_assigns_automatic_stream_id( - const bt_stream_class *stream_class); - -extern bt_bool bt_stream_class_supports_packets( - const bt_stream_class *stream_class); - -extern bt_bool bt_stream_class_packets_have_beginning_default_clock_snapshot( - const bt_stream_class *stream_class); - -extern bt_bool bt_stream_class_packets_have_end_default_clock_snapshot( - const bt_stream_class *stream_class); - -extern bt_bool bt_stream_class_supports_discarded_events( - const bt_stream_class *stream_class); - -extern bt_bool bt_stream_class_supports_discarded_packets( - const bt_stream_class *stream_class); - -extern bt_bool bt_stream_class_discarded_events_have_default_clock_snapshots( - const bt_stream_class *stream_class); - -extern bt_bool bt_stream_class_discarded_packets_have_default_clock_snapshots( - const bt_stream_class *stream_class); - -extern uint64_t bt_stream_class_get_id( - const bt_stream_class *stream_class); - -extern const bt_field_class * -bt_stream_class_borrow_packet_context_field_class_const( - const bt_stream_class *stream_class); - -extern const bt_field_class * -bt_stream_class_borrow_event_common_context_field_class_const( - const bt_stream_class *stream_class); - -extern uint64_t bt_stream_class_get_event_class_count( - const bt_stream_class *stream_class); - -extern const bt_event_class * -bt_stream_class_borrow_event_class_by_index_const( - const bt_stream_class *stream_class, uint64_t index); - -extern const bt_event_class * -bt_stream_class_borrow_event_class_by_id_const( - const bt_stream_class *stream_class, uint64_t id); - -extern const bt_clock_class * -bt_stream_class_borrow_default_clock_class_const( - const bt_stream_class *stream_class); - -extern void bt_stream_class_get_ref(const bt_stream_class *stream_class); - -extern void bt_stream_class_put_ref(const bt_stream_class *stream_class); - -#define BT_STREAM_CLASS_PUT_REF_AND_RESET(_var) \ - do { \ - bt_stream_class_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_STREAM_CLASS_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_stream_class_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_TRACE_IR_STREAM_CLASS_CONST_H */ diff --git a/include/babeltrace2/trace-ir/stream-class.h b/include/babeltrace2/trace-ir/stream-class.h index 58bdbdc4..d05d4735 100644 --- a/include/babeltrace2/trace-ir/stream-class.h +++ b/include/babeltrace2/trace-ir/stream-class.h @@ -35,92 +35,1789 @@ extern "C" { #endif +/*! +@defgroup api-tir-stream-cls Stream class +@ingroup api-tir + +@brief + Class of \bt_p_stream. + +A stream class is the class of \bt_p_stream: + +@image html trace-structure.png + +In the illustration above, notice that: + +- A \bt_stream is a conceptual \ref api-msg-seq "sequence of messages". + + The sequence always starts with a \bt_sb_msg and ends with a + \bt_se_msg. + +- A stream is an instance of a stream class. + +A stream class is a \ref api-tir "trace IR" metadata object. + +A stream class is a \ref api-fund-shared-object "shared object": get a +new reference with bt_stream_class_get_ref() and put an existing +reference with bt_stream_class_put_ref(). + +Some library functions \ref api-fund-freezing "freeze" stream classes on +success. The documentation of those functions indicate this +postcondition. You can still create and add an \bt_p_ev_cls to a frozen +stream class with bt_event_class_create() or +bt_event_class_create_with_id(). + +The type of a stream class is #bt_stream_class. + +A \bt_trace_cls contains stream classes. All the stream classes of a +given trace class have unique +\ref api-tir-stream-cls-prop-id "numeric IDs". Borrow the trace class +which contains a stream class with bt_stream_class_borrow_trace_class() +or bt_stream_class_borrow_trace_class_const(). + +A stream class contains \bt_p_ev_cls. All the event classes of a given +stream class have unique \ref api-tir-ev-cls-prop-id "numeric IDs". Get +the number of event classes in a stream class with +bt_stream_class_get_event_class_count(). Borrow a specific event class +from a stream class with bt_stream_class_borrow_event_class_by_index(), +bt_stream_class_borrow_event_class_by_index_const(), +bt_stream_class_borrow_event_class_by_id(), and +bt_stream_class_borrow_event_class_by_id_const(). + +A stream class controls what its instances (\bt_p_stream) support: + +
    +
    Default clock
    +
    + By default, a stream class's streams do not have default clocks. + + Set the default \bt_clock_cls of a stream class with + bt_stream_class_set_default_clock_class(). This makes all its + streams have their own default clock. +
    + +
    \anchor api-tir-stream-cls-pkt-support Packets
    +
    + By default, a stream class's streams do not support \bt_p_pkt. + + In other words, you cannot create a packet for such a stream, + therefore you cannot create \bt_p_pb_msg and \bt_p_pe_msg for this + stream either. + + Enable packet support for a stream class's streams with + bt_stream_class_set_supports_packets(). + + bt_stream_class_set_supports_packets() also configures whether or + not the packets of the stream class's instances have beginning + and/or end default \bt_p_cs. +
    + +
    Discarded events
    +
    + By default, a stream class's streams do not support discarded + events. + + In other words, you cannot create \bt_p_disc_ev_msg for such a + stream. + + Enable discarded events support for a stream class's streams with + bt_stream_class_set_supports_discarded_events(). + + bt_stream_class_set_supports_discarded_events() also configures + whether or not the discarded events messages of the stream class's + instances have beginning and end default \bt_p_cs to indicate the + discarded events time range. +
    + +
    Discarded packets
    +
    + By default, a stream class's streams do not support discarded + packets. + + In other words, you cannot create \bt_p_disc_pkt_msg for such a + stream. + + Enable discarded packets support for a stream class's streams with + bt_stream_class_set_supports_discarded_packets(). This also implies + that you must enable packet support with + bt_stream_class_set_supports_packets(). + + bt_stream_class_set_supports_discarded_packets() also configures + whether or not the discarded packets messages of the stream class's + instances have beginning and end \bt_p_cs to indicate the + discarded packets time range. +
    +
    + +Set whether or not the \bt_p_ev_cls and \bt_p_stream you create for a +stream class get automatic numeric IDs with +bt_stream_class_set_assigns_automatic_event_class_id() and +bt_stream_class_set_assigns_automatic_stream_id(). + +To create a default stream class: + +
    +
    + If bt_trace_class_assigns_automatic_stream_class_id() returns + #BT_TRUE (the default) for the trace class to use +
    +
    Use bt_stream_class_create().
    + +
    + If bt_trace_class_assigns_automatic_stream_class_id() returns + #BT_FALSE for the trace class to use +
    +
    Use bt_stream_class_create_with_id().
    +
    + +

    Properties

    + +A stream class has the following properties: + +
    +
    \anchor api-tir-stream-cls-prop-id Numeric ID
    +
    + Numeric ID, unique amongst the numeric IDs of the stream class's + \bt_trace_cls's stream classes. + + Depending on whether or not the stream class's trace class + automatically assigns \bt_ev_cls IDs + (see bt_trace_class_assigns_automatic_stream_class_id()), + set the stream class's numeric ID on creation with + bt_stream_class_create() or bt_stream_class_create_with_id(). + + You cannot change the numeric ID once the stream class is created. + + Get a stream class's numeric ID with bt_stream_class_get_id(). +
    + +
    \anchor api-tir-stream-cls-prop-name \bt_dt_opt Name
    +
    + Name of the stream class. + + Use bt_stream_class_set_name() and bt_stream_class_get_name(). +
    + +
    + \anchor api-tir-stream-cls-prop-def-clock-cls + \bt_dt_opt Default clock class +
    +
    + Default \bt_clock_cls of the stream class. + + As of \bt_name_version_min_maj, a stream class either has a default + clock class or none: it cannot have more than one clock class. + + When a stream class has a default clock class, then all its + instances (\bt_p_stream) have a default clock which is an instance + of the stream class's default clock class. + + Use bt_stream_class_set_default_clock_class(), + bt_stream_class_borrow_default_clock_class(), and + bt_stream_class_borrow_default_clock_class_const(). +
    + +
    + \anchor api-tir-stream-cls-prop-pc-fc + \bt_dt_opt Packet context field class +
    +
    + \bt_c_pkt context \bt_fc of the stream class. + + This property is only relevant if the stream class + \ref api-tir-stream-cls-prop-supports-pkt "supports packets". + + The context of a \bt_pkt contains data which is common to all the + packet's \bt_p_ev. + + Use bt_stream_class_set_packet_context_field_class() + bt_stream_class_borrow_packet_context_field_class(), + and bt_stream_class_borrow_packet_context_field_class_const(). +
    + +
    + \anchor api-tir-stream-cls-prop-ecc-fc + \bt_dt_opt Event common context field class +
    +
    + \bt_c_ev common context \bt_fc of the stream class. + + The common context of an \bt_ev contains contextual data of which + the layout is common to all the stream class's \bt_p_ev_cls. + + Use bt_stream_class_set_event_common_context_field_class() + bt_stream_class_borrow_event_common_context_field_class(), + and bt_stream_class_borrow_event_common_context_field_class_const(). +
    + +
    + \anchor api-tir-stream-cls-prop-auto-ec-id + Assigns automatic event class IDs? +
    +
    + Whether or not the \bt_p_ev_cls you create and add to the stream + class get \ref api-tir-ev-cls-prop-id "numeric IDs" automatically. + + Depending on the value of this property, to create an event class + and add it to the stream class: + +
    +
    #BT_TRUE
    +
    + Use bt_event_class_create(). +
    + +
    #BT_FALSE
    +
    + Use bt_event_class_create_with_id(). +
    +
    + + Use bt_stream_class_set_assigns_automatic_event_class_id() + and bt_stream_class_assigns_automatic_event_class_id(). +
    + +
    + \anchor api-tir-stream-cls-prop-auto-stream-id + Assigns automatic stream IDs? +
    +
    + Whether or not the streams you create from the stream class + get \ref api-tir-stream-prop-id "numeric IDs" automatically. + + Depending on the value of this property, to create a stream + from the stream class: + +
    +
    #BT_TRUE
    +
    + Use bt_stream_create(). +
    + +
    #BT_FALSE
    +
    + Use bt_stream_create_with_id(). +
    +
    + + Use bt_stream_class_set_assigns_automatic_stream_id() + and bt_stream_class_assigns_automatic_stream_id(). +
    + +
    + \anchor api-tir-stream-cls-prop-supports-pkt + Supports packets? +
    +
    + Whether or not the streams you create from the stream class + have \bt_p_pkt. + + If a stream has packets, then all the stream's \bt_p_ev are + conceptually contained within packets, which means you must + create \bt_p_ev_msg for such streams with + bt_message_event_create_with_packet() or + bt_message_event_create_with_packet_and_default_clock_snapshot() + instead of bt_message_event_create() or + bt_message_event_create_with_default_clock_snapshot(). + + It also means you must create \bt_p_pb_msg and \bt_p_pe_msg to + indicate where packets begin and end within the stream's + \ref api-msg-seq "message sequence". + + Use bt_stream_class_set_supports_packets() and + bt_stream_class_supports_packets(). +
    + +
    + \anchor api-tir-stream-cls-prop-pkt-beg-cs + Packets have a beginning default clock snapshot? +
    +
    + Whether or not the \bt_p_pkt of the streams you create from the + stream class have beginning default \bt_p_cs. + + This property is only relevant if the stream class + \ref api-tir-stream-cls-prop-supports-pkt "supports packets" and + has a + \ref api-tir-stream-cls-prop-def-clock-cls "default clock class". + + If the stream packets have a beginning default clock snapshot, then + you must create \bt_p_pb_msg with + bt_message_packet_beginning_create_with_default_clock_snapshot() + instead of bt_message_packet_beginning_create(). + + Use bt_stream_class_set_supports_packets() and + bt_stream_class_packets_have_beginning_default_clock_snapshot(). +
    + +
    + \anchor api-tir-stream-cls-prop-pkt-end-cs + Packets have an end default clock snapshot? +
    +
    + Whether or not the \bt_p_pkt of the streams you create from the + stream class have end default \bt_p_cs. + + This property is only relevant if the stream class + \ref api-tir-stream-cls-prop-supports-pkt "supports packets" and + has a + \ref api-tir-stream-cls-prop-def-clock-cls "default clock class". + + If the stream packets have an end default clock snapshot, then you + must create \bt_p_pe_msg with + bt_message_packet_end_create_with_default_clock_snapshot() instead + of bt_message_packet_end_create(). + + Use bt_stream_class_set_supports_packets() and + bt_stream_class_packets_have_end_default_clock_snapshot(). +
    + +
    + \anchor api-tir-stream-cls-prop-supports-disc-ev + Supports discarded events? +
    +
    + Whether or not the streams you create from the stream class can have + discarded events. + + If the stream class supports discarded events, then you can create + \bt_p_disc_ev_msg for this stream. + + Use bt_stream_class_set_supports_discarded_events() + and bt_stream_class_supports_discarded_events(). +
    + +
    + \anchor api-tir-stream-cls-prop-disc-ev-cs + Discarded events have default clock snapshots? +
    +
    + Whether or not the stream's \bt_p_disc_ev_msg have + default beginning and end \bt_p_cs to indicate the discarded events + time range. + + This property is only relevant if the stream class + \ref api-tir-stream-cls-prop-supports-disc-ev "supports discarded events" + and has a + \ref api-tir-stream-cls-prop-def-clock-cls "default clock class". + + If the stream's discarded events messages have beginning and end + default clock snapshots, then you must create them with + bt_message_discarded_events_create_with_default_clock_snapshots() + instead of bt_message_discarded_events_create(). + + Use bt_stream_class_set_supports_discarded_events() + and bt_stream_class_discarded_events_have_default_clock_snapshots(). +
    + +
    + \anchor api-tir-stream-cls-prop-supports-disc-pkt + Supports discarded packets? +
    +
    + Whether or not the streams you create from the stream class can have + discarded packets. + + This property is only relevant if the stream class + \ref api-tir-stream-cls-prop-supports-pkt "supports packets". + + If the stream class supports discarded packets, then you can create + \bt_p_disc_pkt_msg for this stream. + + Use bt_stream_class_set_supports_discarded_packets() + and bt_stream_class_supports_discarded_packets(). +
    + +
    + \anchor api-tir-stream-cls-prop-disc-pkt-cs + Discarded packets have default clock snapshots? +
    +
    + Whether or not the stream's \bt_p_disc_pkt_msg have + default beginning and end \bt_p_cs to indicate the discarded + packets time range. + + This property is only relevant if the stream class + \ref api-tir-stream-cls-prop-supports-disc-pkt "supports discarded packets" + and has a + \ref api-tir-stream-cls-prop-def-clock-cls "default clock class". + + If the stream's discarded packets messages have default clock + snapshots, then you must create them with + bt_message_discarded_packets_create_with_default_clock_snapshots() + instead of bt_message_discarded_packets_create(). + + Use bt_stream_class_set_supports_discarded_packets() + and bt_stream_class_discarded_packets_have_default_clock_snapshots(). +
    + +
    + \anchor api-tir-stream-cls-prop-user-attrs + \bt_dt_opt User attributes +
    +
    + User attributes of the stream class. + + User attributes are custom attributes attached to a stream class. + + Use bt_stream_class_set_user_attributes(), + bt_stream_class_borrow_user_attributes(), and + bt_stream_class_borrow_user_attributes_const(). +
    +
    +*/ + +/*! @{ */ + +/*! +@name Type +@{ + +@typedef struct bt_stream_class bt_stream_class; + +@brief + Stream class. + +@} +*/ + +/*! +@name Creation +@{ +*/ + +/*! +@brief + Creates a default stream class and adds it to the \bt_trace_cls + \bt_p{trace_class}. + +@attention + @parblock + Only use this function if + + @code + bt_trace_class_assigns_automatic_stream_class_id(trace_class) + @endcode + + returns #BT_TRUE. + + Otherwise, use bt_stream_class_create_with_id(). + @endparblock + +On success, the returned stream class has the following property values: + + + + + + + + + + + + + + + + + + +
    Property + Value +
    \ref api-tir-stream-cls-prop-id "Numeric ID" + Automatically assigned by \bt_p{trace_class} +
    \ref api-tir-stream-cls-prop-name "Name" + \em None +
    \ref api-tir-stream-cls-prop-def-clock-cls "Default clock class" + \em None +
    \ref api-tir-stream-cls-prop-pc-fc "Packet context field class" + \em None +
    \ref api-tir-stream-cls-prop-ecc-fc "Event common context field class" + \em None +
    \ref api-tir-stream-cls-prop-auto-ec-id "Assigns automatic event class IDs?" + Yes +
    \ref api-tir-stream-cls-prop-auto-stream-id "Assigns automatic stream IDs?" + Yes +
    \ref api-tir-stream-cls-prop-supports-pkt "Supports packets?" + No +
    \ref api-tir-stream-cls-prop-pkt-beg-cs "Packets have a beginning default clock snapshot?" + No +
    \ref api-tir-stream-cls-prop-pkt-end-cs "Packets have an end default clock snapshot?" + No +
    \ref api-tir-stream-cls-prop-supports-disc-ev "Supports discarded events?" + No +
    \ref api-tir-stream-cls-prop-disc-ev-cs "Discarded events have default clock snapshots?" + No +
    \ref api-tir-stream-cls-prop-supports-disc-pkt "Supports discarded packets?" + No +
    \ref api-tir-stream-cls-prop-disc-pkt-cs "Discarded packets have default clock snapshots?" + No +
    \ref api-tir-stream-cls-prop-user-attrs "User attributes" + Empty \bt_map_val +
    + +@param[in] trace_class + Trace class to add the created stream class to. + +@returns + New stream class reference, or \c NULL on memory error. + +@bt_pre_not_null{trace_class} +@pre + bt_trace_class_assigns_automatic_stream_class_id(trace_class) + returns #BT_TRUE. + +@bt_post_success_frozen{trace_class} + +@sa bt_stream_class_create_with_id() — + Creates a stream class with a specific numeric ID and adds it to a + trace class. +*/ extern bt_stream_class *bt_stream_class_create( bt_trace_class *trace_class); +/*! +@brief + Creates a default stream class with the numeric ID \bt_p{id} and adds + it to the \bt_trace_cls \bt_p{trace_class}. + +@attention + @parblock + Only use this function if + + @code + bt_trace_class_assigns_automatic_stream_class_id(trace_class) + @endcode + + returns #BT_FALSE. + + Otherwise, use bt_stream_class_create(). + @endparblock + +On success, the returned stream class has the following property values: + + + + + + + + + + + + + + + + + + +
    Property + Value +
    \ref api-tir-stream-cls-prop-id "Numeric ID" + \bt_p{id} +
    \ref api-tir-stream-cls-prop-name "Name" + \em None +
    \ref api-tir-stream-cls-prop-def-clock-cls "Default clock class" + \em None +
    \ref api-tir-stream-cls-prop-pc-fc "Packet context field class" + \em None +
    \ref api-tir-stream-cls-prop-ecc-fc "Event common context field class" + \em None +
    \ref api-tir-stream-cls-prop-auto-ec-id "Assigns automatic event class IDs?" + Yes +
    \ref api-tir-stream-cls-prop-auto-stream-id "Assigns automatic stream IDs?" + Yes +
    \ref api-tir-stream-cls-prop-supports-pkt "Supports packets?" + No +
    \ref api-tir-stream-cls-prop-pkt-beg-cs "Packets have a beginning default clock snapshot?" + No +
    \ref api-tir-stream-cls-prop-pkt-end-cs "Packets have an end default clock snapshot?" + No +
    \ref api-tir-stream-cls-prop-supports-disc-ev "Supports discarded events?" + No +
    \ref api-tir-stream-cls-prop-disc-ev-cs "Discarded events have default clock snapshots?" + No +
    \ref api-tir-stream-cls-prop-supports-disc-pkt "Supports discarded packets?" + No +
    \ref api-tir-stream-cls-prop-disc-pkt-cs "Discarded packets have default clock snapshots?" + No +
    \ref api-tir-stream-cls-prop-user-attrs "User attributes" + Empty \bt_map_val +
    + +@param[in] trace_class + Trace class to add the created stream class to. +@param[in] id + Numeric ID of the stream class to create and add to + \bt_p{trace_class}. + +@returns + New stream class reference, or \c NULL on memory error. + +@bt_pre_not_null{trace_class} +@pre + bt_trace_class_assigns_automatic_stream_class_id(trace_class) + returns #BT_FALSE. +@pre + \bt_p{trace_class} does not contain a stream class with the numeric + ID \bt_p{id}. + +@bt_post_success_frozen{trace_class} + +@sa bt_stream_class_create() — + Creates a stream class with an automatic numeric ID and adds it to a + trace class. +*/ extern bt_stream_class *bt_stream_class_create_with_id( bt_trace_class *trace_class, uint64_t id); -extern bt_value *bt_stream_class_borrow_user_attributes( - bt_stream_class *stream_class); +/*! @} */ -extern void bt_stream_class_set_user_attributes( - bt_stream_class *stream_class, const bt_value *user_attributes); +/*! +@name Trace class access +@{ +*/ + +/*! +@brief + Borrows the \bt_trace_cls which contains the stream class + \bt_p{stream_class}. + +@param[in] stream_class + Stream class from which to borrow the trace class which contains it. +@returns + Trace class which contains \bt_p{stream_class}. + +@bt_pre_not_null{stream_class} + +@sa bt_stream_class_borrow_trace_class_const() — + \c const version of this function. +*/ extern bt_trace_class *bt_stream_class_borrow_trace_class( bt_stream_class *stream_class); +/*! +@brief + Borrows the \bt_trace_cls which contains the stream class + \bt_p{stream_class} (\c const version). + +See bt_stream_class_borrow_trace_class(). +*/ +extern const bt_trace_class *bt_stream_class_borrow_trace_class_const( + const bt_stream_class *stream_class); + +/*! @} */ + +/*! +@name Event class access +@{ +*/ + +/*! +@brief + Returns the number of \bt_p_ev_cls contained in the stream + class \bt_p{stream_class}. + +@param[in] stream_class + Stream class of which to get the number of contained event classes. + +@returns + Number of contained event classes in \bt_p{stream_class}. + +@bt_pre_not_null{stream_class} +*/ +extern uint64_t bt_stream_class_get_event_class_count( + const bt_stream_class *stream_class); + +/*! +@brief + Borrows the \bt_ev_cls at index \bt_p{index} from the + stream class \bt_p{stream_class}. + +@param[in] stream_class + Stream class from which to borrow the event class at index + \bt_p{index}. +@param[in] index + Index of the event class to borrow from \bt_p{stream_class}. + +@returns + @parblock + \em Borrowed reference of the event class of + \bt_p{stream_class} at index \bt_p{index}. + + The returned pointer remains valid as long as \bt_p{stream_class} + exists. + @endparblock + +@bt_pre_not_null{stream_class} +@pre + \bt_p{index} is less than the number of event classes in + \bt_p{stream_class} (as returned by + bt_stream_class_get_event_class_count()). + +@sa bt_stream_class_get_event_class_count() — + Returns the number of event classes contained in a stream class. +@sa bt_stream_class_borrow_event_class_by_index_const() — + \c const version of this function. +*/ +extern bt_event_class * +bt_stream_class_borrow_event_class_by_index( + bt_stream_class *stream_class, uint64_t index); + +/*! +@brief + Borrows the \bt_ev_cls at index \bt_p{index} from the + stream class \bt_p{stream_class} (\c const version). + +See bt_stream_class_borrow_event_class_by_index(). +*/ +extern const bt_event_class * +bt_stream_class_borrow_event_class_by_index_const( + const bt_stream_class *stream_class, uint64_t index); + +/*! +@brief + Borrows the \bt_ev_cls having the numeric ID \bt_p{id} from the + stream class \bt_p{stream_class}. + +If there's no event class having the numeric ID \bt_p{id} in +\bt_p{stream_class}, this function returns \c NULL. + +@param[in] stream_class + Stream class from which to borrow the event class having the + numeric ID \bt_p{id}. +@param[in] id + ID of the event class to borrow from \bt_p{stream_class}. + +@returns + @parblock + \em Borrowed reference of the event class of + \bt_p{stream_class} having the numeric ID \bt_p{id}, or \c NULL + if none. + + The returned pointer remains valid as long as \bt_p{stream_class} + exists. + @endparblock + +@bt_pre_not_null{stream_class} + +@sa bt_stream_class_borrow_event_class_by_id_const() — + \c const version of this function. +*/ +extern bt_event_class * +bt_stream_class_borrow_event_class_by_id( + bt_stream_class *stream_class, uint64_t id); + +/*! +@brief + Borrows the \bt_ev_cls having the numeric ID \bt_p{id} from the + stream class \bt_p{stream_class} (\c const version). + +See bt_stream_class_borrow_event_class_by_id(). +*/ +extern const bt_event_class * +bt_stream_class_borrow_event_class_by_id_const( + const bt_stream_class *stream_class, uint64_t id); + +/*! @} */ + +/*! +@name Properties +@{ +*/ + +/*! +@brief + Returns the numeric ID of the stream class \bt_p{stream_class}. + +See the \ref api-tir-stream-cls-prop-id "numeric ID" property. + +@param[in] stream_class + Stream class of which to get the numeric ID. + +@returns + Numeric ID of \bt_p{stream_class}. + +@bt_pre_not_null{stream_class} + +@sa bt_stream_class_create_with_id() — + Creates a stream class with a specific numeric ID and adds it to a + trace class. +*/ +extern uint64_t bt_stream_class_get_id( + const bt_stream_class *stream_class); + +/*! +@brief + Status codes for bt_stream_class_set_name(). +*/ typedef enum bt_stream_class_set_name_status { - BT_STREAM_CLASS_SET_NAME_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + /*! + @brief + Success. + */ BT_STREAM_CLASS_SET_NAME_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_STREAM_CLASS_SET_NAME_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, } bt_stream_class_set_name_status; +/*! +@brief + Sets the name of the stream class \bt_p{stream_class} to + a copy of \bt_p{name}. + +See the \ref api-tir-stream-cls-prop-name "name" property. + +@param[in] stream_class + Stream class of which to set the name to \bt_p{name}. +@param[in] name + New name of \bt_p{stream_class} (copied). + +@retval #BT_STREAM_CLASS_SET_NAME_STATUS_OK + Success. +@retval #BT_STREAM_CLASS_SET_NAME_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{stream_class} +@bt_pre_hot{stream_class} +@bt_pre_not_null{name} + +@sa bt_stream_class_get_name() — + Returns the name of a stream class. +*/ extern bt_stream_class_set_name_status bt_stream_class_set_name( bt_stream_class *stream_class, const char *name); -extern void bt_stream_class_set_assigns_automatic_event_class_id( - bt_stream_class *stream_class, bt_bool value); +/*! +@brief + Returns the name of the stream class \bt_p{stream_class}. -extern void bt_stream_class_set_assigns_automatic_stream_id( - bt_stream_class *stream_class, bt_bool value); +See the \ref api-tir-stream-cls-prop-name "name" property. -extern void bt_stream_class_set_supports_discarded_events( - bt_stream_class *stream_class, - bt_bool supports_discarded_events, - bt_bool with_default_clock_snapshots); +If \bt_p{stream_class} has no name, this function returns \c NULL. -extern void bt_stream_class_set_supports_discarded_packets( +@param[in] stream_class + Stream class of which to get the name. + +@returns + @parblock + Name of \bt_p{stream_class}, or \c NULL if none. + + The returned pointer remains valid as long as \bt_p{stream_class} + is not modified. + @endparblock + +@bt_pre_not_null{stream_class} + +@sa bt_stream_class_set_name() — + Sets the name of a stream class. +*/ +extern const char *bt_stream_class_get_name( + const bt_stream_class *stream_class); + +/*! +@brief + Status codes for bt_stream_class_set_default_clock_class(). +*/ +typedef enum bt_stream_class_set_default_clock_class_status { + /*! + @brief + Success. + */ + BT_STREAM_CLASS_SET_DEFAULT_CLOCK_CLASS_STATUS_OK = __BT_FUNC_STATUS_OK, +} bt_stream_class_set_default_clock_class_status; + +/*! +@brief + Sets the default \bt_clock_cls of the stream class + \bt_p{stream_class} to \bt_p{clock_class}. + +See the \ref api-tir-stream-cls-prop-def-clock-cls "default clock class" +property. + +@param[in] stream_class + Stream class of which to set the default clock class to + \bt_p{clock_class}. +@param[in] clock_class + New default clock class of \bt_p{stream_class}. + +@retval #BT_STREAM_CLASS_SET_DEFAULT_CLOCK_CLASS_STATUS_OK + Success. + +@bt_pre_not_null{stream_class} +@bt_pre_hot{stream_class} +@bt_pre_not_null{clock_class} + +@sa bt_stream_class_borrow_default_clock_class() — + Borrows the default clock class of a stream class. +@sa bt_stream_class_borrow_default_clock_class_const() — + Borrows the default clock class of a stream class (\c const version). +*/ +extern bt_stream_class_set_default_clock_class_status +bt_stream_class_set_default_clock_class( bt_stream_class *stream_class, - bt_bool supports_discarded_packets, - bt_bool with_default_clock_snapshots); + bt_clock_class *clock_class); + +/*! +@brief + Borrows the default \bt_clock_cls from the stream class + \bt_p{stream_class}. + +See the \ref api-tir-stream-cls-prop-def-clock-cls "default clock class" +property. +If \bt_p{stream_class} has no default clock class, this function +returns \c NULL. + +@param[in] stream_class + Stream class from which to borrow the default clock class. + +@returns + \em Borrowed reference of the default clock class of + \bt_p{stream_class}, or \c NULL if none. + +@bt_pre_not_null{stream_class} + +@sa bt_stream_class_set_default_clock_class() — + Sets the default clock class of a stream class. +@sa bt_stream_class_borrow_default_clock_class_const() — + \c const version of this function. +*/ +extern bt_clock_class *bt_stream_class_borrow_default_clock_class( + bt_stream_class *stream_class); + +/*! +@brief + Borrows the default \bt_clock_cls from the stream class + \bt_p{stream_class} (\c const version). + +See bt_stream_class_borrow_default_clock_class(). +*/ +extern const bt_clock_class * +bt_stream_class_borrow_default_clock_class_const( + const bt_stream_class *stream_class); + +/*! +@brief + Status codes for bt_stream_class_set_packet_context_field_class() + and bt_stream_class_set_event_common_context_field_class(). +*/ typedef enum bt_stream_class_set_field_class_status { - BT_STREAM_CLASS_SET_FIELD_CLASS_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + /*! + @brief + Success. + */ BT_STREAM_CLASS_SET_FIELD_CLASS_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_STREAM_CLASS_SET_FIELD_CLASS_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, } bt_stream_class_set_field_class_status; -extern void bt_stream_class_set_supports_packets( - bt_stream_class *stream_class, bt_bool supports_packets, - bt_bool with_beginning_default_clock_snapshot, - bt_bool with_end_default_clock_snapshot); +/*! +@brief + Sets the packet context \bt_fc of the stream class + \bt_p{stream_class} to \bt_p{field_class}. + +See the \ref api-tir-stream-cls-prop-pc-fc "packet context field class" +property. + +\bt_p{stream_class} must support packets (see +bt_stream_class_set_supports_packets()). +@param[in] stream_class + Stream class of which to set the packet context field class to + \bt_p{field_class}. +@param[in] field_class + New packet context field class of \bt_p{stream_class}. + +@retval #BT_STREAM_CLASS_SET_FIELD_CLASS_STATUS_OK + Success. +@retval #BT_STREAM_CLASS_SET_FIELD_CLASS_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{stream_class} +@bt_pre_hot{stream_class} +@pre + bt_stream_class_supports_packets(stream_class) + returns #BT_TRUE. +@bt_pre_not_null{field_class} +@bt_pre_is_struct_fc{field_class} +@pre + \bt_p{field_class}, or any of its contained field classes, + is not already part of a stream class or of an \bt_ev_cls. +@pre + If any of the field classes recursively contained in + \bt_p{field_class} has a + \ref api-tir-fc-link "link to another field class", it must honor + the field class link rules. +@pre + If any of the field classes recursively contained in + \bt_p{field_class} has a + \ref api-tir-fc-link "link to another field class", it must honor + the field class link rules. + +@bt_post_success_frozen{field_class} + +@sa bt_stream_class_borrow_packet_context_field_class() — + Borrows the packet context field class of a stream class. +@sa bt_stream_class_borrow_packet_context_field_class_const() — + Borrows the packet context field class of a stream class + (\c const version). +*/ extern bt_stream_class_set_field_class_status bt_stream_class_set_packet_context_field_class( bt_stream_class *stream_class, bt_field_class *field_class); +/*! +@brief + Borrows the packet context \bt_fc from the stream class + \bt_p{stream_class}. + +See the \ref api-tir-stream-cls-prop-pc-fc "packet context field class" +property. + +If \bt_p{stream_class} has no packet context field class, this function +returns \c NULL. + +@param[in] stream_class + Stream class from which to borrow the packet context field class. + +@returns + \em Borrowed reference of the packet context field class of + \bt_p{stream_class}, or \c NULL if none. + +@bt_pre_not_null{stream_class} + +@sa bt_stream_class_set_packet_context_field_class() — + Sets the packet context field class of a stream class. +@sa bt_stream_class_borrow_packet_context_field_class_const() — + \c const version of this function. +*/ extern bt_field_class * bt_stream_class_borrow_packet_context_field_class( bt_stream_class *stream_class); +/*! +@brief + Borrows the packet context \bt_fc from the stream class + \bt_p{stream_class} (\c const version). + +See bt_stream_class_borrow_packet_context_field_class(). +*/ +extern const bt_field_class * +bt_stream_class_borrow_packet_context_field_class_const( + const bt_stream_class *stream_class); + +/*! +@brief + Sets the event common context \bt_fc of the stream class + \bt_p{stream_class} to \bt_p{field_class}. + +See the \ref api-tir-stream-cls-prop-ecc-fc "event common context field class" +property. + +@param[in] stream_class + Stream class of which to set the event common context field class to + \bt_p{field_class}. +@param[in] field_class + New event common context field class of \bt_p{stream_class}. + +@retval #BT_STREAM_CLASS_SET_FIELD_CLASS_STATUS_OK + Success. +@retval #BT_STREAM_CLASS_SET_FIELD_CLASS_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{stream_class} +@bt_pre_hot{stream_class} +@bt_pre_not_null{field_class} +@bt_pre_is_struct_fc{field_class} +@pre + \bt_p{field_class}, or any of its contained field classes, + is not already part of a stream class or of an \bt_ev_cls. +@pre + If any of the field classes recursively contained in + \bt_p{field_class} has a + \ref api-tir-fc-link "link to another field class", it must honor + the field class link rules. + +@bt_post_success_frozen{field_class} + +@sa bt_stream_class_borrow_event_common_context_field_class() — + Borrows the event common context field class of a stream class. +@sa bt_stream_class_borrow_event_common_context_field_class_const() — + Borrows the event common context field class of a stream class + (\c const version). +*/ extern bt_stream_class_set_field_class_status bt_stream_class_set_event_common_context_field_class( bt_stream_class *stream_class, bt_field_class *field_class); +/*! +@brief + Borrows the event common context \bt_fc from the stream class + \bt_p{stream_class}. + +See the \ref api-tir-stream-cls-prop-pc-fc "event common context field class" +property. + +If \bt_p{stream_class} has no event common context field class, this +function returns \c NULL. + +@param[in] stream_class + Stream class from which to borrow the event common context + field class. + +@returns + \em Borrowed reference of the event common context field class of + \bt_p{stream_class}, or \c NULL if none. + +@bt_pre_not_null{stream_class} + +@sa bt_stream_class_set_event_common_context_field_class() — + Sets the event common context field class of a stream class. +@sa bt_stream_class_borrow_event_common_context_field_class_const() — + \c const version of this function. +*/ + extern bt_field_class * bt_stream_class_borrow_event_common_context_field_class( bt_stream_class *stream_class); -extern bt_event_class * -bt_stream_class_borrow_event_class_by_index( - bt_stream_class *stream_class, uint64_t index); +/*! +@brief + Borrows the event common context \bt_fc from the stream class + \bt_p{stream_class} (\c const version()). -extern bt_event_class * -bt_stream_class_borrow_event_class_by_id( - bt_stream_class *stream_class, uint64_t id); +See bt_stream_class_borrow_event_common_context_field_class(). +*/ +extern const bt_field_class * +bt_stream_class_borrow_event_common_context_field_class_const( + const bt_stream_class *stream_class); -extern bt_clock_class *bt_stream_class_borrow_default_clock_class( - bt_stream_class *stream_class); +/*! +@brief + Sets whether or not the stream class \bt_p{stream_class} + automatically assigns a numeric ID to an \bt_ev_cls you create and + add to it. -typedef enum bt_stream_class_set_default_clock_class_status { - BT_STREAM_CLASS_SET_DEFAULT_CLOCK_CLASS_STATUS_OK = __BT_FUNC_STATUS_OK, -} bt_stream_class_set_default_clock_class_status; +See the \ref api-tir-stream-cls-prop-auto-ec-id "assigns automatic event class IDs?" +property. -extern bt_stream_class_set_default_clock_class_status -bt_stream_class_set_default_clock_class( +@param[in] stream_class + Stream class of which to set whether or not it assigns automatic + event class IDs. +@param[in] assigns_automatic_event_class_id + #BT_TRUE to make \bt_p{stream_class} assign automatic event class + IDs. + +@bt_pre_not_null{stream_class} +@bt_pre_hot{stream_class} + +@sa bt_stream_class_assigns_automatic_event_class_id() — + Returns whether or not a stream class automatically assigns + event class IDs. +*/ +extern void bt_stream_class_set_assigns_automatic_event_class_id( bt_stream_class *stream_class, - bt_clock_class *clock_class); + bt_bool assigns_automatic_event_class_id); + +/*! +@brief + Returns whether or not the stream class \bt_p{stream_class} + automatically assigns a numeric ID to an \bt_ev_cls you create + and add to it. + +See the \ref api-tir-stream-cls-prop-auto-ec-id "assigns automatic event class IDs?" +property. + +@param[in] stream_class + Stream class of which to get whether or not it assigns automatic + event class IDs. + +@returns + #BT_TRUE if \bt_p{stream_class} automatically + assigns event class IDs. + +@bt_pre_not_null{stream_class} + +@sa bt_stream_class_set_assigns_automatic_event_class_id() — + Sets whether or not a stream class automatically assigns + event class IDs. +*/ +extern bt_bool bt_stream_class_assigns_automatic_event_class_id( + const bt_stream_class *stream_class); + +/*! +@brief + Sets whether or not the stream class \bt_p{stream_class} + automatically assigns a numeric ID to a \bt_stream you create from + it. + +See the \ref api-tir-stream-cls-prop-auto-stream-id "assigns automatic stream IDs?" +property. + +@param[in] stream_class + Stream class of which to set whether or not it assigns automatic + stream IDs. +@param[in] assigns_automatic_stream_id + #BT_TRUE to make \bt_p{stream_class} assign automatic stream + IDs. + +@bt_pre_not_null{stream_class} +@bt_pre_hot{stream_class} + +@sa bt_stream_class_assigns_automatic_stream_id() — + Returns whether or not a stream class automatically assigns + stream IDs. +*/ +extern void bt_stream_class_set_assigns_automatic_stream_id( + bt_stream_class *stream_class, bt_bool assigns_automatic_stream_id); + +/*! +@brief + Returns whether or not the stream class \bt_p{stream_class} + automatically assigns a numeric ID to a \bt_stream you create + from it. + +See the \ref api-tir-stream-cls-prop-auto-stream-id "assigns automatic stream IDs?" +property. + +@param[in] stream_class + Stream class of which to get whether or not it assigns automatic + stream IDs. + +@returns + #BT_TRUE if \bt_p{stream_class} automatically assigns stream IDs. + +@bt_pre_not_null{stream_class} + +@sa bt_stream_class_set_assigns_automatic_stream_id() — + Sets whether or not a stream class automatically assigns + stream IDs. +*/ +extern bt_bool bt_stream_class_assigns_automatic_stream_id( + const bt_stream_class *stream_class); + +/*! +@brief + Sets whether or not the instances (\bt_p_stream) of the + stream class \bt_p{stream_class} have \bt_p_pkt and, if so, + if those packets have beginning and/or end default + \bt_p_cs. + +See the +\ref api-tir-stream-cls-prop-supports-pkt "supports packets?", +\ref api-tir-stream-cls-prop-pkt-beg-cs "packets have a beginning default clock snapshot?", +and +\ref api-tir-stream-cls-prop-pkt-end-cs "packets have an end default clock snapshot?" +properties. + +@param[in] stream_class + Stream class of which to set whether or not its streams have + packets. +@param[in] supports_packets + #BT_TRUE to make the streams of \bt_p{stream_class} have packets. +@param[in] with_beginning_default_clock_snapshot + #BT_TRUE to make the packets of the streams of \bt_p{stream_class} + have a beginning default clock snapshot. +@param[in] with_end_default_clock_snapshot + #BT_TRUE to make the packets of the streams of \bt_p{stream_class} + have an end default clock snapshot. + +@bt_pre_not_null{stream_class} +@bt_pre_hot{stream_class} +@pre + If \bt_p{with_beginning_default_clock_snapshot} is + #BT_TRUE, + \bt_p{supports_packets} is also #BT_TRUE. +@pre + If \bt_p{with_beginning_default_clock_snapshot} is + #BT_TRUE, + \bt_p{supports_packets} is also #BT_TRUE. +@pre + If \bt_p{with_beginning_default_clock_snapshot} or + \bt_p{with_end_default_clock_snapshot} is #BT_TRUE, + \bt_p{stream_class} has a + \ref api-tir-stream-cls-prop-def-clock-cls "default clock class". + +@sa bt_stream_class_supports_packets() — + Returns whether or not a stream class's streams have packets. +@sa bt_stream_class_packets_have_beginning_default_clock_snapshot() — + Returns whether or not the packets of a stream class's streams + have a beginning default clock snapshot. +@sa bt_stream_class_packets_have_end_default_clock_snapshot() — + Returns whether or not the packets of a stream class's streams + have an end default clock snapshot. +*/ +extern void bt_stream_class_set_supports_packets( + bt_stream_class *stream_class, bt_bool supports_packets, + bt_bool with_beginning_default_clock_snapshot, + bt_bool with_end_default_clock_snapshot); + +/*! +@brief + Returns whether or not the instances (\bt_p_stream) of the + stream class \bt_p{stream_class} have \bt_p_pkt. + +See the \ref api-tir-stream-cls-prop-supports-pkt "supports packets?" +property. + +@param[in] stream_class + Stream class of which to get whether or not its streams have + packets. + +@returns + #BT_TRUE if the streams of \bt_p{stream_class} have packets. + +@bt_pre_not_null{stream_class} + +@sa bt_stream_class_set_supports_packets() — + Sets whether or not a stream class's streams have packets. +*/ +extern bt_bool bt_stream_class_supports_packets( + const bt_stream_class *stream_class); + +/*! +@brief + Returns whether or not the \bt_p_pkt of the instances (\bt_p_stream) + of the stream class \bt_p{stream_class} have a beginning + default \bt_cs. + +See the +\ref api-tir-stream-cls-prop-pkt-beg-cs "packets have a beginning default clock snapshot?" +property. + +@param[in] stream_class + Stream class of which to get whether or not its streams's packets + have a beginning default clock snapshot. + +@returns + #BT_TRUE if the packets of the streams of \bt_p{stream_class} have a + beginning default clock snapshot. + +@bt_pre_not_null{stream_class} + +@sa bt_stream_class_set_supports_packets() — + Sets whether or not a stream class's streams have packets. +@sa bt_stream_class_packets_have_end_default_clock_snapshot() — + Returns whether or not the packets of a stream class's streams + have an end default clock snapshot. +*/ +extern bt_bool bt_stream_class_packets_have_beginning_default_clock_snapshot( + const bt_stream_class *stream_class); + +/*! +@brief + Returns whether or not the \bt_p_pkt of the instances (\bt_p_stream) + of the stream class \bt_p{stream_class} have an end + default \bt_cs. + +See the +\ref api-tir-stream-cls-prop-pkt-end-cs "packets have an end default clock snapshot?" +property. + +@param[in] stream_class + Stream class of which to get whether or not its streams's packets + have an end default clock snapshot. + +@returns + #BT_TRUE if the packets of the streams of \bt_p{stream_class} have + an end default clock snapshot. + +@bt_pre_not_null{stream_class} + +@sa bt_stream_class_set_supports_packets() — + Sets whether or not a stream class's streams have packets. +@sa bt_stream_class_packets_have_beginning_default_clock_snapshot() — + Returns whether or not the packets of a stream class's streams + have a beginning default clock snapshot. +*/ +extern bt_bool bt_stream_class_packets_have_end_default_clock_snapshot( + const bt_stream_class *stream_class); + +/*! +@brief + Sets whether or not the instances (\bt_p_stream) of the + stream class \bt_p{stream_class} can have discarded events and, + if so, if the \bt_p_disc_ev_msg of those streams have + beginning and end default \bt_p_cs. + +See the +\ref api-tir-stream-cls-prop-supports-disc-ev "supports discarded events?" +and +\ref api-tir-stream-cls-prop-disc-ev-cs "discarded events have default clock snapshots?" +properties. + +@param[in] stream_class + Stream class of which to set whether or not its streams can have + discarded events. +@param[in] supports_discarded_events + #BT_TRUE to make the streams of \bt_p{stream_class} be able to + have discarded events. +@param[in] with_default_clock_snapshots + #BT_TRUE to make the discarded events messages the streams of + \bt_p{stream_class} have beginning and end default clock snapshots. + +@bt_pre_not_null{stream_class} +@bt_pre_hot{stream_class} +@pre + If \bt_p{with_default_clock_snapshots} is #BT_TRUE, + \bt_p{supports_discarded_events} is also #BT_TRUE. +@pre + If \bt_p{with_default_clock_snapshots} is #BT_TRUE, + \bt_p{stream_class} has a + \ref api-tir-stream-cls-prop-def-clock-cls "default clock class". + +@sa bt_stream_class_supports_discarded_events() — + Returns whether or not a stream class's streams can have + discarded events. +@sa bt_stream_class_discarded_events_have_default_clock_snapshots() — + Returns whether or not the discarded events messages of a + stream class's streams have beginning and end default clock + snapshots. +*/ +extern void bt_stream_class_set_supports_discarded_events( + bt_stream_class *stream_class, + bt_bool supports_discarded_events, + bt_bool with_default_clock_snapshots); + +/*! +@brief + Returns whether or not the instances (\bt_p_stream) of the + stream class \bt_p{stream_class} can have discarded events. + +See the +\ref api-tir-stream-cls-prop-supports-disc-ev "supports discarded events?" +property. + +@param[in] stream_class + Stream class of which to get whether or not its streams can have + discarded events. + +@returns + #BT_TRUE if the streams of \bt_p{stream_class} can have discarded + events. + +@bt_pre_not_null{stream_class} + +@sa bt_stream_class_set_supports_discarded_events() — + Sets whether or not a stream class's streams can have discarded + events. +*/ +extern bt_bool bt_stream_class_supports_discarded_events( + const bt_stream_class *stream_class); + +/*! +@brief + Returns whether or not the \bt_p_disc_ev_msg of the instances + (\bt_p_stream) of the stream class \bt_p{stream_class} have + beginning and end default \bt_p_cs. + +See the +\ref api-tir-stream-cls-prop-disc-ev-cs "discarded events have default clock snapshots?" +property. + +@param[in] stream_class + Stream class of which to get whether or not its streams's discarded + events messages have a beginning and end default clock snapshots. + +@returns + #BT_TRUE if the discarded events messages of the streams of + \bt_p{stream_class} have beginning and end default clock snapshots. + +@bt_pre_not_null{stream_class} + +@sa bt_stream_class_set_supports_discarded_events() — + Sets whether or not a stream class's streams can have discarded + events. +*/ +extern bt_bool bt_stream_class_discarded_events_have_default_clock_snapshots( + const bt_stream_class *stream_class); + +/*! +@brief + Sets whether or not the instances (\bt_p_stream) of the + stream class \bt_p{stream_class} can have discarded packets and, + if so, if the \bt_p_disc_pkt_msg of those streams have + beginning and end default \bt_p_cs. + +See the +\ref api-tir-stream-cls-prop-supports-disc-pkt "supports discarded packets?" +and +\ref api-tir-stream-cls-prop-disc-pkt-cs "discarded packets have default clock snapshots?" +properties. + +\bt_p{stream_class} must support packets (see +bt_stream_class_set_supports_packets()). + +@param[in] stream_class + Stream class of which to set whether or not its streams can have + discarded packets. +@param[in] supports_discarded_packets + #BT_TRUE to make the streams of \bt_p{stream_class} be able to + have discarded packets. +@param[in] with_default_clock_snapshots + #BT_TRUE to make the discarded packets messages the streams of + \bt_p{stream_class} have beginning and end default clock snapshots. + +@bt_pre_not_null{stream_class} +@bt_pre_hot{stream_class} +@pre + bt_stream_class_supports_packets(stream_class) + returns #BT_TRUE. +@pre + If \bt_p{with_default_clock_snapshots} is #BT_TRUE, + \bt_p{supports_discarded_packets} is also #BT_TRUE. +@pre + If \bt_p{with_default_clock_snapshots} is #BT_TRUE, + \bt_p{stream_class} has a + \ref api-tir-stream-cls-prop-def-clock-cls "default clock class". + +@sa bt_stream_class_supports_discarded_packets() — + Returns whether or not a stream class's streams can have + discarded packets. +@sa bt_stream_class_discarded_packets_have_default_clock_snapshots() — + Returns whether or not the discarded packets messages of a + stream class's streams have beginning and end default clock + snapshots. +*/ +extern void bt_stream_class_set_supports_discarded_packets( + bt_stream_class *stream_class, + bt_bool supports_discarded_packets, + bt_bool with_default_clock_snapshots); + +/*! +@brief + Returns whether or not the instances (\bt_p_stream) of the + stream class \bt_p{stream_class} can have discarded packets. + +See the +\ref api-tir-stream-cls-prop-supports-disc-pkt "supports discarded packets?" +property. + +@param[in] stream_class + Stream class of which to get whether or not its streams can have + discarded packets. + +@returns + #BT_TRUE if the streams of \bt_p{stream_class} can have discarded + packets. + +@bt_pre_not_null{stream_class} + +@sa bt_stream_class_set_supports_discarded_packets() — + Sets whether or not a stream class's streams can have discarded + packets. +*/ +extern bt_bool bt_stream_class_supports_discarded_packets( + const bt_stream_class *stream_class); + +/*! +@brief + Returns whether or not the \bt_p_disc_pkt_msg of the instances + (\bt_p_stream) of the stream class \bt_p{stream_class} have + beginning and end default \bt_p_cs. + +See the +\ref api-tir-stream-cls-prop-disc-ev-cs "discarded packets have default clock snapshots?" +property. + +@param[in] stream_class + Stream class of which to get whether or not its streams's discarded + packets messages have a beginning and end default clock snapshots. + +@returns + #BT_TRUE if the discarded packets messages of the streams of + \bt_p{stream_class} have beginning and end default clock snapshots. + +@bt_pre_not_null{stream_class} + +@sa bt_stream_class_set_supports_discarded_packets() — + Sets whether or not a stream class's streams can have discarded + packets. +*/ +extern bt_bool bt_stream_class_discarded_packets_have_default_clock_snapshots( + const bt_stream_class *stream_class); + +/*! +@brief + Sets the user attributes of the stream class \bt_p{stream_class} to + \bt_p{user_attributes}. + +See the \ref api-tir-stream-cls-prop-user-attrs "user attributes" +property. + +@note + When you create a default stream class with bt_stream_class_create() + or bt_stream_class_create_with_id(), the stream class's initial user + attributes is an empty \bt_map_val. Therefore you can borrow it with + bt_stream_class_borrow_user_attributes() and fill it directly + instead of setting a new one with this function. + +@param[in] stream_class + Stream class of which to set the user attributes to + \bt_p{user_attributes}. +@param[in] user_attributes + New user attributes of \bt_p{stream_class}. + +@bt_pre_not_null{stream_class} +@bt_pre_hot{stream_class} +@bt_pre_not_null{user_attributes} +@bt_pre_is_map_val{user_attributes} + +@sa bt_stream_class_borrow_user_attributes() — + Borrows the user attributes of a stream class. +*/ +extern void bt_stream_class_set_user_attributes( + bt_stream_class *stream_class, const bt_value *user_attributes); + +/*! +@brief + Borrows the user attributes of the stream class \bt_p{stream_class}. + +See the \ref api-tir-stream-cls-prop-user-attrs "user attributes" +property. + +@note + When you create a default stream class with bt_stream_class_create() + or bt_stream_class_create_with_id(), the stream class's initial user + attributes is an empty \bt_map_val. + +@param[in] stream_class + Stream class from which to borrow the user attributes. + +@returns + User attributes of \bt_p{stream_class} (a \bt_map_val). + +@bt_pre_not_null{stream_class} + +@sa bt_stream_class_set_user_attributes() — + Sets the user attributes of a stream class. +@sa bt_stream_class_borrow_user_attributes_const() — + \c const version of this function. +*/ +extern bt_value *bt_stream_class_borrow_user_attributes( + bt_stream_class *stream_class); + +/*! +@brief + Borrows the user attributes of the stream class \bt_p{stream_class} + (\c const version). + +See bt_stream_class_borrow_user_attributes(). +*/ +extern const bt_value *bt_stream_class_borrow_user_attributes_const( + const bt_stream_class *stream_class); + +/*! @} */ + +/*! +@name Reference count +@{ +*/ + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the stream class \bt_p{stream_class}. + +@param[in] stream_class + @parblock + Stream class of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_stream_class_put_ref() — + Decrements the reference count of a stream class. +*/ +extern void bt_stream_class_get_ref(const bt_stream_class *stream_class); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the stream class \bt_p{stream_class}. + +@param[in] stream_class + @parblock + Stream class of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_stream_class_get_ref() — + Increments the reference count of a stream class. +*/ +extern void bt_stream_class_put_ref(const bt_stream_class *stream_class); + +/*! +@brief + Decrements the reference count of the stream class + \bt_p{_stream_class}, and then sets \bt_p{_stream_class} to \c NULL. + +@param _stream_class + @parblock + Stream class of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_stream_class} +*/ +#define BT_STREAM_CLASS_PUT_REF_AND_RESET(_stream_class) \ + do { \ + bt_stream_class_put_ref(_stream_class); \ + (_stream_class) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the stream class \bt_p{_dst}, sets + \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} to \c NULL. + +This macro effectively moves a stream class reference from the expression +\bt_p{_src} to the expression \bt_p{_dst}, putting the existing +\bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_STREAM_CLASS_MOVE_REF(_dst, _src) \ + do { \ + bt_stream_class_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! @} */ #ifdef __cplusplus } diff --git a/include/babeltrace2/trace-ir/stream-const.h b/include/babeltrace2/trace-ir/stream-const.h deleted file mode 100644 index bf809830..00000000 --- a/include/babeltrace2/trace-ir/stream-const.h +++ /dev/null @@ -1,72 +0,0 @@ -#ifndef BABELTRACE2_TRACE_IR_STREAM_CONST_H -#define BABELTRACE2_TRACE_IR_STREAM_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern const bt_value *bt_stream_borrow_user_attributes_const( - const bt_stream *stream); - -extern const bt_stream_class *bt_stream_borrow_class_const( - const bt_stream *stream); - -extern const bt_trace *bt_stream_borrow_trace_const( - const bt_stream *stream); - -extern const char *bt_stream_get_name(const bt_stream *stream); - -extern uint64_t bt_stream_get_id(const bt_stream *stream); - -extern void bt_stream_get_ref(const bt_stream *stream); - -extern void bt_stream_put_ref(const bt_stream *stream); - -#define BT_STREAM_PUT_REF_AND_RESET(_var) \ - do { \ - bt_stream_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_STREAM_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_stream_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_TRACE_IR_STREAM_CONST_H */ diff --git a/include/babeltrace2/trace-ir/stream.h b/include/babeltrace2/trace-ir/stream.h index 416e42ce..32bc98e1 100644 --- a/include/babeltrace2/trace-ir/stream.h +++ b/include/babeltrace2/trace-ir/stream.h @@ -35,30 +35,631 @@ extern "C" { #endif +/*! +@defgroup api-tir-stream Stream +@ingroup api-tir + +@brief + Trace stream. + +A stream is a conceptual +\ref api-msg-seq "sequence of messages" within a \bt_trace: + +@image html trace-structure.png + +In the illustration above, notice that: + +- A \bt_stream is a conceptual sequence of \bt_p_msg. + + The sequence always starts with a \bt_sb_msg and ends with a + \bt_se_msg. + +- A stream is an instance of a \bt_stream_cls. + +- A \bt_trace contains one or more streams. + +A stream is a \ref api-tir "trace IR" data object. + +A stream is said to be a \em conceptual sequence of messages because the +stream object itself does not contain messages: it only represents a +common timeline to which messages are associated. + +\bt_cp_comp exchange messages, within a trace processing \bt_graph, +which can belong to different streams, as long as the stream clocks are +\ref api-tir-clock-cls-origin "correlatable". + +A typical use case for streams is to use one for each traced CPU. Then +the messages related to a given stream are the ones which occured on a +given CPU. Other schemes are possible: they are completely +application-specific, and \bt_name does not enforce any specific +stream arrangement pattern. + +A \bt_trace contains streams. All the streams of a +given trace, for a given stream class, have unique numeric IDs. Borrow +the trace which contains a stream with bt_stream_borrow_trace() or +bt_stream_borrow_trace_const(). + +A \bt_stream can conceptually contain a default clock if its class +has a \ref api-tir-stream-cls-prop-def-clock-cls "default clock class". +There's no function to access a stream's default clock because it's +a stateful object: \bt_p_msg cannot refer to stateful objects +because they must not change while being transported from one +\bt_comp to the other. Instead of having a stream default clock object, +\bt_p_msg have a default \bt_cs: this is a snapshot of the value of a +stream's default clock (a \bt_clock_cls instance): + +@image html clocks.png + +In the illustration above, notice that: + +- Streams (horizontal blue rectangles) are instances of a + \bt_stream_cls (orange). + +- A stream class has a default \bt_clock_cls (orange bell alarm clock). + +- Each stream has a default clock (yellow bell alarm clock): this is an + instance of the stream's class's default clock class. + +- Each \bt_msg (objects in blue stream rectangles) created for a given + stream has a default \bt_cs (yellow star): this is a snapshot of the + stream's default clock. + + In other words, a default clock snapshot contains the value of the + stream's default clock when this message occured. + +To create a stream: + +
    +
    + If bt_stream_class_assigns_automatic_stream_id() returns + #BT_TRUE (the default) for the stream class to use +
    +
    Use bt_stream_create().
    + +
    + If bt_stream_class_assigns_automatic_stream_id() returns + #BT_FALSE for the stream class to use +
    +
    Use bt_stream_create_with_id().
    +
    + +A stream is a \ref api-fund-shared-object "shared object": get a +new reference with bt_stream_get_ref() and put an existing +reference with bt_stream_put_ref(). + +Some library functions \ref api-fund-freezing "freeze" streams on +success. The documentation of those functions indicate this +postcondition. + +The type of a stream is #bt_stream. + +

    Properties

    + +A stream has the following property: + +
    +
    \anchor api-tir-stream-prop-id Numeric ID
    +
    + Numeric ID, unique amongst the numeric IDs of the stream's + \bt_trace's streams for a given \bt_stream_cls. In other words, + two streams which belong to the same trace can have the same numeric + ID if they aren't instances of the same class. + + Depending on whether or not the stream's class + automatically assigns stream IDs + (see bt_stream_class_assigns_automatic_stream_id()), + set the stream's numeric ID on creation with + bt_stream_create() or bt_stream_create_with_id(). + + You cannot change the numeric ID once the stream is created. + + Get a stream's numeric ID with bt_stream_get_id(). +
    + +
    \anchor api-tir-stream-prop-name \bt_dt_opt Name
    +
    + Name of the stream. + + Use bt_stream_set_name() and bt_stream_get_name(). +
    + +
    + \anchor api-tir-stream-prop-user-attrs + \bt_dt_opt User attributes +
    +
    + User attributes of the stream. + + User attributes are custom attributes attached to a stream. + + Use bt_stream_set_user_attributes(), + bt_stream_borrow_user_attributes(), and + bt_stream_borrow_user_attributes_const(). +
    +
    +*/ + +/*! @{ */ + +/*! +@name Type +@{ + +@typedef struct bt_stream bt_stream; + +@brief + Stream. + +@} +*/ + +/*! +@name Creation +@{ +*/ + +/*! +@brief + Creates a stream from the \bt_stream_cls \bt_p{stream_class} and + adds it to the \bt_trace \bt_p{trace}. + +This function instantiates \bt_p{stream_class}. + +@attention + @parblock + Only use this function if + + @code + bt_stream_class_assigns_automatic_stream_id(stream_class) + @endcode + + returns #BT_TRUE. + + Otherwise, use bt_stream_create_with_id(). + @endparblock + +On success, the returned stream has the following property values: + + + + + + +
    Property + Value +
    \ref api-tir-stream-prop-id "Numeric ID" + Automatically assigned by \bt_p{stream_class} and \bt_p{trace} +
    \ref api-tir-stream-prop-name "Name" + \em None +
    \ref api-tir-stream-prop-user-attrs "User attributes" + Empty \bt_map_val +
    + +@param[in] stream_class + Stream class from which to create the stream. +@param[in] trace + Trace to add the created stream to. + +@returns + New stream reference, or \c NULL on memory error. + +@bt_pre_not_null{stream_class} +@pre + bt_stream_class_assigns_automatic_stream_id(stream_class) + returns #BT_TRUE. +@bt_pre_not_null{trace} + +@bt_post_success_frozen{stream_class} +@bt_post_success_frozen{trace} + +@sa bt_stream_create_with_id() — + Creates a stream with a specific numeric ID and adds it to a + trace. +*/ extern bt_stream *bt_stream_create(bt_stream_class *stream_class, bt_trace *trace); +/*! +@brief + Creates a stream with the numeric ID \bt_p{id} + from the \bt_stream_cls \bt_p{stream_class} and adds + it to the \bt_trace \bt_p{trace}. + +This function instantiates \bt_p{stream_class}. + +@attention + @parblock + Only use this function if + + @code + bt_stream_class_assigns_automatic_stream_id(stream_class) + @endcode + + returns #BT_FALSE. + + Otherwise, use bt_stream_create(). + @endparblock + +On success, the returned stream has the following property values: + + + + + + +
    Property + Value +
    \ref api-tir-stream-prop-id "Numeric ID" + \bt_p{id} +
    \ref api-tir-stream-prop-name "Name" + \em None +
    \ref api-tir-stream-prop-user-attrs "User attributes" + Empty \bt_map_val +
    + +@param[in] stream_class + Stream class from which to create the stream. +@param[in] trace + Trace to add the created stream to. +@param[in] id + Numeric ID of the stream to create and add to \bt_p{trace}. + +@returns + New stream reference, or \c NULL on memory error. + +@bt_pre_not_null{stream_class} +@pre + bt_stream_class_assigns_automatic_stream_id(stream_class) + returns #BT_FALSE. +@bt_pre_not_null{trace} +@pre + \bt_p{trace} does not contain an instance of \bt_p{stream_class} + with the numeric ID \bt_p{id}. + +@bt_post_success_frozen{stream_class} +@bt_post_success_frozen{trace} + +@sa bt_stream_create() — + Creates a stream with an automatic numeric ID and adds it to a + trace. +*/ extern bt_stream *bt_stream_create_with_id( bt_stream_class *stream_class, bt_trace *trace, uint64_t id); -extern bt_value *bt_stream_borrow_user_attributes(bt_stream *stream); +/*! @} */ -extern void bt_stream_set_user_attributes( - bt_stream *stream, const bt_value *user_attributes); +/*! +@name Class access +@{ +*/ -extern bt_trace *bt_stream_borrow_trace(bt_stream *stream); +/*! +@brief + Borrows the \ref api-tir-stream-cls "class" of the stream + \bt_p{stream}. + +@param[in] stream + Stream of which to borrow the class. + +@returns + \em Borrowed reference of the class of \bt_p{stream}. + +@bt_pre_not_null{stream} +@sa bt_stream_borrow_class_const() — + \c const version of this function. +*/ extern bt_stream_class *bt_stream_borrow_class(bt_stream *stream); +/*! +@brief + Borrows the \ref api-tir-stream-cls "class" of the stream + \bt_p{stream} (\c const version). + +See bt_stream_borrow_class(). +*/ +extern const bt_stream_class *bt_stream_borrow_class_const( + const bt_stream *stream); + +/*! @} */ + +/*! +@name Trace access +@{ +*/ + +/*! +@brief + Borrows the \bt_trace which contains the stream \bt_p{stream}. + +@param[in] stream + Stream of which to borrow the trace containing it. + +@returns + \em Borrowed reference of the trace containing \bt_p{stream}. + +@bt_pre_not_null{stream} + +@sa bt_stream_borrow_trace_const() — + \c const version of this function. +*/ +extern bt_trace *bt_stream_borrow_trace(bt_stream *stream); + +/*! +@brief + Borrows the \bt_trace which contains the stream \bt_p{stream} + (\c const version). + +See bt_stream_borrow_trace(). +*/ +extern const bt_trace *bt_stream_borrow_trace_const( + const bt_stream *stream); + +/*! @} */ + +/*! +@name Properties +@{ +*/ + +/*! +@brief + Returns the numeric ID of the stream \bt_p{stream}. + +See the \ref api-tir-stream-prop-id "numeric ID" property. + +@param[in] stream + Stream of which to get the numeric ID. + +@returns + Numeric ID of \bt_p{stream}. + +@bt_pre_not_null{stream} + +@sa bt_stream_create_with_id() — + Creates a stream with a specific numeric ID and adds it to a + trace. +*/ +extern uint64_t bt_stream_get_id(const bt_stream *stream); + +/*! +@brief + Status codes for bt_stream_set_name(). +*/ typedef enum bt_stream_set_name_status { - BT_STREAM_SET_NAME_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + /*! + @brief + Success. + */ BT_STREAM_SET_NAME_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_STREAM_SET_NAME_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, } bt_stream_set_name_status; +/*! +@brief + Sets the name of the stream \bt_p{stream} to + a copy of \bt_p{name}. + +See the \ref api-tir-stream-prop-name "name" property. + +@param[in] stream + Stream of which to set the name to \bt_p{name}. +@param[in] name + New name of \bt_p{stream} (copied). + +@retval #BT_STREAM_CLASS_SET_NAME_STATUS_OK + Success. +@retval #BT_STREAM_CLASS_SET_NAME_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{stream} +@bt_pre_hot{stream} +@bt_pre_not_null{name} + +@sa bt_stream_get_name() — + Returns the name of a stream. +*/ extern bt_stream_set_name_status bt_stream_set_name(bt_stream *stream, const char *name); +/*! +@brief + Returns the name of the stream \bt_p{stream}. + +See the \ref api-tir-stream-prop-name "name" property. + +If \bt_p{stream} has no name, this function returns \c NULL. + +@param[in] stream + Stream of which to get the name. + +@returns + @parblock + Name of \bt_p{stream}, or \c NULL if none. + + The returned pointer remains valid as long as \bt_p{stream} + is not modified. + @endparblock + +@bt_pre_not_null{stream} + +@sa bt_stream_class_set_name() — + Sets the name of a stream. +*/ +extern const char *bt_stream_get_name(const bt_stream *stream); + +/*! +@brief + Sets the user attributes of the stream \bt_p{stream} to + \bt_p{user_attributes}. + +See the \ref api-tir-stream-prop-user-attrs "user attributes" +property. + +@note + When you create a default stream with bt_stream_create() + or bt_stream_create_with_id(), the stream's initial user + attributes is an empty \bt_map_val. Therefore you can borrow it with + bt_stream_borrow_user_attributes() and fill it directly + instead of setting a new one with this function. + +@param[in] stream + Stream of which to set the user attributes to + \bt_p{user_attributes}. +@param[in] user_attributes + New user attributes of \bt_p{stream}. + +@bt_pre_not_null{stream} +@bt_pre_hot{stream} +@bt_pre_not_null{user_attributes} +@bt_pre_is_map_val{user_attributes} + +@sa bt_stream_borrow_user_attributes() — + Borrows the user attributes of a stream. +*/ +extern void bt_stream_set_user_attributes( + bt_stream *stream, const bt_value *user_attributes); + +/*! +@brief + Borrows the user attributes of the stream \bt_p{stream}. + +See the \ref api-tir-stream-prop-user-attrs "user attributes" +property. + +@note + When you create a default stream with bt_stream_create() + or bt_stream_create_with_id(), the stream's initial user + attributes is an empty \bt_map_val. + +@param[in] stream + Stream from which to borrow the user attributes. + +@returns + User attributes of \bt_p{stream} (a \bt_map_val). + +@bt_pre_not_null{stream} + +@sa bt_stream_set_user_attributes() — + Sets the user attributes of a stream. +@sa bt_stream_borrow_user_attributes_const() — + \c const version of this function. +*/ +extern bt_value *bt_stream_borrow_user_attributes(bt_stream *stream); + +/*! +@brief + Borrows the user attributes of the stream \bt_p{stream} + (\c const version). + +See bt_stream_borrow_user_attributes(). +*/ +extern const bt_value *bt_stream_borrow_user_attributes_const( + const bt_stream *stream); + +/*! @} */ + +/*! +@name Reference count +@{ +*/ + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the stream \bt_p{stream}. + +@param[in] stream + @parblock + Stream of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_stream_put_ref() — + Decrements the reference count of a stream. +*/ +extern void bt_stream_get_ref(const bt_stream *stream); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the stream \bt_p{stream}. + +@param[in] stream + @parblock + Stream of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_stream_get_ref() — + Increments the reference count of a stream. +*/ +extern void bt_stream_put_ref(const bt_stream *stream); + +/*! +@brief + Decrements the reference count of the stream + \bt_p{_stream}, and then sets \bt_p{_stream} to \c NULL. + +@param _stream + @parblock + Stream of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_stream} +*/ +#define BT_STREAM_PUT_REF_AND_RESET(_stream) \ + do { \ + bt_stream_put_ref(_stream); \ + (_stream) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the stream \bt_p{_dst}, sets + \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} to \c NULL. + +This macro effectively moves a stream reference from the expression +\bt_p{_src} to the expression \bt_p{_dst}, putting the existing +\bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_STREAM_MOVE_REF(_dst, _src) \ + do { \ + bt_stream_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! @} */ + #ifdef __cplusplus } #endif diff --git a/include/babeltrace2/trace-ir/trace-class-const.h b/include/babeltrace2/trace-ir/trace-class-const.h deleted file mode 100644 index 6ad9a9d7..00000000 --- a/include/babeltrace2/trace-ir/trace-class-const.h +++ /dev/null @@ -1,98 +0,0 @@ -#ifndef BABELTRACE2_TRACE_IR_TRACE_CLASS_CONST_H -#define BABELTRACE2_TRACE_IR_TRACE_CLASS_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef void (* bt_trace_class_destruction_listener_func)( - const bt_trace_class *trace_class, void *data); - -extern const bt_value *bt_trace_class_borrow_user_attributes_const( - const bt_trace_class *trace_class); - -extern bt_bool bt_trace_class_assigns_automatic_stream_class_id( - const bt_trace_class *trace_class); - -extern uint64_t bt_trace_class_get_stream_class_count( - const bt_trace_class *trace_class); - -extern const bt_stream_class * -bt_trace_class_borrow_stream_class_by_index_const( - const bt_trace_class *trace_class, uint64_t index); - -extern const bt_stream_class *bt_trace_class_borrow_stream_class_by_id_const( - const bt_trace_class *trace_class, uint64_t id); - -typedef enum bt_trace_class_add_listener_status { - BT_TRACE_CLASS_ADD_LISTENER_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, - BT_TRACE_CLASS_ADD_LISTENER_STATUS_OK = __BT_FUNC_STATUS_OK, -} bt_trace_class_add_listener_status; - -extern bt_trace_class_add_listener_status -bt_trace_class_add_destruction_listener( - const bt_trace_class *trace_class, - bt_trace_class_destruction_listener_func listener, - void *data, bt_listener_id *listener_id); - -typedef enum bt_trace_class_remove_listener_status { - BT_TRACE_CLASS_REMOVE_LISTENER_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, - BT_TRACE_CLASS_REMOVE_LISTENER_STATUS_OK = __BT_FUNC_STATUS_OK, -} bt_trace_class_remove_listener_status; - -extern bt_trace_class_remove_listener_status -bt_trace_class_remove_destruction_listener( - const bt_trace_class *trace_class, bt_listener_id listener_id); - -extern void bt_trace_class_get_ref(const bt_trace_class *trace_class); - -extern void bt_trace_class_put_ref(const bt_trace_class *trace_class); - -#define BT_TRACE_CLASS_PUT_REF_AND_RESET(_var) \ - do { \ - bt_trace_class_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_TRACE_CLASS_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_trace_class_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_TRACE_IR_TRACE_CLASS_CONST_H */ diff --git a/include/babeltrace2/trace-ir/trace-class.h b/include/babeltrace2/trace-ir/trace-class.h index d90ba2c9..3bfbe347 100644 --- a/include/babeltrace2/trace-ir/trace-class.h +++ b/include/babeltrace2/trace-ir/trace-class.h @@ -1,4 +1,4 @@ -#ifndef BABELTRACE2_TRACE_IR_TRACE_CLASS_H + #ifndef BABELTRACE2_TRACE_IR_TRACE_CLASS_H #define BABELTRACE2_TRACE_IR_TRACE_CLASS_H /* @@ -35,23 +35,634 @@ extern "C" { #endif -extern bt_trace_class *bt_trace_class_create(bt_self_component *self_comp); +/*! +@defgroup api-tir-trace-cls Trace class +@ingroup api-tir -extern bt_value *bt_trace_class_borrow_user_attributes( - bt_trace_class *trace_class); +@brief + Class of \bt_p_trace. -extern void bt_trace_class_set_user_attributes( - bt_trace_class *trace_class, const bt_value *user_attributes); +A trace class is the class of \bt_p_trace: -extern void bt_trace_class_set_assigns_automatic_stream_class_id( - bt_trace_class *trace_class, bt_bool value); +@image html trace-structure.png + +In the illustration above, notice that a trace is an instance of a +trace class. + +A trace class is a \ref api-tir "trace IR" metadata object. + +A trace class is a \ref api-fund-shared-object "shared object": get a +new reference with bt_trace_class_get_ref() and put an existing +reference with bt_trace_class_put_ref(). + +Some library functions \ref api-fund-freezing "freeze" trace classes on +success. The documentation of those functions indicate this +postcondition. With a frozen trace class, you can still: + +- Create and add a \bt_p_stream_cls to it with + bt_stream_class_create() or bt_stream_class_create_with_id(). +- Add a destruction listener to it with + bt_trace_class_add_destruction_listener(). + +The type of a trace class is #bt_trace_class. + +A trace class contains \bt_p_stream_cls. All the stream classes of a +given trace class have unique +\ref api-tir-stream-cls-prop-id "numeric IDs". Get the number of stream +classes in a trace class with bt_trace_class_get_stream_class_count(). +Borrow a specific stream class from a trace class with +bt_trace_class_borrow_stream_class_by_index(), +bt_trace_class_borrow_stream_class_by_index_const(), +bt_trace_class_borrow_stream_class_by_id(), or +bt_trace_class_borrow_stream_class_by_id_const(). + +Set whether or not the \bt_p_stream_cls you create for a trace class get +automatic numeric IDs with +bt_trace_class_set_assigns_automatic_stream_class_id(). + +Create a default trace class from a \bt_self_comp with +bt_trace_class_create(). + +Add to and remove a destruction listener from a trace class with +bt_trace_class_add_destruction_listener() and +bt_trace_class_remove_destruction_listener(). + +

    Properties

    + +A trace class has the following properties: + +
    +
    + \anchor api-tir-trace-cls-prop-auto-sc-id + Assigns automatic stream class IDs? +
    +
    + Whether or not the stream classes you create and add to the trace + class get \ref api-tir-stream-cls-prop-id "numeric IDs" + automatically. + + Depending on the value of this property, to create a stream class + and add it to the trace class: + +
    +
    #BT_TRUE
    +
    + Use bt_stream_class_create(). +
    + +
    #BT_FALSE
    +
    + Use bt_stream_class_create_with_id(). +
    +
    + + Use bt_trace_class_set_assigns_automatic_stream_class_id() + and bt_trace_class_assigns_automatic_stream_class_id(). +
    + +
    + \anchor api-tir-trace-cls-prop-user-attrs + \bt_dt_opt User attributes +
    +
    + User attributes of the trace class. + + User attributes are custom attributes attached to a trace class. + + Use bt_trace_class_set_user_attributes(), + bt_trace_class_borrow_user_attributes(), and + bt_trace_class_borrow_user_attributes_const(). +
    +
    +*/ + +/*! @{ */ + +/*! +@name Type +@{ + +@typedef struct bt_trace_class bt_trace_class; + +@brief + Trace class. + +@} +*/ + +/*! +@name Creation +@{ +*/ + +/*! +@brief + Creates a default trace class from the \bt_self_comp + \bt_p{self_component}. + +On success, the returned trace class has the following property values: + + + + + +
    Property + Value +
    \ref api-tir-trace-cls-prop-auto-sc-id "Assigns automatic stream class IDs?" + Yes +
    \ref api-tir-trace-cls-prop-user-attrs "User attributes" + Empty \bt_map_val +
    + +@param[in] self_component + Self component from which to create the default trace class. +@returns + New trace class reference, or \c NULL on memory error. +*/ +extern bt_trace_class *bt_trace_class_create(bt_self_component *self_component); + +/*! @} */ + +/*! +@name Stream class access +@{ +*/ + +/*! +@brief + Returns the number of \bt_p_stream_cls contained in the trace + class \bt_p{trace_class}. + +@param[in] trace_class + Trace class of which to get the number of contained stream classes. + +@returns + Number of contained stream classes in \bt_p{trace_class}. + +@bt_pre_not_null{trace_class} +*/ +extern uint64_t bt_trace_class_get_stream_class_count( + const bt_trace_class *trace_class); + +/*! +@brief + Borrows the \bt_stream_cls at index \bt_p{index} from the + trace class \bt_p{trace_class}. + +@param[in] trace_class + Trace class from which to borrow the stream class at index + \bt_p{index}. +@param[in] index + Index of the stream class to borrow from \bt_p{trace_class}. + +@returns + @parblock + \em Borrowed reference of the stream class of + \bt_p{trace_class} at index \bt_p{index}. + + The returned pointer remains valid as long as \bt_p{trace_class} + exists. + @endparblock + +@bt_pre_not_null{trace_class} +@pre + \bt_p{index} is less than the number of stream classes in + \bt_p{trace_class} (as returned by + bt_trace_class_get_stream_class_count()). + +@sa bt_trace_class_get_stream_class_count() — + Returns the number of stream classes contained in a trace class. +@sa bt_trace_class_borrow_stream_class_by_index_const() — + \c const version of this function. +*/ extern bt_stream_class *bt_trace_class_borrow_stream_class_by_index( bt_trace_class *trace_class, uint64_t index); +/*! +@brief + Borrows the \bt_stream_cls at index \bt_p{index} from the + trace class \bt_p{trace_class} (\c const version). + +See bt_trace_class_borrow_stream_class_by_index(). +*/ +extern const bt_stream_class * +bt_trace_class_borrow_stream_class_by_index_const( + const bt_trace_class *trace_class, uint64_t index); + +/*! +@brief + Borrows the \bt_stream_cls having the numeric ID \bt_p{id} from the + trace class \bt_p{trace_class}. + +If there's no stream class having the numeric ID \bt_p{id} in +\bt_p{trace_class}, this function returns \c NULL. + +@param[in] trace_class + Trace class from which to borrow the stream class having the + numeric ID \bt_p{id}. +@param[in] id + ID of the stream class to borrow from \bt_p{trace_class}. + +@returns + @parblock + \em Borrowed reference of the stream class of + \bt_p{trace_class} having the numeric ID \bt_p{id}, or \c NULL + if none. + + The returned pointer remains valid as long as \bt_p{trace_class} + exists. + @endparblock + +@bt_pre_not_null{trace_class} + +@sa bt_trace_class_borrow_stream_class_by_id_const() — + \c const version of this function. +*/ extern bt_stream_class *bt_trace_class_borrow_stream_class_by_id( bt_trace_class *trace_class, uint64_t id); +/*! +@brief + Borrows the \bt_stream_cls having the numeric ID \bt_p{id} from the + trace class \bt_p{trace_class} (\c const version). + +See bt_trace_class_borrow_stream_class_by_id(). +*/ +extern const bt_stream_class *bt_trace_class_borrow_stream_class_by_id_const( + const bt_trace_class *trace_class, uint64_t id); + +/*! @} */ + +/*! +@name Properties +@{ +*/ + +/*! +@brief + Sets whether or not the trace class \bt_p{trace_class} automatically + assigns a numeric ID to a \bt_stream_cls you create and add to it. + +See the \ref api-tir-trace-cls-prop-auto-sc-id "assigns automatic stream class IDs?" +property. + +@param[in] trace_class + Trace class of which to set whether or not it assigns automatic + stream class IDs. +@param[in] assigns_automatic_stream_class_id + #BT_TRUE to make \bt_p{trace_class} assign automatic stream class + IDs. + +@bt_pre_not_null{trace_class} +@bt_pre_hot{trace_class} + +@sa bt_trace_class_assigns_automatic_stream_class_id() — + Returns whether or not a trace class automatically assigns + stream class IDs. +*/ +extern void bt_trace_class_set_assigns_automatic_stream_class_id( + bt_trace_class *trace_class, + bt_bool assigns_automatic_stream_class_id); + +/*! +@brief + Returns whether or not the trace class \bt_p{trace_class} + automatically assigns a numeric ID to a \bt_stream_cls you create + and add to it. + +See the \ref api-tir-trace-cls-prop-auto-sc-id "assigns automatic stream class IDs?" +property. + +@param[in] trace_class + Trace class of which to get whether or not it assigns automatic + stream class IDs. + +@returns + #BT_TRUE if \bt_p{trace_class} automatically + assigns stream class IDs. + +@bt_pre_not_null{trace_class} + +@sa bt_trace_class_set_assigns_automatic_stream_class_id() — + Sets whether or not a trace class automatically assigns + stream class IDs. +*/ +extern bt_bool bt_trace_class_assigns_automatic_stream_class_id( + const bt_trace_class *trace_class); + +/*! +@brief + Sets the user attributes of the trace class \bt_p{trace_class} to + \bt_p{user_attributes}. + +See the \ref api-tir-trace-cls-prop-user-attrs "user attributes" +property. + +@note + When you create a default trace class with bt_trace_class_create() + or bt_trace_class_create_with_id(), the trace class's initial user + attributes is an empty \bt_map_val. Therefore you can borrow it with + bt_trace_class_borrow_user_attributes() and fill it directly + instead of setting a new one with this function. + +@param[in] trace_class + Trace class of which to set the user attributes to + \bt_p{user_attributes}. +@param[in] user_attributes + New user attributes of \bt_p{trace_class}. + +@bt_pre_not_null{trace_class} +@bt_pre_hot{trace_class} +@bt_pre_not_null{user_attributes} +@bt_pre_is_map_val{user_attributes} + +@sa bt_trace_class_borrow_user_attributes() — + Borrows the user attributes of a trace class. +*/ +extern void bt_trace_class_set_user_attributes( + bt_trace_class *trace_class, const bt_value *user_attributes); + +/*! +@brief + Borrows the user attributes of the trace class \bt_p{trace_class}. + +See the \ref api-tir-trace-cls-prop-user-attrs "user attributes" +property. + +@note + When you create a default trace class with bt_trace_class_create() + or bt_trace_class_create_with_id(), the trace class's initial user + attributes is an empty \bt_map_val. + +@param[in] trace_class + Trace class from which to borrow the user attributes. + +@returns + User attributes of \bt_p{trace_class} (a \bt_map_val). + +@bt_pre_not_null{trace_class} + +@sa bt_trace_class_set_user_attributes() — + Sets the user attributes of a trace class. +@sa bt_trace_class_borrow_user_attributes_const() — + \c const version of this function. +*/ +extern bt_value *bt_trace_class_borrow_user_attributes( + bt_trace_class *trace_class); + +/*! +@brief + Borrows the user attributes of the trace class \bt_p{trace_class} + (\c const version). + +See bt_trace_class_borrow_user_attributes(). +*/ +extern const bt_value *bt_trace_class_borrow_user_attributes_const( + const bt_trace_class *trace_class); + +/*! @} */ + +/*! +@name Listeners +@{ +*/ + +/*! +@brief + User function for bt_trace_class_add_destruction_listener(). + +This is the user function type for a trace class destruction listener. + +@param[in] trace_class + Trace class being destroyed (\ref api-fund-freezing "frozen"). +@param[in] user_data + User data, as passed as the \bt_p{user_data} parameter of + bt_trace_class_add_destruction_listener(). + +@bt_pre_not_null{trace_class} + +@post + The reference count of \bt_p{trace_class} is not changed. +@bt_post_no_error + +@sa bt_trace_class_add_destruction_listener() — + Adds a destruction listener to a trace class. +*/ +typedef void (* bt_trace_class_destruction_listener_func)( + const bt_trace_class *trace_class, void *user_data); + +/*! +@brief + Status codes for bt_trace_class_add_destruction_listener(). +*/ +typedef enum bt_trace_class_add_listener_status { + /*! + @brief + Success. + */ + BT_TRACE_CLASS_ADD_LISTENER_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_TRACE_CLASS_ADD_LISTENER_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, +} bt_trace_class_add_listener_status; + +/*! +@brief + Adds a destruction listener having the function \bt_p{user_func} + to the trace class \bt_p{trace_class}. + +All the destruction listener user functions of a trace class are called +when it's being destroyed. + +If \bt_p{listener_id} is not \c NULL, then this function, on success, +sets \bt_p{*listener_id} to the ID of the added destruction listener +within \bt_p{trace_class}. You can then use this ID to remove the +added destruction listener with +bt_trace_class_remove_destruction_listener(). + +@param[in] trace_class + Trace class to add the destruction listener to. +@param[in] user_func + User function of the destruction listener to add to + \bt_p{trace_class}. +@param[in] user_data + User data to pass as the \bt_p{user_data} parameter of + \bt_p{user_func}. +@param[out] listener_id + On success and if not \c NULL, \bt_p{*listener_id} + is the ID of the added destruction listener within + \bt_p{trace_class}. + +@retval #BT_TRACE_CLASS_ADD_LISTENER_STATUS_OK + Success. +@retval #BT_TRACE_CLASS_ADD_LISTENER_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{trace_class} +@bt_pre_not_null{user_func} + +@sa bt_trace_class_remove_destruction_listener() — + Removes a destruction listener from a trace class. +*/ +extern bt_trace_class_add_listener_status +bt_trace_class_add_destruction_listener( + const bt_trace_class *trace_class, + bt_trace_class_destruction_listener_func user_func, + void *user_data, bt_listener_id *listener_id); + +/*! +@brief + Status codes for bt_trace_class_remove_destruction_listener(). +*/ +typedef enum bt_trace_class_remove_listener_status { + /*! + @brief + Success. + */ + BT_TRACE_CLASS_REMOVE_LISTENER_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_TRACE_CLASS_REMOVE_LISTENER_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, +} bt_trace_class_remove_listener_status; + +/*! +@brief + Removes the destruction listener having the ID \bt_p{listener_id} + from the trace class \bt_p{trace_class}. + +The destruction listener to remove from \bt_p{trace_class} was +previously added with bt_trace_class_add_destruction_listener(). + +You can call this function when \bt_p{trace_class} is +\ref api-fund-freezing "frozen". + +@param[in] trace_class + Trace class from which to remove the destruction listener having + the ID \bt_p{listener_id}. +@param[in] listener_id + ID of the destruction listener to remove from \bt_p{trace_class}­. + +@retval #BT_TRACE_CLASS_REMOVE_LISTENER_STATUS_OK + Success. +@retval #BT_TRACE_CLASS_REMOVE_LISTENER_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{trace_class} +@pre + \bt_p{listener_id} is the ID of an existing destruction listener + in \bt_p{trace_class}. + +@sa bt_trace_class_add_destruction_listener() — + Adds a destruction listener to a trace class. +*/ +extern bt_trace_class_remove_listener_status +bt_trace_class_remove_destruction_listener( + const bt_trace_class *trace_class, bt_listener_id listener_id); + +/*! @} */ + +/*! +@name Reference count +@{ +*/ + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the trace class \bt_p{trace_class}. + +@param[in] trace_class + @parblock + Trace class of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_trace_class_put_ref() — + Decrements the reference count of a trace class. +*/ +extern void bt_trace_class_get_ref(const bt_trace_class *trace_class); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the trace class \bt_p{trace_class}. + +@param[in] trace_class + @parblock + Trace class of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_trace_class_get_ref() — + Increments the reference count of a trace class. +*/ +extern void bt_trace_class_put_ref(const bt_trace_class *trace_class); + +/*! +@brief + Decrements the reference count of the trace class + \bt_p{_trace_class}, and then sets \bt_p{_trace_class} to \c NULL. + +@param _trace_class + @parblock + Trace class of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_trace_class} +*/ +#define BT_TRACE_CLASS_PUT_REF_AND_RESET(_trace_class) \ + do { \ + bt_trace_class_put_ref(_trace_class); \ + (_trace_class) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the trace class \bt_p{_dst}, sets + \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} to \c NULL. + +This macro effectively moves a trace class reference from the expression +\bt_p{_src} to the expression \bt_p{_dst}, putting the existing +\bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_TRACE_CLASS_MOVE_REF(_dst, _src) \ + do { \ + bt_trace_class_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! @} */ + #ifdef __cplusplus } #endif diff --git a/include/babeltrace2/trace-ir/trace-const.h b/include/babeltrace2/trace-ir/trace-const.h deleted file mode 100644 index d4410a2d..00000000 --- a/include/babeltrace2/trace-ir/trace-const.h +++ /dev/null @@ -1,107 +0,0 @@ -#ifndef BABELTRACE2_TRACE_IR_TRACE_CONST_H -#define BABELTRACE2_TRACE_IR_TRACE_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef void (* bt_trace_destruction_listener_func)( - const bt_trace *trace, void *data); - -extern const bt_value *bt_trace_borrow_user_attributes_const( - const bt_trace *trace); - -extern const bt_trace_class *bt_trace_borrow_class_const( - const bt_trace *trace); - -extern const char *bt_trace_get_name(const bt_trace *trace); - -extern bt_uuid bt_trace_get_uuid(const bt_trace *trace); - -extern uint64_t bt_trace_get_environment_entry_count(const bt_trace *trace); - -extern void bt_trace_borrow_environment_entry_by_index_const( - const bt_trace *trace, uint64_t index, - const char **name, const bt_value **value); - -extern const bt_value *bt_trace_borrow_environment_entry_value_by_name_const( - const bt_trace *trace, const char *name); - -extern uint64_t bt_trace_get_stream_count(const bt_trace *trace); - -extern const bt_stream *bt_trace_borrow_stream_by_index_const( - const bt_trace *trace, uint64_t index); - -extern const bt_stream *bt_trace_borrow_stream_by_id_const( - const bt_trace *trace, uint64_t id); - -typedef enum bt_trace_add_listener_status { - BT_TRACE_ADD_LISTENER_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, - BT_TRACE_ADD_LISTENER_STATUS_OK = __BT_FUNC_STATUS_OK, -} bt_trace_add_listener_status; - -extern bt_trace_add_listener_status bt_trace_add_destruction_listener( - const bt_trace *trace, - bt_trace_destruction_listener_func listener, - void *data, bt_listener_id *listener_id); - -typedef enum bt_trace_remove_listener_status { - BT_TRACE_REMOVE_LISTENER_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, - BT_TRACE_REMOVE_LISTENER_STATUS_OK = __BT_FUNC_STATUS_OK, -} bt_trace_remove_listener_status; - -extern bt_trace_remove_listener_status bt_trace_remove_destruction_listener( - const bt_trace *trace, bt_listener_id listener_id); - -extern void bt_trace_get_ref(const bt_trace *trace); - -extern void bt_trace_put_ref(const bt_trace *trace); - -#define BT_TRACE_PUT_REF_AND_RESET(_var) \ - do { \ - bt_trace_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_TRACE_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_trace_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_TRACE_IR_TRACE_CONST_H */ diff --git a/include/babeltrace2/trace-ir/trace.h b/include/babeltrace2/trace-ir/trace.h index 4d17c484..a3f73dba 100644 --- a/include/babeltrace2/trace-ir/trace.h +++ b/include/babeltrace2/trace-ir/trace.h @@ -35,43 +35,938 @@ extern "C" { #endif -extern bt_trace_class *bt_trace_borrow_class(bt_trace *trace); +/*! +@defgroup api-tir-trace Trace +@ingroup api-tir + +@brief + Trace (set of \bt_p_stream). + +A trace is a set of \bt_p_stream with +properties: + +@image html trace-structure.png + +In the illustration above, notice that a trace is an instance of a +\bt_trace_cls and that it contains streams. + +Borrow the class of a trace with bt_trace_borrow_class() and +bt_trace_borrow_class_const(). + +A trace is a \ref api-tir "trace IR" data object. + +A trace is a \ref api-fund-shared-object "shared object": get a +new reference with bt_trace_get_ref() and put an existing +reference with bt_trace_put_ref(). + +Some library functions \ref api-fund-freezing "freeze" traces on +success. The documentation of those functions indicate this +postcondition. With a frozen trace, you can still: + +- Create \bt_p_stream from it with bt_stream_create() or + bt_stream_create_with_id(). +- Add a destruction listener to it with + bt_trace_add_destruction_listener(). + +The type of a trace is #bt_trace. + +A trace contains \bt_p_stream. All the streams of a +given trace have unique \ref api-tir-stream-prop-id "numeric IDs". +Get the number of streams in a trace with bt_trace_get_stream_count(). +Borrow a specific stream from a trace with +bt_trace_borrow_stream_by_index(), +bt_trace_borrow_stream_by_index_const(), bt_trace_borrow_stream_by_id(), +or bt_trace_borrow_stream_by_id_const(). + +Create a default trace from a \bt_trace_cls with bt_trace_create(). + +Add to and remove a destruction listener from a trace with +bt_trace_add_destruction_listener() and +bt_trace_remove_destruction_listener(). + +

    Properties

    + +A trace has the following properties: + +
    +
    + \anchor api-tir-trace-prop-name + \bt_dt_opt Name +
    +
    + Name of the trace. + + Use bt_trace_set_name() and bt_trace_get_name(). +
    + +
    + \anchor api-tir-trace-prop-uuid + \bt_dt_opt UUID +
    +
    + UUID + of the trace. + + The trace's UUID uniquely identifies the trace. + + Use bt_trace_set_uuid() and bt_trace_get_uuid(). +
    + +
    + \anchor api-tir-trace-prop-env + \bt_dt_opt Environment +
    +
    + Generic key-value store which describes the environment of the trace + (for example, the system's hostname, its network address, the + tracer's name and version, and the rest). + + Trace environment keys are strings while values are signed integers + or strings. + + Set a trace environment entry's value with + bt_trace_set_environment_entry_integer() and + bt_trace_set_environment_entry_string(). + + Get the number of environment entries in a trace with + bt_trace_get_environment_entry_count(). + + Borrow an environment entry from a trace with + bt_trace_borrow_environment_entry_value_by_name_const(). +
    + +
    + \anchor api-tir-trace-prop-user-attrs + \bt_dt_opt User attributes +
    +
    + User attributes of the trace. + User attributes are custom attributes attached to a trace. + + Use bt_trace_set_user_attributes(), + bt_trace_borrow_user_attributes(), and + bt_trace_borrow_user_attributes_const(). +
    +
    +*/ + +/*! @{ */ + +/*! +@name Type +@{ + +@typedef struct bt_trace bt_trace; + +@brief + Trace. + +@} +*/ + +/*! +@name Creation +@{ +*/ + +/*! +@brief + Creates a default trace from the \bt_trace_cls \bt_p{trace_class}. + +This function instantiates \bt_p{trace_class}. + +On success, the returned trace has the following property values: + + + + + + + +
    Property + Value +
    \ref api-tir-trace-prop-name "Name" + \em None +
    \ref api-tir-trace-prop-uuid "UUID" + \em None +
    \ref api-tir-trace-prop-env "Environment" + Empty +
    \ref api-tir-trace-prop-user-attrs "User attributes" + Empty \bt_map_val +
    + +@param[in] trace_class + Trace class from which to create the default trace. + +@returns + New trace reference, or \c NULL on memory error. +*/ extern bt_trace *bt_trace_create(bt_trace_class *trace_class); -extern bt_value *bt_trace_borrow_user_attributes(bt_trace *trace); +/*! @} */ -extern void bt_trace_set_user_attributes( - bt_trace *trace, const bt_value *user_attributes); +/*! +@name Class access +@{ +*/ + +/*! +@brief + Borrows the \ref api-tir-trace-cls "class" of the trace + \bt_p{trace}. + +@param[in] trace + Trace of which to borrow the class. + +@returns + \em Borrowed reference of the class of \bt_p{trace}. + +@bt_pre_not_null{trace} + +@sa bt_trace_borrow_class_const() — + \c const version of this function. +*/ +extern bt_trace_class *bt_trace_borrow_class(bt_trace *trace); + +/*! +@brief + Borrows the \ref api-tir-trace-cls "class" of the trace + \bt_p{trace} (\c const version). + +See bt_trace_borrow_class(). +*/ +extern const bt_trace_class *bt_trace_borrow_class_const( + const bt_trace *trace); + +/*! @} */ + +/*! +@name Stream access +@{ +*/ +/*! +@brief + Returns the number of \bt_p_stream contained in the trace + \bt_p{trace}. + +@param[in] trace + Trace of which to get the number of contained streams. + +@returns + Number of contained streams in \bt_p{trace}. + +@bt_pre_not_null{trace} +*/ +extern uint64_t bt_trace_get_stream_count(const bt_trace *trace); + +/*! +@brief + Borrows the \bt_stream at index \bt_p{index} from the + trace \bt_p{trace}. + +@param[in] trace + Trace from which to borrow the stream at index + \bt_p{index}. +@param[in] index + Index of the stream to borrow from \bt_p{trace}. + +@returns + @parblock + \em Borrowed reference of the stream of + \bt_p{trace} at index \bt_p{index}. + + The returned pointer remains valid as long as \bt_p{trace} + exists. + @endparblock + +@bt_pre_not_null{trace} +@pre + \bt_p{index} is less than the number of streams in + \bt_p{trace} (as returned by + bt_trace_get_stream_count()). + +@sa bt_trace_get_stream_count() — + Returns the number of streams contained in a trace. +@sa bt_trace_borrow_stream_by_index_const() — + \c const version of this function. +*/ +extern bt_stream *bt_trace_borrow_stream_by_index(bt_trace *trace, + uint64_t index); + +/*! +@brief + Borrows the \bt_stream at index \bt_p{index} from the + trace \bt_p{trace} (\c const version). + +See bt_trace_borrow_stream_by_index(). +*/ +extern const bt_stream *bt_trace_borrow_stream_by_index_const( + const bt_trace *trace, uint64_t index); + +/*! +@brief + Borrows the \bt_stream having the numeric ID \bt_p{id} from the + trace \bt_p{trace}. + +If there's no stream having the numeric ID \bt_p{id} in +\bt_p{trace}, this function returns \c NULL. + +@param[in] trace + Trace from which to borrow the stream having the + numeric ID \bt_p{id}. +@param[in] id + ID of the stream to borrow from \bt_p{trace}. + +@returns + @parblock + \em Borrowed reference of the stream of + \bt_p{trace} having the numeric ID \bt_p{id}, or \c NULL + if none. + + The returned pointer remains valid as long as \bt_p{trace} + exists. + @endparblock + +@bt_pre_not_null{trace} + +@sa bt_trace_borrow_stream_by_id_const() — + \c const version of this function. +*/ +extern bt_stream *bt_trace_borrow_stream_by_id(bt_trace *trace, + uint64_t id); + +/*! +@brief + Borrows the \bt_stream having the numeric ID \bt_p{id} from the + trace \bt_p{trace} (\c const version). + +See bt_trace_borrow_stream_by_id(). +*/ +extern const bt_stream *bt_trace_borrow_stream_by_id_const( + const bt_trace *trace, uint64_t id); + +/*! @} */ + +/*! +@name Properties +@{ +*/ + +/*! +@brief + Status codes for bt_trace_set_name(). +*/ typedef enum bt_trace_set_name_status { - BT_TRACE_SET_NAME_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + /*! + @brief + Success. + */ BT_TRACE_SET_NAME_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_TRACE_SET_NAME_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, } bt_trace_set_name_status; +/*! +@brief + Sets the name of the trace \bt_p{trace} to a copy of \bt_p{name}. + +See the \ref api-tir-trace-prop-name "name" property. + +@param[in] trace + Trace of which to set the name to \bt_p{name}. +@param[in] name + New name of \bt_p{trace} (copied). + +@retval #BT_TRACE_SET_NAME_STATUS_OK + Success. +@retval #BT_TRACE_SET_NAME_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{trace} +@bt_pre_hot{trace} +@bt_pre_not_null{name} + +@sa bt_trace_get_name() — + Returns the name of a trace. +*/ extern bt_trace_set_name_status bt_trace_set_name(bt_trace *trace, const char *name); +/*! +@brief + Returns the name of the trace \bt_p{trace}. + +See the \ref api-tir-trace-prop-name "name" property. + +If \bt_p{trace} has no name, this function returns \c NULL. + +@param[in] trace + Trace of which to get the name. + +@returns + @parblock + Name of \bt_p{trace}, or \c NULL if none. + + The returned pointer remains valid as long as \bt_p{trace} + is not modified. + @endparblock + +@bt_pre_not_null{trace} + +@sa bt_trace_set_name() — + Sets the name of a trace. +*/ +extern const char *bt_trace_get_name(const bt_trace *trace); + +/*! +@brief + Sets the + UUID + of the trace \bt_p{trace} to a copy of \bt_p{uuid}. + +See the \ref api-tir-trace-prop-uuid "UUID" property. + +@param[in] trace + Trace of which to set the UUID to \bt_p{uuid}. +@param[in] uuid + New UUID of \bt_p{trace} (copied). + +@bt_pre_not_null{trace} +@bt_pre_hot{trace} +@bt_pre_not_null{uuid} + +@sa bt_trace_get_uuid() — + Returns the UUID of a trace. +*/ extern void bt_trace_set_uuid(bt_trace *trace, bt_uuid uuid); +/*! +@brief + Returns the UUID of the trace \bt_p{trace}. + +See the \ref api-tir-trace-prop-uuid "UUID" property. + +If \bt_p{trace} has no UUID, this function returns \c NULL. + +@param[in] trace + Trace of which to get the UUID. + +@returns + @parblock + UUID of \bt_p{trace}, or \c NULL if none. + + The returned pointer remains valid as long as \bt_p{trace} + is not modified. + @endparblock + +@bt_pre_not_null{trace} + +@sa bt_trace_set_uuid() — + Sets the UUID of a trace. +*/ +extern bt_uuid bt_trace_get_uuid(const bt_trace *trace); + +/*! +@brief + Status codes for bt_trace_set_name(). +*/ typedef enum bt_trace_set_environment_entry_status { - BT_TRACE_SET_ENVIRONMENT_ENTRY_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + /*! + @brief + Success. + */ BT_TRACE_SET_ENVIRONMENT_ENTRY_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_TRACE_SET_ENVIRONMENT_ENTRY_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, } bt_trace_set_environment_entry_status; +/*! +@brief + Sets the value of the environment entry of the trace \bt_p{trace} + named \bt_p{name} to the signed integer \bt_p{value}. + +See the \ref api-tir-trace-prop-env "environment" property. + +On success, if \bt_p{trace} already contains an environment entry named +\bt_p{name}, this function replaces the existing entry's value with +\bt_p{value}. + +@param[in] trace + Trace in which to insert or replace an environment entry named + \bt_p{name} with the value \bt_p{value}. +@param[in] name + Name of the entry to insert or replace in \bt_p{trace} (copied). +@param[in] value + Value of the environment entry to insert or replace in \bt_p{trace}. + +@retval #BT_TRACE_SET_ENVIRONMENT_ENTRY_STATUS_OK + Success. +@retval #BT_TRACE_SET_ENVIRONMENT_ENTRY_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{trace} +@bt_pre_hot{trace} +@bt_pre_not_null{name} + +@sa bt_trace_set_environment_entry_string() — + Sets a trace environment entry's value to a string. +*/ extern bt_trace_set_environment_entry_status bt_trace_set_environment_entry_integer(bt_trace *trace, const char *name, int64_t value); +/*! +@brief + Sets the value of the environment entry of the trace \bt_p{trace} + named \bt_p{name} to the string \bt_p{value}. + +See the \ref api-tir-trace-prop-env "environment" property. + +On success, if \bt_p{trace} already contains an environment entry named +\bt_p{name}, this function replaces the existing entry's value with +\bt_p{value}. + +@param[in] trace + Trace in which to insert or replace an environment entry named + \bt_p{name} with the value \bt_p{value}. +@param[in] name + Name of the entry to insert or replace in \bt_p{trace} (copied). +@param[in] value + Value of the environment entry to insert or replace in \bt_p{trace}. + +@retval #BT_TRACE_SET_ENVIRONMENT_ENTRY_STATUS_OK + Success. +@retval #BT_TRACE_SET_ENVIRONMENT_ENTRY_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{trace} +@bt_pre_hot{trace} +@bt_pre_not_null{name} +@bt_pre_not_null{value} + +@sa bt_trace_set_environment_entry_integer() — + Sets a trace environment entry's value to a signed integer. +*/ extern bt_trace_set_environment_entry_status bt_trace_set_environment_entry_string(bt_trace *trace, const char *name, const char *value); -extern bt_stream *bt_trace_borrow_stream_by_index(bt_trace *trace, - uint64_t index); +/*! +@brief + Returns the number of environment entries contained in the trace + \bt_p{trace}. -extern bt_stream *bt_trace_borrow_stream_by_id(bt_trace *trace, - uint64_t id); +See the \ref api-tir-trace-prop-env "environment" property. + +@param[in] trace + Trace of which to get the number of environment entries. + +@returns + Number of environment entries in \bt_p{trace}. + +@bt_pre_not_null{trace} +*/ +extern uint64_t bt_trace_get_environment_entry_count(const bt_trace *trace); + +/*! +@brief + Borrows the environment entry at index \bt_p{index} from the + trace \bt_p{trace}, setting \bt_p{*name} to its name and + \bt_p{*value} to its value. + +See the \ref api-tir-trace-prop-env "environment" property. + +@param[in] trace + Trace from which to borrow the environment entry at index + \bt_p{index}. +@param[in] index + Index of the environment entry to borrow from \bt_p{trace}. +@param[in] name + @parblock + On success, \bt_p{*name} is the name of the + environment entry at index \bt_p{index} in \bt_p{trace}. + + The returned pointer remains valid as long as \bt_p{trace} + is not modified. + @endparblock +@param[in] value + @parblock + On success, \bt_p{*value} is a \em borrowed + reference of the environment entry at index \bt_p{index} in + \bt_p{trace}. + + \bt_p{*value} is either a \bt_sint_val + (#BT_VALUE_TYPE_SIGNED_INTEGER) or a \bt_string_val + (#BT_VALUE_TYPE_STRING). + + The returned pointer remains valid as long as \bt_p{trace} + is not modified. + @endparblock + +@bt_pre_not_null{trace} +@pre + \bt_p{index} is less than the number of environment entries in + \bt_p{trace} (as returned by + bt_trace_get_environment_entry_count()). +@bt_pre_not_null{name} +@bt_pre_not_null{value} + +@sa bt_trace_get_environment_entry_count() — + Returns the number of environment entries contained in a trace. +*/ +extern void bt_trace_borrow_environment_entry_by_index_const( + const bt_trace *trace, uint64_t index, + const char **name, const bt_value **value); + +/*! +@brief + Borrows the value of the environment entry named \bt_p{name} + in the trace \bt_p{trace}. + +See the \ref api-tir-trace-prop-env "environment" property. + +If there's no environment entry named \bt_p{name} in \bt_p{trace}, this +function returns \c NULL. + +@param[in] trace + Trace from which to borrow the value of the environment entry + named \bt_p{name}. +@param[in] name + Name of the environment entry to borrow from \bt_p{trace}. + +@returns + @parblock + \em Borrowed reference of the value of the environment entry named + \bt_p{name} in \bt_p{trace}. + + The returned value is either a \bt_sint_val + (#BT_VALUE_TYPE_SIGNED_INTEGER) or a \bt_string_val + (#BT_VALUE_TYPE_STRING). + + The returned pointer remains valid as long as \bt_p{trace} + is not modified. + @endparblock + +@bt_pre_not_null{trace} +@bt_pre_not_null{name} +*/ +extern const bt_value *bt_trace_borrow_environment_entry_value_by_name_const( + const bt_trace *trace, const char *name); + +/*! +@brief + Sets the user attributes of the trace \bt_p{trace} to + \bt_p{user_attributes}. + +See the \ref api-tir-trace-prop-user-attrs "user attributes" +property. + +@note + When you create a default trace with bt_trace_create(), the trace's + initial user attributes is an empty \bt_map_val. Therefore you can + borrow it with bt_trace_borrow_user_attributes() and fill it + directly instead of setting a new one with this function. + +@param[in] trace + Trace of which to set the user attributes to \bt_p{user_attributes}. +@param[in] user_attributes + New user attributes of \bt_p{trace}. + +@bt_pre_not_null{trace} +@bt_pre_hot{trace} +@bt_pre_not_null{user_attributes} +@bt_pre_is_map_val{user_attributes} + +@sa bt_trace_borrow_user_attributes() — + Borrows the user attributes of a trace. +*/ +extern void bt_trace_set_user_attributes( + bt_trace *trace, const bt_value *user_attributes); + +/*! +@brief + Borrows the user attributes of the trace \bt_p{trace}. + +See the \ref api-tir-trace-prop-user-attrs "user attributes" +property. + +@note + When you create a default trace with bt_trace_create(), the trace's + initial user attributes is an empty \bt_map_val. + +@param[in] trace + Trace from which to borrow the user attributes. + +@returns + User attributes of \bt_p{trace} (a \bt_map_val). + +@bt_pre_not_null{trace} + +@sa bt_trace_set_user_attributes() — + Sets the user attributes of a trace. +@sa bt_trace_borrow_user_attributes_const() — + \c const version of this function. +*/ +extern bt_value *bt_trace_borrow_user_attributes(bt_trace *trace); + +/*! +@brief + Borrows the user attributes of the trace \bt_p{trace} + (\c const version). + +See bt_trace_borrow_user_attributes(). +*/ +extern const bt_value *bt_trace_borrow_user_attributes_const( + const bt_trace *trace); + +/*! @} */ + +/*! +@name Listeners +@{ +*/ + +/*! +@brief + User function for bt_trace_add_destruction_listener(). + +This is the user function type for a trace destruction listener. + +@param[in] trace + Trace being destroyed (\ref api-fund-freezing "frozen"). +@param[in] user_data + User data, as passed as the \bt_p{user_data} parameter of + bt_trace_add_destruction_listener(). + +@bt_pre_not_null{trace} + +@post + The reference count of \bt_p{trace} is not changed. +@bt_post_no_error + +@sa bt_trace_add_destruction_listener() — + Adds a destruction listener to a trace. +*/ +typedef void (* bt_trace_destruction_listener_func)( + const bt_trace *trace, void *user_data); + +/*! +@brief + Status codes for bt_trace_add_destruction_listener(). +*/ +typedef enum bt_trace_add_listener_status { + /*! + @brief + Success. + */ + BT_TRACE_ADD_LISTENER_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_TRACE_ADD_LISTENER_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, +} bt_trace_add_listener_status; + +/*! +@brief + Adds a destruction listener having the function \bt_p{user_func} + to the trace \bt_p{trace}. + +All the destruction listener user functions of a trace are called +when it's being destroyed. + +If \bt_p{listener_id} is not \c NULL, then this function, on success, +sets \bt_p{*listener_id} to the ID of the added destruction listener +within \bt_p{trace}. You can then use this ID to remove the +added destruction listener with bt_trace_remove_destruction_listener(). + +@param[in] trace + Trace to add the destruction listener to. +@param[in] user_func + User function of the destruction listener to add to + \bt_p{trace}. +@param[in] user_data + User data to pass as the \bt_p{user_data} parameter of + \bt_p{user_func}. +@param[out] listener_id + On success and if not \c NULL, \bt_p{*listener_id} + is the ID of the added destruction listener within + \bt_p{trace}. + +@retval #BT_TRACE_ADD_LISTENER_STATUS_OK + Success. +@retval #BT_TRACE_ADD_LISTENER_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{trace} +@bt_pre_not_null{user_func} + +@sa bt_trace_remove_destruction_listener() — + Removes a destruction listener from a trace. +*/ +extern bt_trace_add_listener_status bt_trace_add_destruction_listener( + const bt_trace *trace, + bt_trace_destruction_listener_func user_func, + void *user_data, bt_listener_id *listener_id); + +/*! +@brief + Status codes for bt_trace_remove_destruction_listener(). +*/ +typedef enum bt_trace_remove_listener_status { + /*! + @brief + Success. + */ + BT_TRACE_REMOVE_LISTENER_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_TRACE_REMOVE_LISTENER_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, +} bt_trace_remove_listener_status; + +/*! +@brief + Removes the destruction listener having the ID \bt_p{listener_id} + from the trace \bt_p{trace}. + +The destruction listener to remove from \bt_p{trace} was +previously added with bt_trace_add_destruction_listener(). + +You can call this function when \bt_p{trace} is +\ref api-fund-freezing "frozen". + +@param[in] trace + Trace from which to remove the destruction listener having + the ID \bt_p{listener_id}. +@param[in] listener_id + ID of the destruction listener to remove from \bt_p{trace}­. + +@retval #BT_TRACE_REMOVE_LISTENER_STATUS_OK + Success. +@retval #BT_TRACE_REMOVE_LISTENER_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{trace} +@pre + \bt_p{listener_id} is the ID of an existing destruction listener + in \bt_p{trace}. + +@sa bt_trace_add_destruction_listener() — + Adds a destruction listener to a trace. +*/ +extern bt_trace_remove_listener_status bt_trace_remove_destruction_listener( + const bt_trace *trace, bt_listener_id listener_id); + +/*! @} */ + +/*! +@name Reference count +@{ +*/ + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the trace \bt_p{trace}. + +@param[in] trace + @parblock + Trace of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_trace_put_ref() — + Decrements the reference count of a trace. +*/ +extern void bt_trace_get_ref(const bt_trace *trace); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the trace \bt_p{trace}. + +@param[in] trace + @parblock + Trace of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_trace_get_ref() — + Increments the reference count of a trace. +*/ +extern void bt_trace_put_ref(const bt_trace *trace); + +/*! +@brief + Decrements the reference count of the trace + \bt_p{_trace}, and then sets \bt_p{_trace} to \c NULL. + +@param _trace + @parblock + Trace of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_trace} +*/ +#define BT_TRACE_PUT_REF_AND_RESET(_trace) \ + do { \ + bt_trace_put_ref(_trace); \ + (_trace) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the trace \bt_p{_dst}, sets + \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} to \c NULL. + +This macro effectively moves a trace reference from the expression +\bt_p{_src} to the expression \bt_p{_dst}, putting the existing +\bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_TRACE_MOVE_REF(_dst, _src) \ + do { \ + bt_trace_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! @} */ #ifdef __cplusplus } diff --git a/include/babeltrace2/types.h b/include/babeltrace2/types.h index 11c6e824..521c603d 100644 --- a/include/babeltrace2/types.h +++ b/include/babeltrace2/types.h @@ -33,55 +33,6 @@ extern "C" { #endif -/** -@defgroup ctypes Babeltrace C types -@ingroup apiref -@brief Babeltrace C types. - -@code -#include -@endcode - -This header contains custom type definitions used across the library. - -@file -@brief Babeltrace C types. -@sa ctypes - -@addtogroup ctypes -@{ -*/ - -/// False boolean value for the #bt_bool type. -#define BT_FALSE 0 - -/// True boolean value for the #bt_bool type. -#define BT_TRUE 1 - -/** -@brief Babeltrace's boolean type. - -Use only the #BT_FALSE and #BT_TRUE definitions for #bt_bool parameters. -It is guaranteed that the library functions which return a #bt_bool -value return either #BT_FALSE or #BT_TRUE. - -You can always test the truthness of a #bt_bool value directly, without -comparing it to #BT_TRUE directly: - -@code -bt_bool ret = bt_some_function(...); - -if (ret) { - // ret is true -} -@endcode -*/ -typedef int bt_bool; - -typedef uint64_t bt_listener_id; - -typedef const uint8_t *bt_uuid; - typedef struct bt_clock_class bt_clock_class; typedef struct bt_clock_snapshot bt_clock_snapshot; typedef struct bt_component bt_component; @@ -155,10 +106,96 @@ typedef struct bt_trace bt_trace; typedef struct bt_trace_class bt_trace_class; typedef struct bt_value bt_value; -typedef const char * const *bt_field_class_enumeration_mapping_label_array; -typedef const struct bt_message **bt_message_array_const; +/*! +@defgroup api-common-types Common C types + +@brief + C types common to many parts of the API. +*/ + +/*! @{ */ + +/*! +@brief + \em True value for #bt_bool. +*/ +#define BT_TRUE 1 + +/*! +@brief + \em False value for #bt_bool. +*/ +#define BT_FALSE 0 + +/*! +@brief + \bt_name boolean type. + +The API uses #bt_bool instead of the C99 \c bool type for +application binary interface +reasons. + +Use #BT_TRUE and #BT_FALSE to set and compare #bt_bool variables. +*/ +typedef int bt_bool; + +/*! +@brief + Numeric ID which identifies a user listener function. + +Some functions, such as bt_trace_add_destruction_listener(), return a +listener ID when you add a user listener function to some object. You +can then use this listener ID to remove the listener from the object. +*/ +typedef uint64_t bt_listener_id; + +/*! +@brief + A + UUID, + that is, an array of 16 constant bytes. +*/ +typedef uint8_t const *bt_uuid; + +/*! +@brief + Availability of an object's property. + +Some getter functions of the API, such as +bt_event_class_get_log_level(), return, by output parameter, an optional +object property which is not a pointer. In that case, the function +either: + +- Returns #BT_PROPERTY_AVAILABILITY_AVAILABLE and sets an output + parameter to the property's value. +- Returns #BT_PROPERTY_AVAILABILITY_NOT_AVAILABLE. +*/ +typedef enum bt_property_availability { + /*! + @brief + Property is available. + */ + BT_PROPERTY_AVAILABILITY_AVAILABLE = 1, + + /*! + @brief + Property is not available. + */ + BT_PROPERTY_AVAILABILITY_NOT_AVAILABLE = 0, +} bt_property_availability; + +/*! +@brief + Array of constant \bt_p_msg. + +Such an array is filled by the +\link api-msg-iter-cls-meth-next "next" method\endlink of a +\bt_msg_iter and consumed with bt_message_iterator_next() by another +message iterator or by a \bt_sink_comp. +*/ +typedef bt_message const **bt_message_array_const; -/** @} */ +/*! @} */ #ifdef __cplusplus } diff --git a/include/babeltrace2/util.h b/include/babeltrace2/util.h index d4826541..6a76372d 100644 --- a/include/babeltrace2/util.h +++ b/include/babeltrace2/util.h @@ -33,15 +33,113 @@ extern "C" { #endif +/*! +@defgroup api-util General purpose utilities + +@brief + General purpose utilities. + +This module contains general purpose utilities. +*/ + +/*! @{ */ + +/*! +@brief + Status codes for bt_util_clock_cycles_to_ns_from_origin(). +*/ typedef enum bt_util_clock_cycles_to_ns_from_origin_status { + /*! + @brief + Success. + */ BT_UTIL_CLOCK_CYCLES_TO_NS_FROM_ORIGIN_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Integer overflow while computing the result. + */ BT_UTIL_CLOCK_CYCLES_TO_NS_FROM_ORIGIN_STATUS_OVERFLOW_ERROR = __BT_FUNC_STATUS_OVERFLOW_ERROR, } bt_util_clock_cycles_to_ns_from_origin_status; +/*! +@brief + Converts the clock value \bt_p{cycles} from cycles to nanoseconds + from the clock's origin and sets \bt_p{*ns_from_origin} to the + result. + +This function considers the clock's frequency in Hz (\bt_p{frequency}), +an offset from its origin in seconds (\bt_p{offset_seconds}) which +can be negative, and an additional offset in cycles +(\bt_p{offset_cycles}). + +This function: + +-# Converts the \bt_p{offset_cycles} value to seconds using + \bt_p{frequency}. +-# Converts the \bt_p{cycles} value to seconds using \bt_p{frequency}. +-# Adds the values of 1., 2., and \bt_p{offset_seconds}. +-# Converts the value of 3. to nanoseconds and sets + \bt_p{*ns_from_origin} to this result. + +The following illustration shows the possible scenarios: + +@image html clock-terminology.png + +\bt_p{offset_seconds} can be negative. For example, considering: + +- A 1000 Hz clock. +- \bt_p{offset_seconds} set to -10 seconds. +- \bt_p{offset_cycles} set to 500 cycles + (that is, 0.5 seconds). +- \bt_p{cycles} set to 2000 cycles (that is, 2 seconds). + +The computed value is -7.5 seconds, so this function sets +\bt_p{*ns_from_origin} to -7,500,000,000. + +This function can fail and return the +#BT_UTIL_CLOCK_CYCLES_TO_NS_FROM_ORIGIN_STATUS_OVERFLOW_ERROR status +code if any step of the computation process causes an integer overflow. + +@param[in] cycles + Clock's value (cycles). +@param[in] frequency + Clock's frequency (Hz, or cycles/second). +@param[in] offset_seconds + Offset, in seconds, from the clock's origin to add to + \bt_p{cycles} (once converted to seconds). +@param[in] offset_cycles + Offset, in cycles, to add to \bt_p{cycles}. +@param[out] ns_from_origin + On success, \bt_p{*ns_from_origin} is \bt_p{cycles} + converted to nanoseconds from origin considering the clock's + properties. + +@retval #BT_UTIL_CLOCK_CYCLES_TO_NS_FROM_ORIGIN_STATUS_OK + Success. +@retval #BT_UTIL_CLOCK_CYCLES_TO_NS_FROM_ORIGIN_STATUS_OVERFLOW_ERROR + Integer overflow while computing the result. + +@pre + \bt_p{frequency} is not 0. +@pre + \bt_p{frequency} is not UINT64_C(-1). +@pre + \bt_p{frequency} is greater than \bt_p{offset_cycles}. +@pre + \bt_p{offset_cycles} is less than \bt_p{frequency}. +@bt_pre_not_null{ns_from_origin} + +@sa bt_clock_class_cycles_to_ns_from_origin() — + Converts a stream clock value from cycles to nanoseconds from the + origin of a given clock class. +*/ bt_util_clock_cycles_to_ns_from_origin_status bt_util_clock_cycles_to_ns_from_origin(uint64_t cycles, uint64_t frequency, int64_t offset_seconds, - uint64_t offset_cycles, int64_t *ns); + uint64_t offset_cycles, int64_t *ns_from_origin); + +/*! @} */ #ifdef __cplusplus } diff --git a/include/babeltrace2/value-const.h b/include/babeltrace2/value-const.h deleted file mode 100644 index f42f60d8..00000000 --- a/include/babeltrace2/value-const.h +++ /dev/null @@ -1,214 +0,0 @@ -#ifndef BABELTRACE2_VALUE_CONST_H -#define BABELTRACE2_VALUE_CONST_H - -/* - * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __BT_IN_BABELTRACE_H -# error "Please include instead." -#endif - -#include -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum bt_value_type { - /// Null value object. - BT_VALUE_TYPE_NULL = 1 << 0, - - /// Boolean value object (holds #BT_TRUE or #BT_FALSE). - BT_VALUE_TYPE_BOOL = 1 << 1, - - BT_VALUE_TYPE_INTEGER = 1 << 2, - - /// Unsigned integer value object (holds an unsigned 64-bit integer raw value). - BT_VALUE_TYPE_UNSIGNED_INTEGER = (1 << 3) | BT_VALUE_TYPE_INTEGER, - - /// Signed integer value object (holds a signed 64-bit integer raw value). - BT_VALUE_TYPE_SIGNED_INTEGER = (1 << 4) | BT_VALUE_TYPE_INTEGER, - - /// Floating point number value object (holds a \c double raw value). - BT_VALUE_TYPE_REAL = 1 << 5, - - /// String value object. - BT_VALUE_TYPE_STRING = 1 << 6, - - /// Array value object. - BT_VALUE_TYPE_ARRAY = 1 << 7, - - /// Map value object. - BT_VALUE_TYPE_MAP = 1 << 8, -} bt_value_type; - -extern bt_value_type bt_value_get_type(const bt_value *object); - -static inline -bt_bool bt_value_type_is(const bt_value_type type, - const bt_value_type type_to_check) -{ - return (type & type_to_check) == type_to_check; -} - -static inline -bt_bool bt_value_is_null(const bt_value *object) -{ - return bt_value_get_type(object) == BT_VALUE_TYPE_NULL; -} - -static inline -bt_bool bt_value_is_bool(const bt_value *object) -{ - return bt_value_get_type(object) == BT_VALUE_TYPE_BOOL; -} - -static inline -bt_bool bt_value_is_unsigned_integer(const bt_value *object) -{ - return bt_value_get_type(object) == BT_VALUE_TYPE_UNSIGNED_INTEGER; -} - -static inline -bt_bool bt_value_is_signed_integer(const bt_value *object) -{ - return bt_value_get_type(object) == BT_VALUE_TYPE_SIGNED_INTEGER; -} - -static inline -bt_bool bt_value_is_real(const bt_value *object) -{ - return bt_value_get_type(object) == BT_VALUE_TYPE_REAL; -} - -static inline -bt_bool bt_value_is_string(const bt_value *object) -{ - return bt_value_get_type(object) == BT_VALUE_TYPE_STRING; -} - -static inline -bt_bool bt_value_is_array(const bt_value *object) -{ - return bt_value_get_type(object) == BT_VALUE_TYPE_ARRAY; -} - -static inline -bt_bool bt_value_is_map(const bt_value *object) -{ - return bt_value_get_type(object) == BT_VALUE_TYPE_MAP; -} - -typedef enum bt_value_copy_status { - BT_VALUE_COPY_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, - BT_VALUE_COPY_STATUS_OK = __BT_FUNC_STATUS_OK, -} bt_value_copy_status; - -extern bt_value_copy_status bt_value_copy(const bt_value *object, - bt_value **copy); - -extern bt_bool bt_value_is_equal(const bt_value *object_a, - const bt_value *object_b); - -extern bt_bool bt_value_bool_get(const bt_value *bool_obj); - -extern uint64_t bt_value_integer_unsigned_get(const bt_value *integer_obj); - -extern int64_t bt_value_integer_signed_get(const bt_value *integer_obj); - -extern double bt_value_real_get(const bt_value *real_obj); - -extern const char *bt_value_string_get(const bt_value *string_obj); - -extern uint64_t bt_value_array_get_length(const bt_value *array_obj); - -static inline -bt_bool bt_value_array_is_empty(const bt_value *array_obj) -{ - return bt_value_array_get_length(array_obj) == 0; -} - -extern const bt_value *bt_value_array_borrow_element_by_index_const( - const bt_value *array_obj, uint64_t index); - -extern uint64_t bt_value_map_get_size(const bt_value *map_obj); - -static inline -bt_bool bt_value_map_is_empty(const bt_value *map_obj) -{ - return bt_value_map_get_size(map_obj) == 0; -} - -extern const bt_value *bt_value_map_borrow_entry_value_const( - const bt_value *map_obj, const char *key); - -typedef enum bt_value_map_foreach_entry_const_func_status { - BT_VALUE_MAP_FOREACH_ENTRY_CONST_FUNC_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_VALUE_MAP_FOREACH_ENTRY_CONST_FUNC_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, - BT_VALUE_MAP_FOREACH_ENTRY_CONST_FUNC_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, - BT_VALUE_MAP_FOREACH_ENTRY_CONST_FUNC_STATUS_INTERRUPT = __BT_FUNC_STATUS_INTERRUPTED, -} bt_value_map_foreach_entry_const_func_status; - -typedef bt_value_map_foreach_entry_const_func_status - (* bt_value_map_foreach_entry_const_func)(const char *key, - const bt_value *object, void *data); - -typedef enum bt_value_map_foreach_entry_const_status { - BT_VALUE_MAP_FOREACH_ENTRY_CONST_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_VALUE_MAP_FOREACH_ENTRY_CONST_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, - BT_VALUE_MAP_FOREACH_ENTRY_CONST_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, - BT_VALUE_MAP_FOREACH_ENTRY_CONST_STATUS_USER_ERROR = __BT_FUNC_STATUS_USER_ERROR, - BT_VALUE_MAP_FOREACH_ENTRY_CONST_STATUS_INTERRUPTED = __BT_FUNC_STATUS_INTERRUPTED, -} bt_value_map_foreach_entry_const_status; - -extern bt_value_map_foreach_entry_const_status bt_value_map_foreach_entry_const( - const bt_value *map_obj, - bt_value_map_foreach_entry_const_func func, void *data); - -extern bt_bool bt_value_map_has_entry(const bt_value *map_obj, - const char *key); - -extern void bt_value_get_ref(const bt_value *value); - -extern void bt_value_put_ref(const bt_value *value); - -#define BT_VALUE_PUT_REF_AND_RESET(_var) \ - do { \ - bt_value_put_ref(_var); \ - (_var) = NULL; \ - } while (0) - -#define BT_VALUE_MOVE_REF(_var_dst, _var_src) \ - do { \ - bt_value_put_ref(_var_dst); \ - (_var_dst) = (_var_src); \ - (_var_src) = NULL; \ - } while (0) - -#ifdef __cplusplus -} -#endif - -#endif /* BABELTRACE2_VALUE_CONST_H */ diff --git a/include/babeltrace2/value.h b/include/babeltrace2/value.h index 42e3cf96..1bf683b5 100644 --- a/include/babeltrace2/value.h +++ b/include/babeltrace2/value.h @@ -31,166 +31,2435 @@ #include #include -#include #ifdef __cplusplus extern "C" { #endif +/*! +@defgroup api-val Values + +@brief + Generic, JSON-like basic data containers. + +Values are generic data containers. Except for +the fact that integer values are explicitly unsigned or signed because +of typing limitations, +\bt_name values are very similar to JSON +values. + +The value API is completely independent from the rest of the +\bt_api. + +\bt_c_comp initialization parameters, \ref bt_query_executor_create() +"query" parameters, as well as trace IR user attributes (for example, +bt_event_class_set_user_attributes()) use values. + +The available value types are: + +
    +
    Scalar values
    +
    + - Null + - Boolean + - Unsigned integer (64-bit range) + - Signed integer (64-bit range) + - Real (\c double range) + - String +
    + +
    Container values
    +
    + - Array + - Map (string to value) +
    +
    + +Values are \ref api-fund-shared-object "shared objects": get a new +reference with bt_value_get_ref() and put an existing reference with +bt_value_put_ref(). + +Some library functions \ref api-fund-freezing "freeze" values on +success. The documentation of those functions indicate this +postcondition. + +All the value types share the same C type, #bt_value. + +Get the type enumerator of a value with bt_value_get_type(). Get whether +or not a value type conceptually \em is a given type with the inline +bt_value_type_is() function. Get whether or not a value has a specific +type with one of the bt_value_is_*() inline helpers. + +The \em null value is special in that it's a singleton variable, +#bt_value_null. You can directly compare any value pointer to +#bt_value_null to check if it's a null value. Like other types of +values, the null value is a shared object: if you get a new null value +reference, you must eventually put it. + +Create a value with one of the bt_value_*_create() or +bt_value_*_create_init() functions. + +This documentation names the actual data that a scalar value wraps the +raw value. + +Set and get the raw values of scalar values with functions that are +named bt_value_*_set() and bt_value_*_get(). + +Check that two values are recursively equal with bt_value_is_equal(). + +Deep-copy a value with bt_value_copy(). + +Extend a map value with bt_value_map_extend(). + +The following table shows the available functions and types for each +type of value: + + + + + + + + + + + +
    Name + Type enumerator + Type query function + Creation functions + Writing functions + Reading functions +
    \em Null + #BT_VALUE_TYPE_NULL + bt_value_is_null() + \em N/A (use the #bt_value_null variable directly) + \em N/A + \em N/A +
    \em Boolean + #BT_VALUE_TYPE_BOOL + bt_value_is_bool() + + bt_value_bool_create()
    + bt_value_bool_create_init() +
    bt_value_bool_set() + bt_value_bool_get() +
    Unsigned integer + #BT_VALUE_TYPE_UNSIGNED_INTEGER + bt_value_is_unsigned_integer() + + bt_value_integer_unsigned_create()
    + bt_value_integer_unsigned_create_init() +
    bt_value_integer_unsigned_set() + bt_value_integer_unsigned_get() +
    Signed integer + #BT_VALUE_TYPE_SIGNED_INTEGER + bt_value_is_signed_integer() + + bt_value_integer_signed_create()
    + bt_value_integer_signed_create_init() +
    bt_value_integer_signed_set() + bt_value_integer_signed_get() +
    \em Real + #BT_VALUE_TYPE_REAL + bt_value_is_real() + + bt_value_real_create()
    + bt_value_real_create_init() +
    bt_value_real_set() + bt_value_real_get() +
    \em String + #BT_VALUE_TYPE_STRING + bt_value_is_string() + + bt_value_string_create()
    + bt_value_string_create_init() +
    bt_value_string_set() + bt_value_string_get() +
    \em Array + #BT_VALUE_TYPE_ARRAY + bt_value_is_array() + + bt_value_array_create() + + bt_value_array_append_element()
    + bt_value_array_append_bool_element()
    + bt_value_array_append_unsigned_integer_element()
    + bt_value_array_append_signed_integer_element()
    + bt_value_array_append_real_element()
    + bt_value_array_append_string_element()
    + bt_value_array_append_empty_array_element()
    + bt_value_array_append_empty_map_element()
    + bt_value_array_set_element_by_index() +
    + bt_value_array_get_length()
    + bt_value_array_is_empty()
    + bt_value_array_borrow_element_by_index()
    + bt_value_array_borrow_element_by_index_const() +
    \em Map + #BT_VALUE_TYPE_MAP + bt_value_is_map() + + bt_value_map_create() + + bt_value_map_insert_entry()
    + bt_value_map_insert_bool_entry()
    + bt_value_map_insert_unsigned_integer_entry()
    + bt_value_map_insert_signed_integer_entry()
    + bt_value_map_insert_real_entry()
    + bt_value_map_insert_string_entry()
    + bt_value_map_insert_empty_array_entry()
    + bt_value_map_insert_empty_map_entry()
    + bt_value_map_extend() +
    + bt_value_map_get_size()
    + bt_value_map_is_empty()
    + bt_value_map_has_entry()
    + bt_value_map_borrow_entry_value()
    + bt_value_map_borrow_entry_value_const()
    + bt_value_map_foreach_entry()
    + bt_value_map_foreach_entry_const() +
    +*/ + +/*! @{ */ + +/*! +@name Type +@{ + +@typedef struct bt_value bt_value; + +@brief + Value. + +@} +*/ + +/*! +@name Type query +@{ +*/ + +/*! +@brief + Value type enumerators. +*/ +typedef enum bt_value_type { + /*! + @brief + Null value. + */ + BT_VALUE_TYPE_NULL = 1 << 0, + + /*! + @brief + Boolean value. + */ + BT_VALUE_TYPE_BOOL = 1 << 1, + + /*! + @brief + Integer value. + + No value has this type: use it with bt_value_type_is(). + */ + BT_VALUE_TYPE_INTEGER = 1 << 2, + + /*! + @brief + Unsigned integer value. + + This type conceptually inherits #BT_VALUE_TYPE_INTEGER. + */ + BT_VALUE_TYPE_UNSIGNED_INTEGER = (1 << 3) | BT_VALUE_TYPE_INTEGER, + + /*! + @brief + Signed integer value. + + This type conceptually inherits #BT_VALUE_TYPE_INTEGER. + */ + BT_VALUE_TYPE_SIGNED_INTEGER = (1 << 4) | BT_VALUE_TYPE_INTEGER, + + /*! + @brief + Real value. + */ + BT_VALUE_TYPE_REAL = 1 << 5, + + /*! + @brief + String value. + */ + BT_VALUE_TYPE_STRING = 1 << 6, + + /*! + @brief + Array value. + */ + BT_VALUE_TYPE_ARRAY = 1 << 7, + + /*! + @brief + Map value. + */ + BT_VALUE_TYPE_MAP = 1 << 8, +} bt_value_type; + +/*! +@brief + Returns the type enumerator of the value \bt_p{value}. + +@param[in] value + Value of which to get the type enumerator + +@returns + Type enumerator of \bt_p{value}. + +@bt_pre_not_null{value} + +@sa bt_value_type_is() — + Returns whether or not the type of a value conceptually is a given + type. +@sa bt_value_is_null() — + Returns whether or not a value is a null value. +@sa bt_value_is_bool() — + Returns whether or not a value is a boolean value. +@sa bt_value_is_unsigned_integer() — + Returns whether or not a value is an unsigned integer value. +@sa bt_value_is_signed_integer() — + Returns whether or not a value is a signed integer value. +@sa bt_value_is_real() — + Returns whether or not a value is a real value. +@sa bt_value_is_string() — + Returns whether or not a value is a string value. +@sa bt_value_is_array() — + Returns whether or not a value is an array value. +@sa bt_value_is_map() — + Returns whether or not a value is a map value. +*/ +extern bt_value_type bt_value_get_type(const bt_value *value); + +/*! +@brief + Returns whether or not the value type \bt_p{type} conceptually + \em is the value type \bt_p{other_type}. + +For example, an unsigned integer value conceptually \em is an integer +value, so + +@code +bt_value_type_is(BT_VALUE_TYPE_UNSIGNED_INTEGER, BT_VALUE_TYPE_INTEGER) +@endcode + +returns #BT_TRUE. + +@param[in] type + Value type to check against \bt_p{other_type}. +@param[in] other_type + Value type against which to check \bt_p{type}. + +@returns + #BT_TRUE if \bt_p{type} conceptually \em is \bt_p{other_type}. + +@sa bt_value_get_type() — + Returns the type enumerator of a value. +@sa bt_value_is_null() — + Returns whether or not a value is a null value. +@sa bt_value_is_bool() — + Returns whether or not a value is a boolean value. +@sa bt_value_is_unsigned_integer() — + Returns whether or not a value is an unsigned integer value. +@sa bt_value_is_signed_integer() — + Returns whether or not a value is a signed integer value. +@sa bt_value_is_real() — + Returns whether or not a value is a real value. +@sa bt_value_is_string() — + Returns whether or not a value is a string value. +@sa bt_value_is_array() — + Returns whether or not a value is an array value. +@sa bt_value_is_map() — + Returns whether or not a value is a map value. +*/ +static inline +bt_bool bt_value_type_is(const bt_value_type type, + const bt_value_type other_type) +{ + return (type & other_type) == other_type; +} + +/*! +@brief + Returns whether or not the value \bt_p{value} is a null value. + +@note + Because all null values point to the same null value singleton, you + can also directly compare \bt_p{value} to the #bt_value_null + variable. + +@param[in] value + Value to check. + +@returns + #BT_TRUE if \bt_p{value} is a null value. + +@bt_pre_not_null{value} + +@sa bt_value_get_type() — + Returns the type enumerator of a value. +@sa bt_value_type_is() — + Returns whether or not the type of a value conceptually is a given + type. +@sa #bt_value_null — + The null value singleton. +*/ +static inline +bt_bool bt_value_is_null(const bt_value *value) +{ + return bt_value_get_type(value) == BT_VALUE_TYPE_NULL; +} + +/*! +@brief + Returns whether or not the value \bt_p{value} is a boolean value. + +@param[in] value + Value to check. + +@returns + #BT_TRUE if \bt_p{value} is a boolean value. + +@bt_pre_not_null{value} + +@sa bt_value_get_type() — + Returns the type enumerator of a value. +@sa bt_value_type_is() — + Returns whether or not the type of a value conceptually is a given + type. +*/ +static inline +bt_bool bt_value_is_bool(const bt_value *value) +{ + return bt_value_get_type(value) == BT_VALUE_TYPE_BOOL; +} + +/*! +@brief + Returns whether or not the value \bt_p{value} is an unsigned integer + value. + +@param[in] value + Value to check. + +@returns + #BT_TRUE if \bt_p{value} is an unsigned integer value. + +@bt_pre_not_null{value} + +@sa bt_value_get_type() — + Returns the type enumerator of a value. +@sa bt_value_type_is() — + Returns whether or not the type of a value conceptually is a given + type. +*/ +static inline +bt_bool bt_value_is_unsigned_integer(const bt_value *value) +{ + return bt_value_get_type(value) == BT_VALUE_TYPE_UNSIGNED_INTEGER; +} + +/*! +@brief + Returns whether or not the value \bt_p{value} is a signed integer + value. + +@param[in] value + Value to check. + +@returns + #BT_TRUE if \bt_p{value} is a signed integer value. + +@bt_pre_not_null{value} + +@sa bt_value_get_type() — + Returns the type enumerator of a value. +@sa bt_value_type_is() — + Returns whether or not the type of a value conceptually is a given + type. +*/ +static inline +bt_bool bt_value_is_signed_integer(const bt_value *value) +{ + return bt_value_get_type(value) == BT_VALUE_TYPE_SIGNED_INTEGER; +} + +/*! +@brief + Returns whether or not the value \bt_p{value} is a real value. + +@param[in] value + Value to check. + +@returns + #BT_TRUE if \bt_p{value} is a real value. + +@bt_pre_not_null{value} + +@sa bt_value_get_type() — + Returns the type enumerator of a value. +@sa bt_value_type_is() — + Returns whether or not the type of a value conceptually is a given + type. +*/ +static inline +bt_bool bt_value_is_real(const bt_value *value) +{ + return bt_value_get_type(value) == BT_VALUE_TYPE_REAL; +} + +/*! +@brief + Returns whether or not the value \bt_p{value} is a string value. + +@param[in] value + Value to check. + +@returns + #BT_TRUE if \bt_p{value} is a string value. + +@bt_pre_not_null{value} + +@sa bt_value_get_type() — + Returns the type enumerator of a value. +@sa bt_value_type_is() — + Returns whether or not the type of a value conceptually is a given + type. +*/ +static inline +bt_bool bt_value_is_string(const bt_value *value) +{ + return bt_value_get_type(value) == BT_VALUE_TYPE_STRING; +} + +/*! +@brief + Returns whether or not the value \bt_p{value} is an array value. + +@param[in] value + Value to check. + +@returns + #BT_TRUE if \bt_p{value} is an array value. + +@bt_pre_not_null{value} + +@sa bt_value_get_type() — + Returns the type enumerator of a value. +@sa bt_value_type_is() — + Returns whether or not the type of a value conceptually is a given + type. +*/ +static inline +bt_bool bt_value_is_array(const bt_value *value) +{ + return bt_value_get_type(value) == BT_VALUE_TYPE_ARRAY; +} + +/*! +@brief + Returns whether or not the value \bt_p{value} is a map value. + +@param[in] value + Value to check. + +@returns + #BT_TRUE if \bt_p{value} is a map value. + +@bt_pre_not_null{value} + +@sa bt_value_get_type() — + Returns the type enumerator of a value. +@sa bt_value_type_is() — + Returns whether or not the type of a value conceptually is a given + type. +*/ +static inline +bt_bool bt_value_is_map(const bt_value *value) +{ + return bt_value_get_type(value) == BT_VALUE_TYPE_MAP; +} + +/*! @} */ + +/*! +@name Null value +@{ +*/ + +/*! +@brief + The null value singleton. + +This is the \em only instance of a null value. + +Like any type of value, the null value is a shared object: if you get a +new null value reference with bt_value_get_ref(), you must eventually +put it with bt_value_put_ref(). The null value singleton's reference +count must never reach 0: libbabeltrace2 logs a warning message when +this programming error occurs. + +Because all null values point to the same null value singleton, you can +directly compare a value to the \c bt_value_null variable. + +@attention + @parblock + \c bt_value_null is different from \c NULL: the former is a true + \bt_name value object while the latter is a C definition which + usually means "no pointer". + + For example, bt_value_map_borrow_entry_value() can return + \c bt_value_null if the requested key is mapped to a null value, but + it can also return \c NULL if the key is not found. + @endparblock + +@sa bt_value_is_null() — + Returns whether or not a value is a null value. +*/ extern bt_value *const bt_value_null; +/*! @} */ + +/*! +@name Boolean value +@{ +*/ + +/*! +@brief + Creates and returns a boolean value initialized to #BT_FALSE. + +The returned value has the type #BT_VALUE_TYPE_BOOL. + +@returns + New boolean value reference, or \c NULL on memory error. + +@sa bt_value_bool_create_init() — + Creates a boolean value with a given initial raw value. +*/ extern bt_value *bt_value_bool_create(void); -extern bt_value *bt_value_bool_create_init(bt_bool val); +/*! +@brief + Creates and returns a boolean value initialized to \bt_p{raw_value}. + +The returned value has the type #BT_VALUE_TYPE_BOOL. + +@param[in] raw_value + Initial raw value of the boolean value to create. + +@returns + New boolean value reference, or \c NULL on memory error. + +@sa bt_value_bool_create() — + Creates a boolean value initialized to #BT_FALSE. +*/ +extern bt_value *bt_value_bool_create_init(bt_bool raw_value); + +/*! +@brief + Sets the raw value of the boolean value \bt_p{value} to + \bt_p{raw_value}. + +@param[in] value + Boolean value of which to set the raw value to \bt_p{raw_value}. +@param[in] raw_value + New raw value of \bt_p{value}. -extern void bt_value_bool_set(bt_value *bool_obj, bt_bool val); +@bt_pre_not_null{value} +@bt_pre_is_bool_val{value} +@bt_pre_hot{value} +@sa bt_value_bool_get() — + Returns the raw value of a boolean value. +*/ +extern void bt_value_bool_set(bt_value *value, bt_bool raw_value); + +/*! +@brief + Returns the raw value of the boolean value \bt_p{value}. + +@param[in] value + Boolean value of which to get the raw value. + +@returns + Raw value of \bt_p{value}. + +@bt_pre_not_null{value} +@bt_pre_is_bool_val{value} + +@sa bt_value_bool_set() — + Sets the raw value of a boolean value. +*/ +extern bt_bool bt_value_bool_get(const bt_value *value); + +/*! @} */ + +/*! +@name Unsigned integer value +@{ +*/ + +/*! +@brief + Creates and returns an unsigned integer value initialized to 0. + +The returned value has the type #BT_VALUE_TYPE_UNSIGNED_INTEGER. + +@returns + New unsigned integer value reference, or \c NULL on memory error. + +@sa bt_value_integer_unsigned_create_init() — + Creates an unsigned integer value with a given initial raw value. +*/ extern bt_value *bt_value_integer_unsigned_create(void); -extern bt_value *bt_value_integer_unsigned_create_init(uint64_t val); +/*! +@brief + Creates and returns an unsigned integer value initialized to + \bt_p{raw_value}. + +The returned value has the type #BT_VALUE_TYPE_UNSIGNED_INTEGER. + +@param[in] raw_value + Initial raw value of the unsigned integer value to create. + +@returns + New unsigned integer value reference, or \c NULL on memory error. + +@sa bt_value_bool_create() — + Creates an unsigned integer value initialized to 0. +*/ +extern bt_value *bt_value_integer_unsigned_create_init(uint64_t raw_value); -extern void bt_value_integer_unsigned_set(bt_value *integer_obj, uint64_t val); +/*! +@brief + Sets the raw value of the unsigned integer value \bt_p{value} to + \bt_p{raw_value}. +@param[in] value + Unsigned integer value of which to set the raw value to + \bt_p{raw_value}. +@param[in] raw_value + New raw value of \bt_p{value}. + +@bt_pre_not_null{value} +@bt_pre_is_uint_val{value} +@bt_pre_hot{value} + +@sa bt_value_integer_unsigned_get() — + Returns the raw value of an unsigned integer value. +*/ +extern void bt_value_integer_unsigned_set(bt_value *value, + uint64_t raw_value); + +/*! +@brief + Returns the raw value of the unsigned integer value \bt_p{value}. + +@param[in] value + Unsigned integer value of which to get the raw value. + +@returns + Raw value of \bt_p{value}. + +@bt_pre_not_null{value} +@bt_pre_is_uint_val{value} + +@sa bt_value_integer_unsigned_set() — + Sets the raw value of an unsigned integer value. +*/ +extern uint64_t bt_value_integer_unsigned_get(const bt_value *value); + +/*! @} */ + +/*! +@name Signed integer value +@{ +*/ + +/*! +@brief + Creates and returns a signed integer value initialized to 0. + +The returned value has the type #BT_VALUE_TYPE_SIGNED_INTEGER. + +@returns + New signed integer value reference, or \c NULL on memory error. + +@sa bt_value_integer_signed_create_init() — + Creates a signed integer value with a given initial raw value. +*/ extern bt_value *bt_value_integer_signed_create(void); -extern bt_value *bt_value_integer_signed_create_init(int64_t val); +/*! +@brief + Creates and returns a signed integer value initialized to + \bt_p{raw_value}. + +The returned value has the type #BT_VALUE_TYPE_SIGNED_INTEGER. + +@param[in] raw_value + Initial raw value of the signed integer value to create. -extern void bt_value_integer_signed_set(bt_value *integer_obj, int64_t val); +@returns + New signed integer value reference, or \c NULL on memory error. +@sa bt_value_bool_create() — + Creates a signed integer value initialized to 0. +*/ +extern bt_value *bt_value_integer_signed_create_init(int64_t raw_value); + +/*! +@brief + Sets the raw value of the signed integer value \bt_p{value} to + \bt_p{raw_value}. + +@param[in] value + Signed integer value of which to set the raw value to + \bt_p{raw_value}. +@param[in] raw_value + New raw value of \bt_p{value}. + +@bt_pre_not_null{value} +@bt_pre_is_sint_val{value} +@bt_pre_hot{value} + +@sa bt_value_integer_signed_get() — + Returns the raw value of a signed integer value. +*/ +extern void bt_value_integer_signed_set(bt_value *value, int64_t raw_value); + +/*! +@brief + Returns the raw value of the signed integer value \bt_p{value}. + +@param[in] value + Signed integer value of which to get the raw value. + +@returns + Raw value of \bt_p{value}. + +@bt_pre_not_null{value} +@bt_pre_is_sint_val{value} + +@sa bt_value_integer_signed_set() — + Sets the raw value of a signed integer value. +*/ +extern int64_t bt_value_integer_signed_get(const bt_value *value); + +/*! @} */ + +/*! +@name Real value +@{ +*/ + +/*! +@brief + Creates and returns a real value initialized to 0. + +The returned value has the type #BT_VALUE_TYPE_REAL. + +@returns + New real value reference, or \c NULL on memory error. + +@sa bt_value_real_create_init() — + Creates a real value with a given initial raw value. +*/ extern bt_value *bt_value_real_create(void); -extern bt_value *bt_value_real_create_init(double val); +/*! +@brief + Creates and returns a real value initialized to \bt_p{raw_value}. + +The returned value has the type #BT_VALUE_TYPE_REAL. + +@param[in] raw_value + Initial raw value of the real value to create. + +@returns + New real value reference, or \c NULL on memory error. + +@sa bt_value_real_create() — + Creates a real value initialized to 0. +*/ +extern bt_value *bt_value_real_create_init(double raw_value); + +/*! +@brief + Sets the raw value of the real value \bt_p{value} to + \bt_p{raw_value}. + +@param[in] value + Real value of which to set the raw value to \bt_p{raw_value}. +@param[in] raw_value + New raw value of \bt_p{value}. + +@bt_pre_not_null{value} +@bt_pre_is_real_val{value} +@bt_pre_hot{value} + +@sa bt_value_real_get() — + Returns the raw value of a real value. +*/ +extern void bt_value_real_set(bt_value *value, double raw_value); + +/*! +@brief + Returns the raw value of the real value \bt_p{value}. + +@param[in] value + Real value of which to get the raw value. + +@returns + Raw value of \bt_p{value}. + +@bt_pre_not_null{value} +@bt_pre_is_real_val{value} + +@sa bt_value_real_set() — + Sets the raw value of a real value. +*/ +extern double bt_value_real_get(const bt_value *value); + +/*! @} */ + +/*! +@name String value +@{ +*/ -extern void bt_value_real_set(bt_value *real_obj, double val); +/*! +@brief + Creates and returns an empty string value. +The returned value has the type #BT_VALUE_TYPE_STRING. + +@returns + New string value reference, or \c NULL on memory error. + +@sa bt_value_string_create_init() — + Creates a string value with a given initial raw value. +*/ extern bt_value *bt_value_string_create(void); -extern bt_value *bt_value_string_create_init(const char *val); +/*! +@brief + Creates and returns a string value initialized to a copy of + \bt_p{raw_value}. + +The returned value has the type #BT_VALUE_TYPE_STRING. + +@param[in] raw_value + Initial raw value of the string value to create (copied). +@returns + New string value reference, or \c NULL on memory error. + +@bt_pre_not_null{raw_value} + +@sa bt_value_string_create() — + Creates an empty string value. +*/ +extern bt_value *bt_value_string_create_init(const char *raw_value); + +/*! +@brief + Status codes for bt_value_string_set(). +*/ typedef enum bt_value_string_set_status { - BT_VALUE_STRING_SET_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + /*! + @brief + Success. + */ BT_VALUE_STRING_SET_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_VALUE_STRING_SET_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, } bt_value_string_set_status; -extern bt_value_string_set_status bt_value_string_set(bt_value *string_obj, - const char *val); +/*! +@brief + Sets the raw value of the string value \bt_p{value} to a copy of + \bt_p{raw_value}. -extern bt_value *bt_value_array_create(void); +@param[in] value + String value of which to set the raw value to a copy of + \bt_p{raw_value}. +@param[in] raw_value + New raw value of \bt_p{value} (copied). -extern bt_value *bt_value_array_borrow_element_by_index(bt_value *array_obj, - uint64_t index); +@retval #BT_VALUE_STRING_SET_STATUS_OK + Success. +@retval #BT_VALUE_STRING_SET_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{value} +@bt_pre_is_string_val{value} +@bt_pre_hot{value} +@bt_pre_not_null{raw_value} + +@sa bt_value_string_get() — + Returns the raw value of a string value. +*/ +extern bt_value_string_set_status bt_value_string_set(bt_value *value, + const char *raw_value); + +/*! +@brief + Returns the raw value of the string value \bt_p{value}. +@param[in] value + String value of which to get the raw value. + +@returns + @parblock + Raw value of \bt_p{value}. + + The returned pointer remains valid until \bt_p{value} is modified. + @endparblock + +@bt_pre_not_null{value} +@bt_pre_is_string_val{value} + +@sa bt_value_string_set() — + Sets the raw value of a string value. +*/ +extern const char *bt_value_string_get(const bt_value *value); + +/*! @} */ + +/*! +@name Array value +@{ +*/ + +/*! +@brief + Creates and returns an empty array value. + +The returned value has the type #BT_VALUE_TYPE_ARRAY. + +@returns + New array value reference, or \c NULL on memory error. +*/ +extern bt_value *bt_value_array_create(void); + +/*! +@brief + Status codes for the bt_value_array_append_*() + functions. +*/ typedef enum bt_value_array_append_element_status { - BT_VALUE_ARRAY_APPEND_ELEMENT_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + /*! + @brief + Success. + */ BT_VALUE_ARRAY_APPEND_ELEMENT_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_VALUE_ARRAY_APPEND_ELEMENT_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, } bt_value_array_append_element_status; +/*! +@brief + Appends the value \bt_p{element_value} to the array value \bt_p{value}. + +To append a null value, pass #bt_value_null as \bt_p{element_value}. + +@param[in] value + Array value to which to append \bt_p{element_value}. +@param[in] element_value + Value to append to \bt_p{value}. + +@retval #BT_VALUE_ARRAY_APPEND_ELEMENT_STATUS_OK + Success. +@retval #BT_VALUE_ARRAY_APPEND_ELEMENT_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{value} +@bt_pre_is_array_val{value} +@bt_pre_hot{value} +@bt_pre_not_null{element_value} +@pre + \bt_p{element_value} does not contain \bt_p{value}, recursively. + +@post + On success, the length of \bt_p{value} is + incremented. + +@sa bt_value_array_append_bool_element() — + Creates and appends a boolean value to an array value. +@sa bt_value_array_append_unsigned_integer_element() — + Creates and appends an unsigned integer value to an array value. +@sa bt_value_array_append_signed_integer_element() — + Creates and appends a signed integer value to an array value. +@sa bt_value_array_append_real_element() — + Creates and appends a real value to an array value. +@sa bt_value_array_append_string_element() — + Creates and appends a string value to an array value. +@sa bt_value_array_append_empty_array_element() — + Creates and appends an empty array value to an array value. +@sa bt_value_array_append_empty_map_element() — + Creates and appends an empty map value to an array value. +*/ extern bt_value_array_append_element_status bt_value_array_append_element( - bt_value *array_obj, bt_value *element_obj); + bt_value *value, bt_value *element_value); + +/*! +@brief + Creates a boolean value initialized to \bt_p{raw_value} and appends + it to the array value \bt_p{value}. + +@param[in] value + Array value to which to append the created boolean value. +@param[in] raw_value + Raw value of the boolean value to create and append to \bt_p{value}. + +@retval #BT_VALUE_ARRAY_APPEND_ELEMENT_STATUS_OK + Success. +@retval #BT_VALUE_ARRAY_APPEND_ELEMENT_STATUS_MEMORY_ERROR + Out of memory. +@bt_pre_not_null{value} +@bt_pre_is_array_val{value} +@bt_pre_hot{value} + +@post + On success, the length of \bt_p{value} is + incremented. + +@sa bt_value_array_append_element() — + Appends an existing value to an array value. +*/ extern bt_value_array_append_element_status -bt_value_array_append_bool_element(bt_value *array_obj, bt_bool val); +bt_value_array_append_bool_element(bt_value *value, bt_bool raw_value); + +/*! +@brief + Creates an unsigned integer value initialized to \bt_p{raw_value} + and appends it to the array value \bt_p{value}. + +@param[in] value + Array value to which to append the created unsigned integer value. +@param[in] raw_value + Raw value of the unsigned integer value to create and append to + \bt_p{value}. + +@retval #BT_VALUE_ARRAY_APPEND_ELEMENT_STATUS_OK + Success. +@retval #BT_VALUE_ARRAY_APPEND_ELEMENT_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{value} +@bt_pre_is_array_val{value} +@bt_pre_hot{value} + +@post + On success, the length of \bt_p{value} is + incremented. +@sa bt_value_array_append_element() — + Appends an existing value to an array value. +*/ extern bt_value_array_append_element_status -bt_value_array_append_unsigned_integer_element(bt_value *array_obj, - uint64_t val); +bt_value_array_append_unsigned_integer_element(bt_value *value, + uint64_t raw_value); +/*! +@brief + Creates a signed integer value initialized to \bt_p{raw_value} and + appends it to the array value \bt_p{value}. + +@param[in] value + Array value to which to append the created signed integer value. +@param[in] raw_value + Raw value of the signed integer value to create and append to + \bt_p{value}. + +@retval #BT_VALUE_ARRAY_APPEND_ELEMENT_STATUS_OK + Success. +@retval #BT_VALUE_ARRAY_APPEND_ELEMENT_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{value} +@bt_pre_is_array_val{value} +@bt_pre_hot{value} + +@post + On success, the length of \bt_p{value} is + incremented. + +@sa bt_value_array_append_element() — + Appends an existing value to an array value. +*/ extern bt_value_array_append_element_status -bt_value_array_append_signed_integer_element(bt_value *array_obj, int64_t val); +bt_value_array_append_signed_integer_element(bt_value *value, + int64_t raw_value); + +/*! +@brief + Creates a real value initialized to \bt_p{raw_value} and appends + it to the array value \bt_p{value}. + +@param[in] value + Array value to which to append the created real value. +@param[in] raw_value + Raw value of the real value to create and append to \bt_p{value}. +@retval #BT_VALUE_ARRAY_APPEND_ELEMENT_STATUS_OK + Success. +@retval #BT_VALUE_ARRAY_APPEND_ELEMENT_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{value} +@bt_pre_is_array_val{value} +@bt_pre_hot{value} + +@post + On success, the length of \bt_p{value} is + incremented. + +@sa bt_value_array_append_element() — + Appends an existing value to an array value. +*/ extern bt_value_array_append_element_status -bt_value_array_append_real_element(bt_value *array_obj, double val); +bt_value_array_append_real_element(bt_value *value, double raw_value); + +/*! +@brief + Creates a string value initialized to a copy of \bt_p{raw_value} and + appends it to the array value \bt_p{value}. + +@param[in] value + Array value to which to append the created string value. +@param[in] raw_value + Raw value of the string value to create and append to \bt_p{value} + (copied). + +@retval #BT_VALUE_ARRAY_APPEND_ELEMENT_STATUS_OK + Success. +@retval #BT_VALUE_ARRAY_APPEND_ELEMENT_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{value} +@bt_pre_is_array_val{value} +@bt_pre_hot{value} +@post + On success, the length of \bt_p{value} is + incremented. + +@sa bt_value_array_append_element() — + Appends an existing value to an array value. +*/ extern bt_value_array_append_element_status -bt_value_array_append_string_element(bt_value *array_obj, const char *val); +bt_value_array_append_string_element(bt_value *value, const char *raw_value); + +/*! +@brief + Creates an empty array value and appends it to the array + value \bt_p{value}. + +On success, if \bt_p{element_value} is not \c NULL, this function sets +\bt_p{*element_value} to a \em borrowed reference of the created empty +array value. + +@param[in] value + Array value to which to append the created empty array value. +@param[out] element_value + On success, if not \c NULL, \bt_p{*element_value} + is a \em borrowed reference of the created empty array value. +@retval #BT_VALUE_ARRAY_APPEND_ELEMENT_STATUS_OK + Success. +@retval #BT_VALUE_ARRAY_APPEND_ELEMENT_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{value} +@bt_pre_is_array_val{value} +@bt_pre_hot{value} + +@post + On success, the length of \bt_p{value} is + incremented. + +@sa bt_value_array_append_element() — + Appends an existing value to an array value. +*/ extern bt_value_array_append_element_status -bt_value_array_append_empty_array_element(bt_value *array_obj, - bt_value **element_obj); +bt_value_array_append_empty_array_element(bt_value *value, + bt_value **element_value); + +/*! +@brief + Creates an empty map value and appends it to the array + value \bt_p{value}. +On success, if \bt_p{element_value} is not \c NULL, this function sets +\bt_p{*element_value} to a \em borrowed reference of the created empty +map value. + +@param[in] value + Array value to which to append the created empty array value. +@param[out] element_value + On success, if not \c NULL, \bt_p{*element_value} + is a \em borrowed reference of the created empty map value. + +@retval #BT_VALUE_ARRAY_APPEND_ELEMENT_STATUS_OK + Success. +@retval #BT_VALUE_ARRAY_APPEND_ELEMENT_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{value} +@bt_pre_is_array_val{value} +@bt_pre_hot{value} + +@post + On success, the length of \bt_p{value} is + incremented. + +@sa bt_value_array_append_element() — + Appends an existing value to an array value. +*/ extern bt_value_array_append_element_status -bt_value_array_append_empty_map_element(bt_value *array_obj, - bt_value **element_obj); +bt_value_array_append_empty_map_element(bt_value *value, + bt_value **element_value); +/*! +@brief + Status codes for bt_value_array_set_element_by_index(). +*/ typedef enum bt_value_array_set_element_by_index_status { - BT_VALUE_ARRAY_SET_ELEMENT_BY_INDEX_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + /*! + @brief + Success. + */ BT_VALUE_ARRAY_SET_ELEMENT_BY_INDEX_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_VALUE_ARRAY_SET_ELEMENT_BY_INDEX_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, } bt_value_array_set_element_by_index_status; +/*! +@brief + Sets the element of the array value \bt_p{value} at index + \bt_p{index} to the value \bt_p{element_value}. + +On success, this function replaces the existing element of \bt_p{value} +at index \bt_p{index}. + +@param[in] value + Array value of which to set the element at index \bt_p{index}. +@param[in] index + Index of the element to set in \bt_p{value}. +@param[in] element_value + Value to set as the element of \bt_p{value} at index \bt_p{index}. + +@retval #BT_VALUE_ARRAY_SET_ELEMENT_BY_INDEX_STATUS_OK + Success. +@retval #BT_VALUE_ARRAY_SET_ELEMENT_BY_INDEX_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{value} +@bt_pre_is_array_val{value} +@bt_pre_hot{value} +@pre + \bt_p{index} is less than the length of \bt_p{value} (as returned by + bt_value_array_get_length()). +@bt_pre_not_null{element_value} +@pre + \bt_p{element_value} does not contain \bt_p{value}, recursively. + +@post + On success, the length of \bt_p{value} is + incremented. + +@sa bt_value_array_append_element() — + Appends a value to an array value. +*/ extern bt_value_array_set_element_by_index_status -bt_value_array_set_element_by_index(bt_value *array_obj, uint64_t index, - bt_value *element_obj); +bt_value_array_set_element_by_index(bt_value *value, uint64_t index, + bt_value *element_value); + +/*! +@brief + Borrows the element at index \bt_p{index} from the array value + \bt_p{value}. + +@param[in] value + Array value from which to borrow the element at index \bt_p{index}. +@param[in] index + Index of the element to borrow from \bt_p{value}. + +@returns + @parblock + \em Borrowed reference of the element of \bt_p{value} at index + \bt_p{index}. + + The returned pointer remains valid until \bt_p{value} is modified. + @endparblock + +@bt_pre_not_null{value} +@bt_pre_is_array_val{value} +@pre + \bt_p{index} is less than the length of \bt_p{value} (as returned by + bt_value_array_get_length()). + +@sa bt_value_array_borrow_element_by_index_const() — + \c const version of this function. +*/ +extern bt_value *bt_value_array_borrow_element_by_index(bt_value *value, + uint64_t index); + +/*! +@brief + Borrows the element at index \bt_p{index} from the array value + \bt_p{value} (\c const version). +See bt_value_array_borrow_element_by_index(). +*/ +extern const bt_value *bt_value_array_borrow_element_by_index_const( + const bt_value *value, uint64_t index); + +/*! +@brief + Returns the length of the array value \bt_p{value}. + +@param[in] value + Array value of which to get the length. + +@returns + Length (number of contained elements) of \bt_p{value}. + +@bt_pre_not_null{value} +@bt_pre_is_array_val{value} + +@sa bt_value_array_is_empty() — + Returns whether or not an array value is empty. +*/ +extern uint64_t bt_value_array_get_length(const bt_value *value); + +/*! +@brief + Returns whether or not the array value \bt_p{value} is empty. + +@param[in] value + Array value to check. + +@returns + #BT_TRUE if \bt_p{value} is empty (has the length 0). + +@bt_pre_not_null{value} +@bt_pre_is_array_val{value} + +@sa bt_value_array_get_length() — + Returns the length of an array value. +*/ +static inline +bt_bool bt_value_array_is_empty(const bt_value *value) +{ + return bt_value_array_get_length(value) == 0; +} + +/*! @} */ + +/*! +@name Map value +@{ +*/ + +/*! +@brief + Creates and returns an empty map value. + +The returned value has the type #BT_VALUE_TYPE_MAP. + +@returns + New map value reference, or \c NULL on memory error. +*/ extern bt_value *bt_value_map_create(void); +/*! +@brief + Status codes for the bt_value_map_insert_*() functions. +*/ +typedef enum bt_value_map_insert_entry_status { + /*! + @brief + Success. + */ + BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_VALUE_MAP_INSERT_ENTRY_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, +} bt_value_map_insert_entry_status; + +/*! +@brief + Inserts or replaces an entry with the key \bt_p{key} and the value + \bt_p{entry_value} in the map value \bt_p{value}. + +To insert an entry having a null value, pass #bt_value_null as +\bt_p{entry_value}. + +On success, if \bt_p{value} already contains an entry with key +\bt_p{key}, this function replaces the existing entry's value with +\bt_p{entry_value}. + +@param[in] value + Map value in which to insert or replace an entry with key \bt_p{key} + and value \bt_p{entry_value}. +@param[in] key + Key of the entry to insert or replace in \bt_p{value} (copied). +@param[in] entry_value + Value of the entry to insert or replace in \bt_p{value}. + +@retval #BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK + Success. +@retval #BT_VALUE_MAP_INSERT_ENTRY_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{value} +@bt_pre_is_map_val{value} +@bt_pre_hot{value} +@bt_pre_not_null{key} +@bt_pre_not_null{entry_value} +@pre + \bt_p{entry_value} does not contain \bt_p{value}, recursively. + +@sa bt_value_map_insert_bool_entry() — + Creates a boolean value and uses it to insert an entry in a map + value. +@sa bt_value_map_insert_unsigned_integer_entry() — + Creates an unsigned integer value and uses it to insert an entry in + a map value. +@sa bt_value_map_insert_signed_integer_entry() — + Creates a signed value and uses it to insert an entry in a map + value. +@sa bt_value_map_insert_real_entry() — + Creates a real value and uses it to insert an entry in a map value. +@sa bt_value_map_insert_string_entry() — + Creates a string value and uses it to insert an entry in a map + value. +@sa bt_value_map_insert_empty_array_entry() — + Creates an empty array value and uses it to insert an entry in a map + value. +@sa bt_value_map_insert_empty_map_entry() — + Creates a map value and uses it to insert an entry in a map value. +*/ +extern bt_value_map_insert_entry_status bt_value_map_insert_entry( + bt_value *value, const char *key, bt_value *entry_value); + +/*! +@brief + Creates a boolean value initialized to \bt_p{raw_value} and + inserts or replaces an entry with the key \bt_p{key} and this value + in the map value \bt_p{value}. + +On success, if \bt_p{value} already contains an entry with key +\bt_p{key}, this function replaces the existing entry's value with the +created boolean value. + +@param[in] value + Map value in which to insert or replace an entry with key \bt_p{key} + and the created boolean value. +@param[in] key + Key of the entry to insert or replace in \bt_p{value} (copied). +@param[in] raw_value + Initial raw value of the boolean value to create. + +@retval #BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK + Success. +@retval #BT_VALUE_MAP_INSERT_ENTRY_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{value} +@bt_pre_is_map_val{value} +@bt_pre_hot{value} +@bt_pre_not_null{key} + +@sa bt_value_map_insert_entry() — + Inserts an entry with an existing value in a map value. +*/ +extern bt_value_map_insert_entry_status bt_value_map_insert_bool_entry( + bt_value *value, const char *key, bt_bool raw_value); + +/*! +@brief + Creates an unsigned integer value initialized to \bt_p{raw_value} + and inserts or replaces an entry with the key \bt_p{key} and this + value in the map value \bt_p{value}. + +On success, if \bt_p{value} already contains an entry with key +\bt_p{key}, this function replaces the existing entry's value with the +created unsigned integer value. + +@param[in] value + Map value in which to insert or replace an entry with key \bt_p{key} + and the created unsigned integer value. +@param[in] key + Key of the entry to insert or replace in \bt_p{value} (copied). +@param[in] raw_value + Initial raw value of the unsigned integer value to create. + +@retval #BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK + Success. +@retval #BT_VALUE_MAP_INSERT_ENTRY_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{value} +@bt_pre_is_map_val{value} +@bt_pre_hot{value} +@bt_pre_not_null{key} + +@sa bt_value_map_insert_entry() — + Inserts an entry with an existing value in a map value. +*/ +extern bt_value_map_insert_entry_status +bt_value_map_insert_unsigned_integer_entry(bt_value *value, const char *key, + uint64_t raw_value); + +/*! +@brief + Creates a signed integer value initialized to \bt_p{raw_value} and + inserts or replaces an entry with the key \bt_p{key} and this value + in the map value \bt_p{value}. + +On success, if \bt_p{value} already contains an entry with key +\bt_p{key}, this function replaces the existing entry's value with the +created signed integer value. + +@param[in] value + Map value in which to insert or replace an entry with key \bt_p{key} + and the created signed integer value. +@param[in] key + Key of the entry to insert or replace in \bt_p{value} (copied). +@param[in] raw_value + Initial raw value of the signed integer value to create. + +@retval #BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK + Success. +@retval #BT_VALUE_MAP_INSERT_ENTRY_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{value} +@bt_pre_is_map_val{value} +@bt_pre_hot{value} +@bt_pre_not_null{key} + +@sa bt_value_map_insert_entry() — + Inserts an entry with an existing value in a map value. +*/ +extern bt_value_map_insert_entry_status +bt_value_map_insert_signed_integer_entry(bt_value *value, const char *key, + int64_t raw_value); + +/*! +@brief + Creates a real value initialized to \bt_p{raw_value} and inserts or + replaces an entry with the key \bt_p{key} and this value in the map + value \bt_p{value}. + +On success, if \bt_p{value} already contains an entry with key +\bt_p{key}, this function replaces the existing entry's value with the +created real value. + +@param[in] value + Map value in which to insert or replace an entry with key \bt_p{key} + and the created real value. +@param[in] key + Key of the entry to insert or replace in \bt_p{value} (copied). +@param[in] raw_value + Initial raw value of the real value to create. + +@retval #BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK + Success. +@retval #BT_VALUE_MAP_INSERT_ENTRY_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{value} +@bt_pre_is_map_val{value} +@bt_pre_hot{value} +@bt_pre_not_null{key} + +@sa bt_value_map_insert_entry() — + Inserts an entry with an existing value in a map value. +*/ +extern bt_value_map_insert_entry_status bt_value_map_insert_real_entry( + bt_value *value, const char *key, double raw_value); + +/*! +@brief + Creates a string value initialized to a copy of \bt_p{raw_value} and + inserts or replaces an entry with the key \bt_p{key} and this value + in the map value \bt_p{value}. + +On success, if \bt_p{value} already contains an entry with key +\bt_p{key}, this function replaces the existing entry's value with the +created string value. + +@param[in] value + Map value in which to insert or replace an entry with key \bt_p{key} + and the created string value. +@param[in] key + Key of the entry to insert or replace in \bt_p{value} (copied). +@param[in] raw_value + Initial raw value of the string value to create (copied). + +@retval #BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK + Success. +@retval #BT_VALUE_MAP_INSERT_ENTRY_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{value} +@bt_pre_is_map_val{value} +@bt_pre_hot{value} +@bt_pre_not_null{key} + +@sa bt_value_map_insert_entry() — + Inserts an entry with an existing value in a map value. +*/ +extern bt_value_map_insert_entry_status +bt_value_map_insert_string_entry(bt_value *value, const char *key, + const char *raw_value); + +/*! +@brief + Creates an empty array value and inserts or replaces an entry with + the key \bt_p{key} and this value in the map value \bt_p{value}. + +On success, if \bt_p{entry_value} is not \c NULL, this function sets +\bt_p{*entry_value} to a \em borrowed reference of the created empty +array value. + +On success, if \bt_p{value} already contains an entry with key +\bt_p{key}, this function replaces the existing entry's value with the +created empty array value. + +@param[in] value + Map value in which to insert or replace an entry with key \bt_p{key} + and the created empty array value. +@param[in] key + Key of the entry to insert or replace in \bt_p{value} (copied). +@param[out] entry_value + On success, if not \c NULL, \bt_p{*entry_value} is + a \em borrowed reference of the created empty array value. + +@retval #BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK + Success. +@retval #BT_VALUE_MAP_INSERT_ENTRY_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{value} +@bt_pre_is_map_val{value} +@bt_pre_hot{value} +@bt_pre_not_null{key} + +@sa bt_value_map_insert_entry() — + Inserts an entry with an existing value in a map value. +*/ +extern bt_value_map_insert_entry_status +bt_value_map_insert_empty_array_entry(bt_value *value, const char *key, + bt_value **entry_value); + +/*! +@brief + Creates an empty map value and inserts or replaces an entry with + the key \bt_p{key} and this value in the map value \bt_p{value}. + +On success, if \bt_p{entry_value} is not \c NULL, this function sets +\bt_p{*entry_value} to a \em borrowed reference of the created empty map +value. + +On success, if \bt_p{value} already contains an entry with key +\bt_p{key}, this function replaces the existing entry's value with the +created empty map value. + +@param[in] value + Map value in which to insert or replace an entry with key \bt_p{key} + and the created empty map value. +@param[in] key + Key of the entry to insert or replace in \bt_p{value} (copied). +@param[out] entry_value + On success, if not \c NULL, \bt_p{*entry_value} is + a \em borrowed reference of the created empty map value. + +@retval #BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK + Success. +@retval #BT_VALUE_MAP_INSERT_ENTRY_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{value} +@bt_pre_is_map_val{value} +@bt_pre_hot{value} +@bt_pre_not_null{key} + +@sa bt_value_map_insert_entry() — + Inserts an entry with an existing value in a map value. +*/ +extern bt_value_map_insert_entry_status +bt_value_map_insert_empty_map_entry(bt_value *value, const char *key, + bt_value **entry_value); + +/*! +@brief + Borrows the value of the entry with the key \bt_p{key} in the map + value \bt_p{value}. + +If no entry with key \bt_p{key} exists in \bt_p{value}, this function +returns \c NULL. + +@param[in] value + Map value from which to borrow the value of the entry with the + key \bt_p{key}. +@param[in] key + Key of the entry from which to borrow the value in \bt_p{value}. + +@returns + @parblock + \em Borrowed reference of the value of the entry with key \bt_p{key} + in \bt_p{value}, or \c NULL if none. + + The returned pointer remains valid until \bt_p{value} is modified. + @endparblock + +@bt_pre_not_null{value} +@bt_pre_is_array_val{value} +@bt_pre_not_null{key} + +@sa bt_value_map_borrow_entry_value_const() — + \c const version of this function. +@sa bt_value_map_has_entry() — + Returns whether or not a map value has an entry with a given key. +*/ extern bt_value *bt_value_map_borrow_entry_value( - bt_value *map_obj, const char *key); + bt_value *value, const char *key); + +/*! +@brief + Borrows the value of the entry with the key \bt_p{key} in the map + value \bt_p{value} (\c const version). + +See bt_value_map_borrow_entry_value(). +*/ +extern const bt_value *bt_value_map_borrow_entry_value_const( + const bt_value *value, const char *key); +/*! +@brief + Status codes for #bt_value_map_foreach_entry_func. +*/ typedef enum bt_value_map_foreach_entry_func_status { + /*! + @brief + Success. + */ BT_VALUE_MAP_FOREACH_ENTRY_FUNC_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_VALUE_MAP_FOREACH_ENTRY_FUNC_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, - BT_VALUE_MAP_FOREACH_ENTRY_FUNC_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + Interrupt the iteration process. + */ BT_VALUE_MAP_FOREACH_ENTRY_FUNC_STATUS_INTERRUPT = __BT_FUNC_STATUS_INTERRUPTED, + + /*! + @brief + Out of memory. + */ + BT_VALUE_MAP_FOREACH_ENTRY_FUNC_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + User error. + */ + BT_VALUE_MAP_FOREACH_ENTRY_FUNC_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, } bt_value_map_foreach_entry_func_status; +/*! +@brief + User function for bt_value_map_foreach_entry(). + +This is the type of the user function that bt_value_map_foreach_entry() +calls for each entry of the map value. + +@param[in] key + Key of the map value entry. +@param[in] value + Value of the map value entry. +@param[in] user_data + User data, as passed as the \bt_p{user_data} parameter of + bt_value_map_foreach_entry(). + +@retval #BT_VALUE_MAP_FOREACH_ENTRY_FUNC_STATUS_OK + Success. +@retval #BT_VALUE_MAP_FOREACH_ENTRY_FUNC_STATUS_INTERRUPT + Interrupt the iteration process. +@retval #BT_VALUE_MAP_FOREACH_ENTRY_FUNC_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_VALUE_MAP_FOREACH_ENTRY_FUNC_STATUS_ERROR + User error. + +@bt_pre_not_null{key} +@bt_pre_not_null{value} + +@sa bt_value_map_foreach_entry() — + Iterates the entries of a map value. +*/ typedef bt_value_map_foreach_entry_func_status (* bt_value_map_foreach_entry_func)(const char *key, - bt_value *object, void *data); + bt_value *value, void *user_data); +/*! +@brief + Status codes for bt_value_map_foreach_entry(). +*/ typedef enum bt_value_map_foreach_entry_status { + /*! + @brief + Success. + */ BT_VALUE_MAP_FOREACH_ENTRY_STATUS_OK = __BT_FUNC_STATUS_OK, - BT_VALUE_MAP_FOREACH_ENTRY_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, - BT_VALUE_MAP_FOREACH_ENTRY_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, - BT_VALUE_MAP_FOREACH_ENTRY_STATUS_USER_ERROR = __BT_FUNC_STATUS_USER_ERROR, + + /*! + @brief + User function interrupted the iteration process. + */ BT_VALUE_MAP_FOREACH_ENTRY_STATUS_INTERRUPTED = __BT_FUNC_STATUS_INTERRUPTED, + + /*! + @brief + User function error. + */ + BT_VALUE_MAP_FOREACH_ENTRY_STATUS_USER_ERROR = __BT_FUNC_STATUS_USER_ERROR, + + /*! + @brief + Out of memory. + */ + BT_VALUE_MAP_FOREACH_ENTRY_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + Other error. + */ + BT_VALUE_MAP_FOREACH_ENTRY_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, } bt_value_map_foreach_entry_status; +/*! +@brief + Iterates the entries of the map value \bt_p{value}, calling + \bt_p{user_func} for each entry. + +This function iterates the entries of \bt_p{value} in no particular +order. + +@attention + You must \em not modify \bt_p{value} during the iteration process. + +\bt_p{user_func} receives \bt_p{user_data} as its last parameter. + +The iteration process stops when one of: + +- \bt_p{user_func} was called for each entry. +- \bt_p{user_func} does not return + #BT_VALUE_MAP_FOREACH_ENTRY_FUNC_STATUS_OK. + +@param[in] value + Map value of which to iterate the entries. +@param[in] user_func + User function to call for each entry of \bt_p{value}. +@param[in] user_data + User data to pass as the \bt_p{user_data} parameter of each call to + \bt_p{user_func}. + +@retval #BT_VALUE_MAP_FOREACH_ENTRY_STATUS_OK + Success. +@retval #BT_VALUE_MAP_FOREACH_ENTRY_STATUS_INTERRUPTED + \bt_p{user_func} returned + #BT_VALUE_MAP_FOREACH_ENTRY_FUNC_STATUS_INTERRUPT to interrupt the + iteration process. +@retval #BT_VALUE_MAP_FOREACH_ENTRY_STATUS_USER_ERROR + \bt_p{user_func} returned + #BT_VALUE_MAP_FOREACH_ENTRY_FUNC_STATUS_ERROR. +@retval #BT_VALUE_MAP_FOREACH_ENTRY_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_VALUE_MAP_FOREACH_ENTRY_STATUS_ERROR + Other error caused the bt_value_map_foreach_entry() + function itself. + +@bt_pre_not_null{value} +@bt_pre_is_map_val{value} +@bt_pre_not_null{user_func} + +@sa bt_value_map_foreach_entry_const() — + \c const version of this function. +@sa bt_value_map_borrow_entry_value() — + Borrows the value of a specific map value entry. +*/ extern bt_value_map_foreach_entry_status bt_value_map_foreach_entry( - bt_value *map_obj, bt_value_map_foreach_entry_func func, - void *data); + bt_value *value, bt_value_map_foreach_entry_func user_func, + void *user_data); -typedef enum bt_value_map_insert_entry_status { - BT_VALUE_MAP_INSERT_ENTRY_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, - BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK = __BT_FUNC_STATUS_OK, -} bt_value_map_insert_entry_status; +/*! +@brief + Status codes for #bt_value_map_foreach_entry_const_func. +*/ +typedef enum bt_value_map_foreach_entry_const_func_status { + /*! + @brief + Success. + */ + BT_VALUE_MAP_FOREACH_ENTRY_CONST_FUNC_STATUS_OK = __BT_FUNC_STATUS_OK, -extern bt_value_map_insert_entry_status bt_value_map_insert_entry( - bt_value *map_obj, const char *key, bt_value *element_obj); + /*! + @brief + Interrupt the iteration process. + */ + BT_VALUE_MAP_FOREACH_ENTRY_CONST_FUNC_STATUS_INTERRUPT = __BT_FUNC_STATUS_INTERRUPTED, -extern bt_value_map_insert_entry_status bt_value_map_insert_bool_entry( - bt_value *map_obj, const char *key, bt_bool val); + /*! + @brief + Out of memory. + */ + BT_VALUE_MAP_FOREACH_ENTRY_CONST_FUNC_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, -extern bt_value_map_insert_entry_status -bt_value_map_insert_unsigned_integer_entry(bt_value *map_obj, const char *key, - uint64_t val); + /*! + @brief + User error. + */ + BT_VALUE_MAP_FOREACH_ENTRY_CONST_FUNC_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, +} bt_value_map_foreach_entry_const_func_status; -extern bt_value_map_insert_entry_status -bt_value_map_insert_signed_integer_entry(bt_value *map_obj, const char *key, - int64_t val); +/*! +@brief + User function for bt_value_map_foreach_entry_const_func(). -extern bt_value_map_insert_entry_status bt_value_map_insert_real_entry( - bt_value *map_obj, const char *key, double val); +This is the type of the user function that +bt_value_map_foreach_entry_const_func() calls for each entry of the map +value. -extern bt_value_map_insert_entry_status -bt_value_map_insert_string_entry(bt_value *map_obj, const char *key, - const char *val); +@param[in] key + Key of the map value entry. +@param[in] value + Value of the map value entry. +@param[in] user_data + User data. -extern bt_value_map_insert_entry_status -bt_value_map_insert_empty_array_entry(bt_value *map_obj, const char *key, - bt_value **entry_obj); +@retval #BT_VALUE_MAP_FOREACH_ENTRY_CONST_FUNC_STATUS_OK + Success. +@retval #BT_VALUE_MAP_FOREACH_ENTRY_CONST_FUNC_STATUS_INTERRUPT + Interrupt the iteration process. +@retval #BT_VALUE_MAP_FOREACH_ENTRY_CONST_FUNC_STATUS_MEMORY_ERROR + Out of memory. +@retval #BT_VALUE_MAP_FOREACH_ENTRY_CONST_FUNC_STATUS_ERROR + User error. -extern bt_value_map_insert_entry_status -bt_value_map_insert_empty_map_entry(bt_value *map_obj, const char *key, - bt_value **entry_obj); +@bt_pre_not_null{key} +@bt_pre_not_null{value} + +@sa bt_value_map_foreach_entry_const() — + Iterates the entries of a \c const map value. +*/ +typedef bt_value_map_foreach_entry_const_func_status + (* bt_value_map_foreach_entry_const_func)(const char *key, + const bt_value *value, void *user_data); + +/*! +@brief + Status codes for bt_value_map_foreach_entry_const(). +*/ +typedef enum bt_value_map_foreach_entry_const_status { + /*! + @brief + Success. + */ + BT_VALUE_MAP_FOREACH_ENTRY_CONST_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + User function interrupted the iteration process. + */ + BT_VALUE_MAP_FOREACH_ENTRY_CONST_STATUS_INTERRUPTED = __BT_FUNC_STATUS_INTERRUPTED, + + /*! + @brief + User function error. + */ + BT_VALUE_MAP_FOREACH_ENTRY_CONST_STATUS_USER_ERROR = __BT_FUNC_STATUS_USER_ERROR, + + /*! + @brief + Out of memory. + */ + BT_VALUE_MAP_FOREACH_ENTRY_CONST_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + + /*! + @brief + Other error. + */ + BT_VALUE_MAP_FOREACH_ENTRY_CONST_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, +} bt_value_map_foreach_entry_const_status; + +/*! +@brief + Iterates the entries of the map value \bt_p{value}, calling + \bt_p{user_func} for each entry (\c const version). + +See bt_value_map_foreach_entry(). + +@sa bt_value_map_borrow_entry_value_const() — + Borrows the value of a specific map value entry. +*/ +extern bt_value_map_foreach_entry_const_status bt_value_map_foreach_entry_const( + const bt_value *value, + bt_value_map_foreach_entry_const_func user_func, + void *user_data); + +/*! +@brief + Returns the size of the map value \bt_p{value}. + +@param[in] value + Map value of which to get the size. + +@returns + Size (number of contained entries) of \bt_p{value}. + +@bt_pre_not_null{value} +@bt_pre_is_map_val{value} + +@sa bt_value_map_is_empty() — + Returns whether or not a map value is empty. +*/ +extern uint64_t bt_value_map_get_size(const bt_value *value); + +/*! +@brief + Returns whether or not the map value \bt_p{value} is empty. + +@param[in] value + Map value to check. + +@returns + #BT_TRUE if \bt_p{value} is empty (has the size 0). +@bt_pre_not_null{value} +@bt_pre_is_map_val{value} + +@sa bt_value_map_get_size() — + Returns the size of a map value. +*/ +static inline +bt_bool bt_value_map_is_empty(const bt_value *value) +{ + return bt_value_map_get_size(value) == 0; +} + +/*! +@brief + Returns whether or not the map value \bt_p{value} has an entry with + the key \bt_p{key}. + +@param[in] value + Map value to check. +@param[in] key + Key to check. + +@returns + #BT_TRUE if \bt_p{value} has an entry with the key \bt_p{key}. + +@bt_pre_not_null{value} +@bt_pre_is_map_val{value} +@bt_pre_not_null{key} + +@sa bt_value_map_borrow_entry_value_const() — + Borrows the value of a specific map value entry. +*/ +extern bt_bool bt_value_map_has_entry(const bt_value *value, + const char *key); + +/*! +@brief + Status codes for bt_value_map_extend(). +*/ typedef enum bt_value_map_extend_status { - BT_VALUE_MAP_EXTEND_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, + /*! + @brief + Success. + */ BT_VALUE_MAP_EXTEND_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_VALUE_MAP_EXTEND_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, } bt_value_map_extend_status; +/*! +@brief + Extends the map value \bt_p{value} with the map value + \bt_p{extension_value}. + +For each entry in \bt_p{extension_value}, this function calls +bt_value_map_insert_entry() to insert or replace it in the map value +\bt_p{value}. + +For example, with: + +
    +
    + \bt_p{value} +
    +
    + @code{.json} + { + "man": "giant", + "strange": 23 + } + @endcode +
    + +
    + \bt_p{extension_value} +
    +
    + @code{.json} + { + "balance": -17 + "strange": false + } + @endcode +
    +
    + +The map value \bt_p{value} becomes: + +@code{.json} +{ + "man": "giant", + "strange": false, + "balance": -17 +} +@endcode + +@param[in] value + Map value to extend. +@param[in] extension_value + Extension map value. + +@retval #BT_VALUE_MAP_EXTEND_STATUS_OK + Success. +@retval #BT_VALUE_MAP_EXTEND_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{value} +@bt_pre_is_map_val{value} +@bt_pre_not_null{extension_value} +@bt_pre_is_map_val{extension_value} + +@sa bt_value_copy() — + Deep-copies a value. +*/ extern bt_value_map_extend_status bt_value_map_extend( - bt_value *base_map_obj, - const bt_value *extension_map_obj); + bt_value *value, const bt_value *extension_value); + +/*! @} */ + +/*! +@name General +@{ +*/ + +/*! +@brief + Status codes for bt_value_copy(). +*/ +typedef enum bt_value_copy_status { + /*! + @brief + Success. + */ + BT_VALUE_COPY_STATUS_OK = __BT_FUNC_STATUS_OK, + + /*! + @brief + Out of memory. + */ + BT_VALUE_COPY_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, +} bt_value_copy_status; + +/*! +@brief + Deep-copies a value object. + +This function deep-copies \bt_p{value} and sets \bt_p{*copy} to the +result. + +Because \bt_p{*copy} is a deep copy, it does not contain, recursively, +any reference that \bt_p{value} contains, but the raw values are +identical. + +@param[in] value + Value to deep-copy. +@param[in] copy_value + On success, \bt_p{*copy_value} is a deep copy of + \bt_p{value}. + +@retval #BT_VALUE_COPY_STATUS_OK + Success. +@retval #BT_VALUE_COPY_STATUS_MEMORY_ERROR + Out of memory. + +@bt_pre_not_null{value} +@bt_pre_not_null{copy_value} +*/ +extern bt_value_copy_status bt_value_copy(const bt_value *value, + bt_value **copy_value); + +/*! +@brief + Returns whether or not the value \bt_p{a_value} is equal, + recursively, to \bt_p{b_value}. + +@note + If you want to know whether or not a value is a null value, you can + also directly compare its pointer to the #bt_value_null variable. + +@param[in] a_value + Value A. +@param[in] b_value + Value B. + +@returns + #BT_TRUE if \bt_p{a_value} is equal, recursively, to \bt_p{b_value}. + +@bt_pre_not_null{a_value} +@bt_pre_not_null{b_value} +*/ +extern bt_bool bt_value_is_equal(const bt_value *a_value, + const bt_value *b_value); + +/*! @} */ + +/*! +@name Reference count +@{ +*/ + +/*! +@brief + Increments the \ref api-fund-shared-object "reference count" of + the value \bt_p{value}. + +@param[in] value + @parblock + Value of which to increment the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_value_put_ref() — + Decrements the reference count of a value. +*/ +extern void bt_value_get_ref(const bt_value *value); + +/*! +@brief + Decrements the \ref api-fund-shared-object "reference count" of + the value \bt_p{value}. + +@param[in] value + @parblock + Value of which to decrement the reference count. + + Can be \c NULL. + @endparblock + +@sa bt_value_get_ref() — + Increments the reference count of a value. +*/ +extern void bt_value_put_ref(const bt_value *value); + +/*! +@brief + Decrements the reference count of the value \bt_p{_value}, and then + sets \bt_p{_value} to \c NULL. + +@param _value + @parblock + Value of which to decrement the reference count. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_value} +*/ +#define BT_VALUE_PUT_REF_AND_RESET(_value) \ + do { \ + bt_value_put_ref(_value); \ + (_value) = NULL; \ + } while (0) + +/*! +@brief + Decrements the reference count of the value \bt_p{_dst}, sets + \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} to \c NULL. + +This macro effectively moves a value reference from the expression +\bt_p{_src} to the expression \bt_p{_dst}, putting the existing +\bt_p{_dst} reference. + +@param _dst + @parblock + Destination expression. + + Can contain \c NULL. + @endparblock +@param _src + @parblock + Source expression. + + Can contain \c NULL. + @endparblock + +@bt_pre_assign_expr{_dst} +@bt_pre_assign_expr{_src} +*/ +#define BT_VALUE_MOVE_REF(_dst, _src) \ + do { \ + bt_value_put_ref(_dst); \ + (_dst) = (_src); \ + (_src) = NULL; \ + } while (0) + +/*! @} */ + +/*! @} */ #ifdef __cplusplus } diff --git a/include/babeltrace2/version.h b/include/babeltrace2/version.h index 1a15af43..7cd0213f 100644 --- a/include/babeltrace2/version.h +++ b/include/babeltrace2/version.h @@ -31,11 +31,79 @@ extern "C" { #endif +/*! +@defgroup api-version Library version + +@brief + Library version getters. + +This module contains four functions to get the four parts of the +library's version: + +
    +
    Major version
    +
    bt_version_get_major()
    + +
    Minor version
    +
    bt_version_get_minor()
    + +
    Patch version
    +
    bt_version_get_patch()
    + +
    Extra information
    +
    bt_version_get_extra()
    +
    +*/ + +/*! @{ */ + +/*! +@brief + Returns the major version of libbabeltrace2. + +@returns + Major version of the library. +*/ extern unsigned int bt_version_get_major(void); + +/*! +@brief + Returns the minor version of libbabeltrace2. + +@returns + Minor version of the library. +*/ extern unsigned int bt_version_get_minor(void); + +/*! +@brief + Returns the patch version of libbabeltrace2. + +@returns + Patch version of the library. +*/ extern unsigned int bt_version_get_patch(void); + +/*! +@brief + Returns extra information about the version of libbabeltrace2. + +This extra information can contain a version suffix such as +-pre5 or -rc1. + +@returns + @parblock + Extra information about the library's version. + + Cannot be \c NULL. + + Can be an empty string if there's no extra information. + @endparblock +*/ extern const char *bt_version_get_extra(void); +/*! @} */ + #ifdef __cplusplus } #endif diff --git a/src/bindings/python/bt2/bt2/native_bt.i b/src/bindings/python/bt2/bt2/native_bt.i index 919fc1dc..2300cee4 100644 --- a/src/bindings/python/bt2/bt2/native_bt.i +++ b/src/bindings/python/bt2/bt2/native_bt.i @@ -207,8 +207,8 @@ void bt_bt2_exit_handler(void); */ #define __BT_IN_BABELTRACE_H -/* Property enumeration */ -%include +/* Common types */ +%include /* Common function status codes */ %include diff --git a/src/bindings/python/bt2/bt2/native_bt_clock_class.i b/src/bindings/python/bt2/bt2/native_bt_clock_class.i index 4e7bfb22..251722ff 100644 --- a/src/bindings/python/bt2/bt2/native_bt_clock_class.i +++ b/src/bindings/python/bt2/bt2/native_bt_clock_class.i @@ -22,5 +22,4 @@ * THE SOFTWARE. */ -%include %include diff --git a/src/bindings/python/bt2/bt2/native_bt_clock_snapshot.i b/src/bindings/python/bt2/bt2/native_bt_clock_snapshot.i index 5423bafe..93408d3e 100644 --- a/src/bindings/python/bt2/bt2/native_bt_clock_snapshot.i +++ b/src/bindings/python/bt2/bt2/native_bt_clock_snapshot.i @@ -22,4 +22,4 @@ * THE SOFTWARE. */ -%include +%include diff --git a/src/bindings/python/bt2/bt2/native_bt_component.i b/src/bindings/python/bt2/bt2/native_bt_component.i index ae44579b..aa3f7252 100644 --- a/src/bindings/python/bt2/bt2/native_bt_component.i +++ b/src/bindings/python/bt2/bt2/native_bt_component.i @@ -82,14 +82,8 @@ } } -%include -%include -%include -%include +%include %include -%include -%include -%include /* * This type map relies on the rather common "user_data" name, so don't pollute diff --git a/src/bindings/python/bt2/bt2/native_bt_component_class.i b/src/bindings/python/bt2/bt2/native_bt_component_class.i index 4c26660f..06710faa 100644 --- a/src/bindings/python/bt2/bt2/native_bt_component_class.i +++ b/src/bindings/python/bt2/bt2/native_bt_component_class.i @@ -23,16 +23,8 @@ */ %include -%include -%include -%include -%include -%include -%include -%include -%include -%include -%include +%include +%include %{ #include "native_bt_component_class.i.h" diff --git a/src/bindings/python/bt2/bt2/native_bt_connection.i b/src/bindings/python/bt2/bt2/native_bt_connection.i index bb228583..042c71ab 100644 --- a/src/bindings/python/bt2/bt2/native_bt_connection.i +++ b/src/bindings/python/bt2/bt2/native_bt_connection.i @@ -22,4 +22,4 @@ * THE SOFTWARE. */ -%include +%include diff --git a/src/bindings/python/bt2/bt2/native_bt_error.i b/src/bindings/python/bt2/bt2/native_bt_error.i index 1ccf6c4a..ad73753e 100644 --- a/src/bindings/python/bt2/bt2/native_bt_error.i +++ b/src/bindings/python/bt2/bt2/native_bt_error.i @@ -25,9 +25,7 @@ * We include current-thread.h here, because for now, it only contains * error-related things. */ -%include -%include -%include +%include %{ #include "native_bt_error.i.h" diff --git a/src/bindings/python/bt2/bt2/native_bt_event.i b/src/bindings/python/bt2/bt2/native_bt_event.i index 7812b0cd..ea3d8150 100644 --- a/src/bindings/python/bt2/bt2/native_bt_event.i +++ b/src/bindings/python/bt2/bt2/native_bt_event.i @@ -22,5 +22,4 @@ * THE SOFTWARE. */ -%include %include diff --git a/src/bindings/python/bt2/bt2/native_bt_event_class.i b/src/bindings/python/bt2/bt2/native_bt_event_class.i index 5bf6ebd2..14f51625 100644 --- a/src/bindings/python/bt2/bt2/native_bt_event_class.i +++ b/src/bindings/python/bt2/bt2/native_bt_event_class.i @@ -36,5 +36,4 @@ $result = SWIG_Python_AppendOutput($result, SWIG_From_int(*$1)); } -%include %include diff --git a/src/bindings/python/bt2/bt2/native_bt_field.i b/src/bindings/python/bt2/bt2/native_bt_field.i index 8b944c63..d1429d55 100644 --- a/src/bindings/python/bt2/bt2/native_bt_field.i +++ b/src/bindings/python/bt2/bt2/native_bt_field.i @@ -25,5 +25,4 @@ /* For label type mappings. */ %include "native_bt_field_class.i" -%include %include diff --git a/src/bindings/python/bt2/bt2/native_bt_field_class.i b/src/bindings/python/bt2/bt2/native_bt_field_class.i index 5a84b869..48f48c08 100644 --- a/src/bindings/python/bt2/bt2/native_bt_field_class.i +++ b/src/bindings/python/bt2/bt2/native_bt_field_class.i @@ -24,14 +24,14 @@ /* Parameter names seem to be required for multi-argument typemaps to match. */ %typemap(in, numinputs=0) - (bt_field_class_enumeration_mapping_label_array *label_array, uint64_t *count) + (bt_field_class_enumeration_mapping_label_array *labels, uint64_t *count) (bt_field_class_enumeration_mapping_label_array temp_array, uint64_t temp_label_count = 0) { $1 = &temp_array; $2 = &temp_label_count; } %typemap(argout) - (bt_field_class_enumeration_mapping_label_array *label_array, uint64_t *count) { + (bt_field_class_enumeration_mapping_label_array *labels, uint64_t *count) { if (*$1) { PyObject *py_label_list = PyList_New(*$2); uint64_t i; @@ -47,5 +47,4 @@ } } -%include %include diff --git a/src/bindings/python/bt2/bt2/native_bt_field_path.i b/src/bindings/python/bt2/bt2/native_bt_field_path.i index 562e9d52..05313df2 100644 --- a/src/bindings/python/bt2/bt2/native_bt_field_path.i +++ b/src/bindings/python/bt2/bt2/native_bt_field_path.i @@ -22,4 +22,4 @@ * THE SOFTWARE. */ -%include +%include diff --git a/src/bindings/python/bt2/bt2/native_bt_graph.i b/src/bindings/python/bt2/bt2/native_bt_graph.i index 4a7b9f6d..0bda11f7 100644 --- a/src/bindings/python/bt2/bt2/native_bt_graph.i +++ b/src/bindings/python/bt2/bt2/native_bt_graph.i @@ -101,7 +101,6 @@ } } -%include %include /* Helper functions for Python */ diff --git a/src/bindings/python/bt2/bt2/native_bt_integer_range_set.i b/src/bindings/python/bt2/bt2/native_bt_integer_range_set.i index 7cd26f00..2f13cc0d 100644 --- a/src/bindings/python/bt2/bt2/native_bt_integer_range_set.i +++ b/src/bindings/python/bt2/bt2/native_bt_integer_range_set.i @@ -23,4 +23,3 @@ */ %include -%include diff --git a/src/bindings/python/bt2/bt2/native_bt_interrupter.i b/src/bindings/python/bt2/bt2/native_bt_interrupter.i index 43991446..c3383416 100644 --- a/src/bindings/python/bt2/bt2/native_bt_interrupter.i +++ b/src/bindings/python/bt2/bt2/native_bt_interrupter.i @@ -23,4 +23,3 @@ */ %include -%include diff --git a/src/bindings/python/bt2/bt2/native_bt_message.i b/src/bindings/python/bt2/bt2/native_bt_message.i index 06726f42..8cc90553 100644 --- a/src/bindings/python/bt2/bt2/native_bt_message.i +++ b/src/bindings/python/bt2/bt2/native_bt_message.i @@ -44,21 +44,4 @@ } } -%include -%include -%include -%include -%include -%include -%include -%include -%include -%include -%include -%include -%include -%include -%include -%include -%include -%include +%include diff --git a/src/bindings/python/bt2/bt2/native_bt_mip.i b/src/bindings/python/bt2/bt2/native_bt_mip.i index 77cd251c..41da5fd6 100644 --- a/src/bindings/python/bt2/bt2/native_bt_mip.i +++ b/src/bindings/python/bt2/bt2/native_bt_mip.i @@ -23,8 +23,7 @@ */ %include -%include -%include +%include %{ #include "native_bt_mip.i.h" diff --git a/src/bindings/python/bt2/bt2/native_bt_packet.i b/src/bindings/python/bt2/bt2/native_bt_packet.i index 10357937..4b68d3c5 100644 --- a/src/bindings/python/bt2/bt2/native_bt_packet.i +++ b/src/bindings/python/bt2/bt2/native_bt_packet.i @@ -22,5 +22,4 @@ * THE SOFTWARE. */ -%include %include diff --git a/src/bindings/python/bt2/bt2/native_bt_plugin.i b/src/bindings/python/bt2/bt2/native_bt_plugin.i index e96ea6ed..edd91e79 100644 --- a/src/bindings/python/bt2/bt2/native_bt_plugin.i +++ b/src/bindings/python/bt2/bt2/native_bt_plugin.i @@ -64,8 +64,7 @@ } } -%include -%include +%include /* Helpers */ diff --git a/src/bindings/python/bt2/bt2/native_bt_port.i b/src/bindings/python/bt2/bt2/native_bt_port.i index 590ded69..c8c0832e 100644 --- a/src/bindings/python/bt2/bt2/native_bt_port.i +++ b/src/bindings/python/bt2/bt2/native_bt_port.i @@ -35,12 +35,8 @@ $result = $1; } -%include -%include -%include +%include %include -%include -%include /* * Clear this typemap, since it is a bit broad and could apply to something we diff --git a/src/bindings/python/bt2/bt2/native_bt_query_exec.i b/src/bindings/python/bt2/bt2/native_bt_query_exec.i index a422ecbb..857c3363 100644 --- a/src/bindings/python/bt2/bt2/native_bt_query_exec.i +++ b/src/bindings/python/bt2/bt2/native_bt_query_exec.i @@ -23,7 +23,6 @@ */ %include -%include %include %{ diff --git a/src/bindings/python/bt2/bt2/native_bt_stream.i b/src/bindings/python/bt2/bt2/native_bt_stream.i index 95a9d366..28f2a39a 100644 --- a/src/bindings/python/bt2/bt2/native_bt_stream.i +++ b/src/bindings/python/bt2/bt2/native_bt_stream.i @@ -22,5 +22,4 @@ * THE SOFTWARE. */ -%include %include diff --git a/src/bindings/python/bt2/bt2/native_bt_stream_class.i b/src/bindings/python/bt2/bt2/native_bt_stream_class.i index 69937bab..1c93cbd5 100644 --- a/src/bindings/python/bt2/bt2/native_bt_stream_class.i +++ b/src/bindings/python/bt2/bt2/native_bt_stream_class.i @@ -22,5 +22,4 @@ * THE SOFTWARE. */ -%include %include diff --git a/src/bindings/python/bt2/bt2/native_bt_trace.i b/src/bindings/python/bt2/bt2/native_bt_trace.i index 5ecccf0c..0868055c 100644 --- a/src/bindings/python/bt2/bt2/native_bt_trace.i +++ b/src/bindings/python/bt2/bt2/native_bt_trace.i @@ -22,7 +22,6 @@ * THE SOFTWARE. */ -%include %include %{ diff --git a/src/bindings/python/bt2/bt2/native_bt_trace_class.i b/src/bindings/python/bt2/bt2/native_bt_trace_class.i index cc079379..3e491693 100644 --- a/src/bindings/python/bt2/bt2/native_bt_trace_class.i +++ b/src/bindings/python/bt2/bt2/native_bt_trace_class.i @@ -22,7 +22,6 @@ * THE SOFTWARE. */ -%include %include /* Helper functions for Python */ diff --git a/src/bindings/python/bt2/bt2/native_bt_value.i b/src/bindings/python/bt2/bt2/native_bt_value.i index f31a6d44..c04bb7f5 100644 --- a/src/bindings/python/bt2/bt2/native_bt_value.i +++ b/src/bindings/python/bt2/bt2/native_bt_value.i @@ -22,7 +22,6 @@ * THE SOFTWARE. */ -%include %include %{ diff --git a/src/cli/babeltrace2-cfg-cli-args.h b/src/cli/babeltrace2-cfg-cli-args.h index 27ab45d1..d962145b 100644 --- a/src/cli/babeltrace2-cfg-cli-args.h +++ b/src/cli/babeltrace2-cfg-cli-args.h @@ -29,7 +29,7 @@ #include #include "lib/object.h" #include "compat/compiler.h" -#include +#include #include #include "babeltrace2-cfg.h" diff --git a/src/lib/graph/component-class-sink-simple.c b/src/lib/graph/component-class-sink-simple.c index e7ca81b9..f8ac7ad1 100644 --- a/src/lib/graph/component-class-sink-simple.c +++ b/src/lib/graph/component-class-sink-simple.c @@ -27,10 +27,10 @@ #include "common/common.h" #include "lib/assert-pre.h" #include "lib/object.h" -#include -#include +#include #include #include +#include #include #include "component-class-sink-simple.h" diff --git a/src/lib/graph/component-class-sink-simple.h b/src/lib/graph/component-class-sink-simple.h index a6c527de..91c03ed5 100644 --- a/src/lib/graph/component-class-sink-simple.h +++ b/src/lib/graph/component-class-sink-simple.h @@ -25,7 +25,7 @@ #include #include -#include +#include struct simple_sink_init_method_data { bt_graph_simple_sink_component_initialize_func init_func; diff --git a/src/lib/graph/component-class.c b/src/lib/graph/component-class.c index 1c1497db..be0fdf70 100644 --- a/src/lib/graph/component-class.c +++ b/src/lib/graph/component-class.c @@ -28,13 +28,6 @@ #include "lib/assert-pre.h" #include "compat/compiler.h" #include -#include -#include -#include -#include -#include -#include -#include #include #include diff --git a/src/lib/graph/component-class.h b/src/lib/graph/component-class.h index 5974d832..b829672a 100644 --- a/src/lib/graph/component-class.h +++ b/src/lib/graph/component-class.h @@ -26,11 +26,8 @@ * SOFTWARE. */ -#include #include -#include -#include -#include +#include #include "common/macros.h" #include "lib/object.h" #include "common/list.h" diff --git a/src/lib/graph/component-descriptor-set.c b/src/lib/graph/component-descriptor-set.c index e6b0894d..14b6e70d 100644 --- a/src/lib/graph/component-descriptor-set.c +++ b/src/lib/graph/component-descriptor-set.c @@ -30,7 +30,6 @@ #include "common/common.h" #include #include -#include #include #include diff --git a/src/lib/graph/component-filter.c b/src/lib/graph/component-filter.c index e805f8da..5d8e5cab 100644 --- a/src/lib/graph/component-filter.c +++ b/src/lib/graph/component-filter.c @@ -28,8 +28,8 @@ #include "lib/assert-pre.h" #include "compat/compiler.h" #include -#include -#include +#include +#include #include #include "component-filter.h" diff --git a/src/lib/graph/component-filter.h b/src/lib/graph/component-filter.h index 194bab0f..87e5a01a 100644 --- a/src/lib/graph/component-filter.h +++ b/src/lib/graph/component-filter.h @@ -25,7 +25,7 @@ */ #include "common/macros.h" -#include +#include #include "component-class.h" #include "component.h" diff --git a/src/lib/graph/component-sink.c b/src/lib/graph/component-sink.c index 12ea8c27..7a24fed9 100644 --- a/src/lib/graph/component-sink.c +++ b/src/lib/graph/component-sink.c @@ -29,8 +29,8 @@ #include "lib/assert-post.h" #include "compat/compiler.h" #include -#include -#include +#include +#include #include #include "component-sink.h" diff --git a/src/lib/graph/component-sink.h b/src/lib/graph/component-sink.h index c523c770..7aaafc21 100644 --- a/src/lib/graph/component-sink.h +++ b/src/lib/graph/component-sink.h @@ -28,7 +28,7 @@ #include "common/macros.h" #include "compat/compiler.h" -#include +#include #include "component-class.h" #include "component.h" diff --git a/src/lib/graph/component-source.c b/src/lib/graph/component-source.c index 0e3eedc2..1bbb0e73 100644 --- a/src/lib/graph/component-source.c +++ b/src/lib/graph/component-source.c @@ -27,8 +27,8 @@ #include "common/assert.h" #include "lib/assert-pre.h" #include "compat/compiler.h" -#include -#include +#include +#include #include #include "component-source.h" diff --git a/src/lib/graph/component.c b/src/lib/graph/component.c index c771e278..65978e94 100644 --- a/src/lib/graph/component.c +++ b/src/lib/graph/component.c @@ -29,11 +29,8 @@ #include "lib/assert-pre.h" #include "lib/assert-post.h" #include -#include -#include -#include -#include -#include +#include +#include #include "common/macros.h" #include "compat/compiler.h" #include diff --git a/src/lib/graph/component.h b/src/lib/graph/component.h index 531bd63a..0925d5f2 100644 --- a/src/lib/graph/component.h +++ b/src/lib/graph/component.h @@ -25,7 +25,7 @@ */ #include "common/macros.h" -#include +#include #include #include "lib/object.h" #include diff --git a/src/lib/graph/connection.c b/src/lib/graph/connection.c index 743553b9..6552b5f2 100644 --- a/src/lib/graph/connection.c +++ b/src/lib/graph/connection.c @@ -27,7 +27,7 @@ #include "common/assert.h" #include "lib/assert-pre.h" #include "lib/assert-post.h" -#include +#include #include "lib/object.h" #include "compat/compiler.h" #include diff --git a/src/lib/graph/connection.h b/src/lib/graph/connection.h index 2024244d..1d89c993 100644 --- a/src/lib/graph/connection.h +++ b/src/lib/graph/connection.h @@ -24,7 +24,7 @@ * SOFTWARE. */ -#include +#include #include "lib/object.h" #include "common/assert.h" #include "common/macros.h" diff --git a/src/lib/graph/graph.c b/src/lib/graph/graph.c index 9e7e8ffc..b545a8ef 100644 --- a/src/lib/graph/graph.c +++ b/src/lib/graph/graph.c @@ -28,16 +28,13 @@ #include "lib/assert-pre.h" #include "lib/assert-post.h" #include -#include -#include -#include -#include +#include +#include #include "lib/graph/message/message.h" #include "compat/compiler.h" #include "common/common.h" #include #include -#include #include "lib/value.h" #include #include diff --git a/src/lib/graph/graph.h b/src/lib/graph/graph.h index 7e927e7a..7fffd0ca 100644 --- a/src/lib/graph/graph.h +++ b/src/lib/graph/graph.h @@ -30,7 +30,7 @@ #endif #include -#include +#include #include "common/macros.h" #include "lib/object.h" #include "lib/object-pool.h" diff --git a/src/lib/graph/iterator.c b/src/lib/graph/iterator.c index 5b2ebfbd..0beb6949 100644 --- a/src/lib/graph/iterator.c +++ b/src/lib/graph/iterator.c @@ -29,30 +29,21 @@ #include "lib/trace-ir/clock-class.h" #include "lib/trace-ir/clock-snapshot.h" #include -#include +#include #include "lib/trace-ir/event.h" -#include +#include #include "lib/trace-ir/packet.h" #include "lib/trace-ir/stream.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include #include -#include +#include #include #include "common/assert.h" #include "lib/assert-pre.h" diff --git a/src/lib/graph/message/discarded-items.c b/src/lib/graph/message/discarded-items.c index 0b19abc3..e7646377 100644 --- a/src/lib/graph/message/discarded-items.c +++ b/src/lib/graph/message/discarded-items.c @@ -34,10 +34,6 @@ #include "lib/trace-ir/stream.h" #include "lib/property.h" #include "lib/graph/message/message.h" -#include -#include -#include -#include #include "discarded-items.h" diff --git a/src/lib/graph/message/discarded-items.h b/src/lib/graph/message/discarded-items.h index d9f3fb60..915cac16 100644 --- a/src/lib/graph/message/discarded-items.h +++ b/src/lib/graph/message/discarded-items.h @@ -27,7 +27,7 @@ #include "lib/trace-ir/clock-snapshot.h" #include "lib/trace-ir/stream.h" #include "lib/property.h" -#include +#include #include "message.h" diff --git a/src/lib/graph/message/event.c b/src/lib/graph/message/event.c index 8b211e10..0f7a8a0a 100644 --- a/src/lib/graph/message/event.c +++ b/src/lib/graph/message/event.c @@ -36,8 +36,7 @@ #include #include "lib/trace-ir/clock-snapshot.h" #include "lib/graph/graph.h" -#include -#include +#include #include #include #include diff --git a/src/lib/graph/message/iterator.h b/src/lib/graph/message/iterator.h index 68bdc833..f6e642b4 100644 --- a/src/lib/graph/message/iterator.h +++ b/src/lib/graph/message/iterator.h @@ -26,8 +26,8 @@ #include "common/macros.h" #include "lib/object.h" -#include -#include +#include +#include #include #include "common/assert.h" #include diff --git a/src/lib/graph/message/message-iterator-inactivity.c b/src/lib/graph/message/message-iterator-inactivity.c index d0c27e3d..1754f385 100644 --- a/src/lib/graph/message/message-iterator-inactivity.c +++ b/src/lib/graph/message/message-iterator-inactivity.c @@ -29,8 +29,7 @@ #include #include "lib/trace-ir/clock-snapshot.h" #include "lib/graph/message/message.h" -#include -#include +#include #include "message-iterator-inactivity.h" diff --git a/src/lib/graph/message/message-iterator-inactivity.h b/src/lib/graph/message/message-iterator-inactivity.h index 6e8c1fdd..942a7980 100644 --- a/src/lib/graph/message/message-iterator-inactivity.h +++ b/src/lib/graph/message/message-iterator-inactivity.h @@ -25,7 +25,7 @@ #include #include "lib/trace-ir/clock-snapshot.h" -#include +#include struct bt_message_message_iterator_inactivity { struct bt_message parent; diff --git a/src/lib/graph/message/message.c b/src/lib/graph/message/message.c index 5d1d8139..98d2eab2 100644 --- a/src/lib/graph/message/message.c +++ b/src/lib/graph/message/message.c @@ -27,7 +27,7 @@ #include "common/assert.h" #include "lib/assert-pre.h" #include "lib/assert-post.h" -#include +#include #include "lib/graph/message/message.h" #include "lib/graph/graph.h" @@ -37,7 +37,6 @@ void bt_message_init(struct bt_message *message, bt_object_release_func release, struct bt_graph *graph) { - BT_ASSERT(type >= 0 && type <= BT_MESSAGE_TYPE_DISCARDED_PACKETS); message->type = type; bt_object_init_shared(&message->base, release); message->graph = graph; diff --git a/src/lib/graph/message/message.h b/src/lib/graph/message/message.h index f290e3fd..ec7d2a6c 100644 --- a/src/lib/graph/message/message.h +++ b/src/lib/graph/message/message.h @@ -33,7 +33,7 @@ #include "lib/object.h" #include "common/assert.h" #include -#include +#include #include #include "lib/object-pool.h" #include diff --git a/src/lib/graph/message/packet.c b/src/lib/graph/message/packet.c index 125e49f6..6798fe51 100644 --- a/src/lib/graph/message/packet.c +++ b/src/lib/graph/message/packet.c @@ -36,10 +36,7 @@ #include "lib/trace-ir/stream.h" #include "lib/trace-ir/stream-class.h" #include "lib/graph/graph.h" -#include -#include -#include -#include +#include #include "common/assert.h" #include "lib/object.h" #include diff --git a/src/lib/graph/message/stream.c b/src/lib/graph/message/stream.c index 40903d00..1ecb452f 100644 --- a/src/lib/graph/message/stream.c +++ b/src/lib/graph/message/stream.c @@ -26,14 +26,11 @@ #include "lib/assert-pre.h" #include "compat/compiler.h" -#include +#include #include "lib/trace-ir/stream.h" #include #include "lib/trace-ir/stream-class.h" -#include -#include -#include -#include +#include #include "common/assert.h" #include diff --git a/src/lib/graph/message/stream.h b/src/lib/graph/message/stream.h index ed5d2816..6f261b05 100644 --- a/src/lib/graph/message/stream.h +++ b/src/lib/graph/message/stream.h @@ -24,7 +24,7 @@ * SOFTWARE. */ -#include +#include #include "compat/compiler.h" #include "lib/trace-ir/stream.h" diff --git a/src/lib/graph/mip.c b/src/lib/graph/mip.c index a4704c5d..27da722f 100644 --- a/src/lib/graph/mip.c +++ b/src/lib/graph/mip.c @@ -28,7 +28,7 @@ #include #include #include -#include +#include #include "common/assert.h" #include "compat/compiler.h" diff --git a/src/lib/graph/port.c b/src/lib/graph/port.c index 7ca86abe..46735e22 100644 --- a/src/lib/graph/port.c +++ b/src/lib/graph/port.c @@ -26,12 +26,8 @@ #include "common/assert.h" #include "lib/assert-pre.h" -#include -#include -#include +#include #include -#include -#include #include "lib/object.h" #include "compat/compiler.h" diff --git a/src/lib/graph/port.h b/src/lib/graph/port.h index 5ab27774..2592705e 100644 --- a/src/lib/graph/port.h +++ b/src/lib/graph/port.h @@ -24,7 +24,7 @@ * SOFTWARE. */ -#include +#include #include "common/macros.h" struct bt_port { diff --git a/src/lib/graph/query-executor.c b/src/lib/graph/query-executor.c index bc6f542a..e922d3ea 100644 --- a/src/lib/graph/query-executor.c +++ b/src/lib/graph/query-executor.c @@ -27,11 +27,10 @@ #include "common/common.h" #include "lib/assert-pre.h" #include "lib/assert-post.h" -#include #include #include +#include #include -#include #include "lib/object.h" #include "compat/compiler.h" diff --git a/src/lib/plugin/plugin-so.c b/src/lib/plugin/plugin-so.c index ebdbf823..3684acae 100644 --- a/src/lib/plugin/plugin-so.c +++ b/src/lib/plugin/plugin-so.c @@ -32,9 +32,6 @@ #include #include "lib/graph/component-class.h" #include -#include -#include -#include #include #include "common/list.h" #include diff --git a/src/lib/plugin/plugin.c b/src/lib/plugin/plugin.c index 16850d80..838ceeff 100644 --- a/src/lib/plugin/plugin.c +++ b/src/lib/plugin/plugin.c @@ -31,9 +31,9 @@ #include "common/macros.h" #include "compat/compiler.h" #include "common/common.h" -#include -#include -#include +#include +#include +#include #include "lib/graph/component-class.h" #include #include diff --git a/src/lib/plugin/plugin.h b/src/lib/plugin/plugin.h index b91adf4b..5f8e6b11 100644 --- a/src/lib/plugin/plugin.h +++ b/src/lib/plugin/plugin.h @@ -27,7 +27,7 @@ #include "common/macros.h" #include "common/common.h" #include "lib/graph/component-class.h" -#include +#include #include #include "lib/object.h" #include diff --git a/src/lib/trace-ir/attributes.c b/src/lib/trace-ir/attributes.c index 986ee383..fffedc3b 100644 --- a/src/lib/trace-ir/attributes.c +++ b/src/lib/trace-ir/attributes.c @@ -28,7 +28,7 @@ #include #include "lib/assert-pre.h" #include "lib/object.h" -#include +#include #include "lib/value.h" #include "attributes.h" #include diff --git a/src/lib/trace-ir/clock-class.c b/src/lib/trace-ir/clock-class.c index 736e0b8e..8a3640bc 100644 --- a/src/lib/trace-ir/clock-class.c +++ b/src/lib/trace-ir/clock-class.c @@ -26,7 +26,6 @@ #include "lib/assert-pre.h" #include "common/uuid.h" -#include #include #include "clock-class.h" #include "clock-snapshot.h" diff --git a/src/lib/trace-ir/clock-snapshot.c b/src/lib/trace-ir/clock-snapshot.c index 19aab80a..9d20c9c1 100644 --- a/src/lib/trace-ir/clock-snapshot.c +++ b/src/lib/trace-ir/clock-snapshot.c @@ -27,7 +27,7 @@ #include "common/uuid.h" #include "clock-class.h" #include "clock-snapshot.h" -#include +#include #include "compat/compiler.h" #include #include "compat/string.h" diff --git a/src/lib/trace-ir/event-class.c b/src/lib/trace-ir/event-class.c index 22211cd1..20b8850d 100644 --- a/src/lib/trace-ir/event-class.c +++ b/src/lib/trace-ir/event-class.c @@ -27,7 +27,6 @@ #include "lib/assert-pre.h" #include #include -#include #include #include "compat/compiler.h" #include "compat/endian.h" diff --git a/src/lib/trace-ir/event.c b/src/lib/trace-ir/event.c index ed2e2f84..d110aed8 100644 --- a/src/lib/trace-ir/event.c +++ b/src/lib/trace-ir/event.c @@ -25,10 +25,9 @@ #include "lib/logging.h" #include "lib/assert-pre.h" -#include +#include #include #include -#include #include #include #include "common/assert.h" diff --git a/src/lib/trace-ir/field-class.c b/src/lib/trace-ir/field-class.c index e036cfae..b4a54266 100644 --- a/src/lib/trace-ir/field-class.c +++ b/src/lib/trace-ir/field-class.c @@ -26,8 +26,6 @@ #include "lib/assert-pre.h" #include -#include -#include #include #include #include "lib/object.h" diff --git a/src/lib/trace-ir/field-path.c b/src/lib/trace-ir/field-path.c index 4e5b16f7..d91db38b 100644 --- a/src/lib/trace-ir/field-path.c +++ b/src/lib/trace-ir/field-path.c @@ -26,7 +26,7 @@ #include "lib/assert-pre.h" #include -#include +#include #include #include #include diff --git a/src/lib/trace-ir/field-path.h b/src/lib/trace-ir/field-path.h index 99c8f958..cda0ba2d 100644 --- a/src/lib/trace-ir/field-path.h +++ b/src/lib/trace-ir/field-path.h @@ -27,7 +27,7 @@ */ #include "lib/object.h" -#include +#include #include "common/assert.h" #include "common/macros.h" #include diff --git a/src/lib/trace-ir/field.c b/src/lib/trace-ir/field.c index 9ab11aac..c53d7faf 100644 --- a/src/lib/trace-ir/field.c +++ b/src/lib/trace-ir/field.c @@ -26,7 +26,6 @@ #include "lib/assert-pre.h" #include -#include #include "lib/object.h" #include "compat/compiler.h" #include "compat/fcntl.h" diff --git a/src/lib/trace-ir/packet.c b/src/lib/trace-ir/packet.c index 50304868..388e196f 100644 --- a/src/lib/trace-ir/packet.c +++ b/src/lib/trace-ir/packet.c @@ -24,7 +24,6 @@ #include "lib/logging.h" #include "lib/assert-pre.h" -#include #include #include #include diff --git a/src/lib/trace-ir/packet.h b/src/lib/trace-ir/packet.h index e2d825c6..cf3d80c7 100644 --- a/src/lib/trace-ir/packet.h +++ b/src/lib/trace-ir/packet.h @@ -25,7 +25,7 @@ #include #include "common/assert.h" -#include +#include #include #include #include diff --git a/src/lib/trace-ir/resolve-field-path.c b/src/lib/trace-ir/resolve-field-path.c index 9e8e4729..d92a7f3d 100644 --- a/src/lib/trace-ir/resolve-field-path.c +++ b/src/lib/trace-ir/resolve-field-path.c @@ -25,7 +25,7 @@ #include "lib/assert-pre.h" #include "common/assert.h" -#include +#include #include #include #include diff --git a/src/lib/trace-ir/resolve-field-path.h b/src/lib/trace-ir/resolve-field-path.h index 92e277b8..f44ef858 100644 --- a/src/lib/trace-ir/resolve-field-path.h +++ b/src/lib/trace-ir/resolve-field-path.h @@ -28,8 +28,8 @@ #include "common/macros.h" #include "lib/object.h" -#include -#include +#include +#include #include struct bt_resolve_field_path_context { diff --git a/src/lib/trace-ir/stream-class.c b/src/lib/trace-ir/stream-class.c index e580b2a9..e402f415 100644 --- a/src/lib/trace-ir/stream-class.c +++ b/src/lib/trace-ir/stream-class.c @@ -25,7 +25,7 @@ #include "lib/logging.h" #include "lib/assert-pre.h" -#include +#include #include "compat/compiler.h" #include "common/align.h" #include "compat/endian.h" diff --git a/src/lib/trace-ir/stream.c b/src/lib/trace-ir/stream.c index c35b9da9..18e8d093 100644 --- a/src/lib/trace-ir/stream.c +++ b/src/lib/trace-ir/stream.c @@ -25,7 +25,6 @@ #include "lib/logging.h" #include "lib/assert-pre.h" -#include #include #include #include diff --git a/src/lib/trace-ir/trace-class.c b/src/lib/trace-ir/trace-class.c index 15330099..593f390e 100644 --- a/src/lib/trace-ir/trace-class.c +++ b/src/lib/trace-ir/trace-class.c @@ -27,13 +27,11 @@ #include "lib/assert-pre.h" #include "lib/assert-post.h" #include -#include #include #include "ctf-writer/functor.h" #include "ctf-writer/clock.h" #include "compat/compiler.h" #include -#include #include "lib/value.h" #include #include "compat/endian.h" diff --git a/src/lib/trace-ir/trace.c b/src/lib/trace-ir/trace.c index 57ebf67b..688a113e 100644 --- a/src/lib/trace-ir/trace.c +++ b/src/lib/trace-ir/trace.c @@ -27,13 +27,11 @@ #include "lib/assert-pre.h" #include "lib/assert-post.h" #include -#include #include #include "ctf-writer/functor.h" #include "ctf-writer/clock.h" #include "compat/compiler.h" #include -#include #include "lib/value.h" #include #include "compat/endian.h" diff --git a/src/plugins/lttng-utils/debug-info/trace-ir-mapping.c b/src/plugins/lttng-utils/debug-info/trace-ir-mapping.c index 1b88e0f1..8faff7bc 100644 --- a/src/plugins/lttng-utils/debug-info/trace-ir-mapping.c +++ b/src/plugins/lttng-utils/debug-info/trace-ir-mapping.c @@ -32,8 +32,6 @@ #include "common/assert.h" #include -/* For bt_property_availability */ -#include #include "debug-info.h" #include "trace-ir-data-copy.h" diff --git a/src/python-plugin-provider/python-plugin-provider.c b/src/python-plugin-provider/python-plugin-provider.c index 71bedfc3..5d8d8b65 100644 --- a/src/python-plugin-provider/python-plugin-provider.c +++ b/src/python-plugin-provider/python-plugin-provider.c @@ -31,10 +31,10 @@ #include "common/macros.h" #include "compat/compiler.h" -#include +#include #include "lib/plugin/plugin.h" #include -#include +#include #include "lib/graph/component-class.h" #include "py-common/py-common.h" #include -- 2.34.1