X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=include%2Fbabeltrace2%2Fgraph%2Fport.h;fp=include%2Fbabeltrace2%2Fgraph%2Fport.h;h=5567d04db9be9b7777f441c86b5adbd574850c8b;hb=43c59509042845f8d42c3e99ec74d45fa2dc0908;hp=0000000000000000000000000000000000000000;hpb=1cda4ff4025e4b3f7bd2a861baa51d2113c4cbf9;p=babeltrace.git 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 */