Files
qt6-migration-pipeline/external/tmsif/include/dds/ddsc/dds_psmx.h
T
2026-10-23 16:13:31 +00:00

691 lines
30 KiB
C

// Copyright(c) 2023 ZettaScale Technology and others
//
// This program and the accompanying materials are made available under the
// terms of the Eclipse Public License v. 2.0 which is available at
// http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
// v. 1.0 which is available at
// http://www.eclipse.org/org/documents/edl-v10.php.
//
// SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
/**
* @defgroup psmx (Publish Subscribe Message Exchange)
* @ingroup dds
*
* OVERVIEW
* ========
*
* The Publish Subscribe Message Exchange (PSMX) interface provides support for
* off-loading data communication from the network stack of Cyclone to arbitrary pub-sub
* transport implementations.[^1] This section provides an overview of the structure and
* introduces some terminology, details on specific operations are provided at the
* definitions of those operations.
*
* A Cyclone DDS Domain consists of a plurality of DDS Domain Entities, which are the
* representations of the DDS Domain in a specific process.
*
* A PSMX Plugin provides an implementation of the PSMX interface, allowing the
* instantiation of a PSMX Instance to establish a connection between a DDS Domain Entity
* and a PSMX Domain. The PSMX Plugin is specified as a library and a PSMX Instance Name.
* The library is loaded in the process and a constructor function provided by the library
* is invoked to create and initialize a PSMX Instance given the PSMX Instance Name (and a
* configuration string). In principle a specific library may be configured multiple
* times in a single DDS Domain.
*
* The PSMX Instance Name is assumed to uniquely identify the PSMX Domain in the DDS
* Domain. From the PSMX Instance Name, a numeric PSMX Instance ID is derived that
* uniquely identifies the PSMX Domain within the DDS Domain Entity and is assumed to
* uniquely identify the PSMX Domain in the DDS Domain.[^2]
*
* Each PSMX Instance chooses a 16-byte PSMX Locator[^3] such that any pair of instances
* with the same PSMX Locator communicate, and any pair with different locators do not
* communicate.[^4]
*
* DDS Topics, DDS Readers and DDS Writers are mapped to corresponding objects in PSMX
* Instances. For DDS Readers and DDS Writers, the application can restrict the set of
* PSMX Instances for which the mapping is created using the "PSMX Instances" QoS setting,
* and the PSMX Instances can refuse mapping based on type and QoS information.
*
* DDS Topic Entities are representations of the topics in the DDS Domain, such that two
* identical definitions of a topic in a DDS Domain Entity give rise to two
* application-level DDS Topic Entities, but only to a single topic in the DDS Domain
* Entity and thus also only one PSMX Topic object per PSMX Instance.
*
* Each DDS Reader/Writer is mapped to a set of PSMX Reader/Writer Endpoints, one for each
* PSMX Instance in the "PSMX Instances" QoS that accepts the type and reader/writer QoS.
* An associated set of PSMX Domains consisting of the PSMX Domains for which PSMX
* Reader/Writer Endpoints have been created is assumed to exist.
*
* The PSMX Domain is assumed to deliver data published by the PSMX Writer associated with
* DDS Writer X to all PSMX Readers associated with the DDS Readers Ys that match X[^5],
* optionally excluding DDS Readers in the same Domain Entity as X. It is assumed to not
* deliver data to other DDS Readers in the DDS Domain. It is assumed to do this with a
* quality of service compatible with the DDS QoS.
*
* Readers associated with DDS Readers in the same DDS Domain Entity.
*
* If the intersection of the sets of PSMX Domains of a DDS Reader and a DDS Writer in a
* DDS Domain:
*
* - is empty, off-loading data transfer to PSMX (for this pair) is not possible;
*
* - contains one instance, that PSMX Domain is eligible for off-loading data transfer;
*
* - contains multiple instances, the configuration is invalid.
*
* If an eligible PSMX Domain exists and the PSMX Locators for the corresponding two PSMX
* Instances are the same, then PSMX is used to transfer data.
*
* The PSMX objects are represented in the interface as pointers to "dds_psmx",
* "dds_psmx_topic", "dds_psmx_endpoint". The PSMX Plugin is responsible for allocating
* and freeing these. It is expected that the PSMX Plugin internally uses an extended
* version of these types to store any additional data it needs. E.g., a hypothetical
* "weed" PSMX Plugin could do:
*
* struct psmx_weed {
* struct dds_psmx c;
* weed_root *x;
* };
*
* The creator function mentioned above is required to be called NAME_create_psmx, where
* NAME is the value of the "name" attribute of the PubSubMessageExchange interface
* configuration element. It must have the following signature:
*
* dds_return_t NAME_create_psmx (
* struct dds_psmx **psmx_instance,
* dds_psmx_instance_id_t identifier,
* const char *config)
*
* Where
*
* *psmx_instance must be set point to a new PSMX Instance on success and may be left
* undefined on error
* identifier contains the numeric PSMX Instance ID
* config the PSMX configuration from the "config" attribute of the
* PubSubMessageExchange interface configuration element.
*
* The "config" argument is a contiguous sequence of characters terminated by the first
* double-\0. Each \0-terminated character sequence is a string that consists of
* KEY=VALUE pairs, where each K-V pair is terminated by a semicolon.
*
* If the configuration string as set in Cyclone DDS configuration contains a
* "INSTANCE_NAME" key, its value is used as the PSMX Instance Name. If the key is not
* included, the value of the "name" attribute of the corresponding PubSubMessageExchange
* element in configuration is used as the PSMX Instance Name. In all cases, looking up
* the "INSTANCE_NAME" key in the configuration string using @ref
* dds_psmx_get_config_option_value will return the PSMX Instance Name as its value.
*
* The behaviour of the constructor function is dependent on the interface version it
* implements:
*
* - For version 0, it is responsible for setting:
*
* - ops to the addresses of the various functions implementing the operations
* - instance_name to a "dds_alloc" allocated string
* - instance_id to the "identifier" argument
*
* and for zero-initializing the other fields. At some point after this initialization,
* and once it is prepared to handle the "get_node_id" operation, it must invoke the
* "dds_psmx_init_generic" to complete the initialization.
*
* - For version 1, it is responsible for setting:
*
* - ops
*
* All other fields will be initialized by the Cyclone DDS after succesful return and
* the "get_node_id" operation also will be invoked after the constructor returned.
*
* Whether the plugin implements version 0 or version 1 of the interface is controlled by
* the function pointers in "dds_psmx_ops_t". If "create_topic" and "deinit" are
* non-null, it is version 0; if both are null it is version 1. Neither
* "create_topic_type" nor "delete_psmx" is touched by Cyclone DDS if the interface is
* version 0, allowing for binary backwards compatibility.
*
* -- Footnotes: --
*
* [^1]: In particular including shared-memory based mechanisms.
*
* [^2]: Internally, the name is not used for anything other than the generation of the
* numeric id.
*
* [^3]: Confusingly named "node identifier" in the interface, even though it has nothing
* to do with the numeric PSMX Domain identifier.
*
* [^4]: This typically matches a machine when the transport is shared memory.
*
* [^5]: That is, the matching rules between Readers and Writers defined in the DDS
* specification.
*/
#ifndef DDS_PSMX_H
#define DDS_PSMX_H
#include "dds/export.h"
#include "dds/dds.h"
#include "dds/ddsc/dds_loaned_sample.h"
#include "dds/ddsc/dds_data_type_properties.h"
#include "dds/ddsrt/dynlib.h"
#if defined (__cplusplus)
extern "C" {
#endif
#define DDS_MAX_PSMX_INSTANCES 8 // No particular reason for this specific number, except that it's probably enough, usually.
struct dds_psmx;
struct dds_psmx_topic;
struct dds_psmx_endpoint;
struct ddsi_type;
/** @brief Type of the PSMX endpoint
* @ingroup psmx
*
* The PSMX interface distinguishes between readers and writers, and in some cases needs
* to specify that an operation applies to both or neither (depending on context).
* "Reader" and "writer" here are used as in DDS, outside the DDS context these often are
* known as subscribers and publishers.
*/
typedef enum dds_psmx_endpoint_type {
DDS_PSMX_ENDPOINT_TYPE_UNSET, /**< inapplicable or applies to both */
DDS_PSMX_ENDPOINT_TYPE_READER, /**< applies to reader only */
DDS_PSMX_ENDPOINT_TYPE_WRITER /**< applies to writer only */
} dds_psmx_endpoint_type_t;
/** @brief The numeric PSMX Instance ID
* @ingroup psmx
*/
typedef uint32_t dds_psmx_instance_id_t;
/**
* @brief Flags for identifying features supported by a PSMX implementation
*/
#define DDS_PSMX_FEATURE_SHARED_MEMORY 1ul << 0 /**< Uses shared memory */
#define DDS_PSMX_FEATURE_ZERO_COPY 1ul << 1 /**< Supports zero-copy */
typedef uint32_t dds_psmx_features_t;
/**
* @brief Describes the data which is transferred in addition to the application data
* @ingroup psmx
*
* All fields are filled in by Cyclone DDS during the write prior to handing it to the
* PSMX plug-in. The plug-in is only required to pass the contents to Cyclone DDS on the
* receiving side.
*/
typedef struct dds_psmx_metadata {
dds_loaned_sample_state_t sample_state; /**< Representation of this sample/key */
dds_loan_data_type_t data_type; /**< Reserved, must be 0 */
dds_psmx_instance_id_t instance_id; /**< PSMX instance id for this sample */
uint32_t sample_size; /**< Size of payload */
dds_guid_t guid; /**< GUID of original writer */
dds_time_t timestamp; /**< Source timestamp of DDS sample */
uint32_t statusinfo; /**< DDSI status info (write/dispose/unregister) */
uint16_t cdr_identifier; /**< CDR encoding (DDSI_RTPS_SAMPLE_NATIVE if not serialized) */
uint16_t cdr_options; /**< CDR options field (0 if not serialized) */
} dds_psmx_metadata_t;
/**
* @brief PSMX Locator
* @ingroup psmx
*/
typedef struct dds_psmx_node_identifier {
uint8_t x[16];
} dds_psmx_node_identifier_t;
/**
* @brief Definition of the function checking support for type and QoS
* @ingroup psmx
*
* A PSMX Instance in the "PSMX Instances" QoS may accept or reject a given DDS
* Topic/Reader/Writer based on information on the type and the QoS settings. PSMX
* Instances not in the "PSMX Instances" QoS setting are not asked.
*
* @param[in] psmx_instance The PSMX Instance
* @param[in] forwhat Whether for a topic/writer/reader (UNSET if topic)
* @param[in] data_type_props Data type properties (see there)
* @param[in] qos QoS of the DDS topic
* @returns True if the PSMX Instance is willing to handle this DDS entity, false otherwise
*/
typedef bool (*dds_psmx_type_qos_supported_fn) (struct dds_psmx *psmx_instance, dds_psmx_endpoint_type_t forwhat, dds_data_type_properties_t data_type_props, const struct dds_qos *qos);
/**
* @brief Definition of the function for creating a PSMX Topic (interface version 1)
* @ingroup psmx
*
* Definition for a function that is called to construct a new PSMX Topic in a PSMX Instance
* representing a new topic in the DDS Domain Entity.
*
* The PSMX Plugin is expected to represent a PSMX Topic using an extended version of the
* `dds_psmx_topic` structure.
*
* If `type_definition` is not a null pointer, it points into the Cyclone type library. A
* (default, C) serializer can be constructed using `ddsi_topic_descriptor_from_type`,
* an XTypes TypeObject using `ddsi_type_get_typeobj`.
*
* If the function returns failure, creation of the DDS Entity fails.
*
* @param[in] psmx_instance The PSMX instance.
* @param[in] topic_name The name of the topic to create
* @param[in] type_name The name of the DDS data type for this topic
* @param[in] data_type_props The data type properties for the topic's data type.
* @param[in] type_definition Optional pointer to type definition in type library.
* @param[in] sizeof_type In-memory size of a single instance of the type, 0 if unknown.
* @returns A new PSMX Topic structure, or NULL on error
*/
typedef struct dds_psmx_topic * (*dds_psmx_create_topic_with_type_fn) (
struct dds_psmx *psmx_instance,
const char *topic_name,
const char *type_name,
dds_data_type_properties_t data_type_props,
const struct ddsi_type *type_definition,
uint32_t sizeof_type);
/**
* @brief Definition of the function for destructing and freeing a PSMX Topic
* @ingroup psmx
*
* Definition for a function that is called on deleting the topic in the DDS Domain.
* Called exactly once for each successful invocation of `dds_psmx_create_topic`/
* `dds_psmx_create_topic_with_type`, all PSMX Endpoints related to this PSMX Topic will have
* been destructed prior to calling this function.
*
* If the PSMX Topic was created using `dds_psmx_create_topic`, the PSMX Plugin is
* required to call `dds_psmx_cleanup_topic_generic` and to do so prior to invalidating
* the memory associated with the PSMX Topic and releasing any memory allocated for it
* during construction.
*
* @param[in] psmx_topic The PSMX Topic to destruct
* @returns A DDS return code, should be DDS_RETCODE_OK.
*/
typedef dds_return_t (*dds_psmx_delete_topic_fn) (struct dds_psmx_topic *psmx_topic);
/**
* @brief Definition of the function for creating a PSMX Topic (interface version 0)
* @ingroup psmx
*
* Equivalent to `dds_psmx_create_topic_type` with `type_definition` and `sizeof_type`
* a null pointer and 0, respectively. It is required to initialize the generic fields using
* `dds_psmx_topic_init_generic`.
*
* @param[in] psmx_instance The PSMX instance.
* @param[in] topic_name The name of the topic to create
* @param[in] type_name The name of the DDS data type for this topic
* @param[in] data_type_props The data type properties for the topic's data type.
* @returns A new PSMX Topic structure, or NULL on error
*/
typedef struct dds_psmx_topic * (*dds_psmx_create_topic_fn) (
struct dds_psmx * psmx_instance,
const char * topic_name,
const char * type_name,
dds_data_type_properties_t data_type_props);
/**
* @brief Definition of the function for destructing and freeing a PSMX Instance (interface version 1)
* @ingroup psmx
*
* Function called on shutdown of a DDS Domain Entity, before unloading the PSMX Plugin
* and after all other operations have completed and all objects created in the PSMX
* Instance have been destructed using the various "delete" functions.
*
* The PSMX Plugin is required to call `dds_psmx_fini` and to do so prior to
* invalidating the memory associated with the PSMX Instance and releasing any memory
* allocated for it during construction.
*
* @param[in] psmx_instance The PSMX Instance to de-initialize
*/
typedef void (*dds_psmx_delete_fn) (struct dds_psmx *psmx_instance);
/**
* @brief Definition of the function for destructing and freeing a PSMX Instance (interface version 0)
* @ingroup psmx
*
* Function called on shutdown of a DDS Domain Entity, before unloading the PSMX Plugin
* and after all other operations have completed and all objects created in the PSMX
* Instance have been destructed using the various "delete" functions.
*
* The PSMX Plugin is required to call `dds_psmx_cleanup_generic` and to do so prior to
* invalidating the memory associated with the PSMX Instance and releasing any memory
* allocated for it during construction.
*
* @param[in] psmx_instance The PSMX Instance to de-initialize
* @returns A DDS return code, should be DDS_RETCODE_OK.
*/
typedef dds_return_t (*dds_psmx_deinit_fn) (struct dds_psmx *psmx_instance);
/**
* @brief Definition of the function returning the PSMX Locator
* @ingroup psmx
*
* All PSMX Instances that can communicate must return the same PSMX Locator, PSMX
* Instances that do not communicate must return different PSMX Locators.
*
* The function may be called by `dds_psmx_init_generic`.
*
* @param[in] psmx_instance A PSMX Instance
* @returns The PSMX Locator for this PSMX Instance
*/
typedef dds_psmx_node_identifier_t (*dds_psmx_get_node_identifier_fn) (const struct dds_psmx *psmx_instance);
/**
* @brief Definition of the function to query the features supported by the PSMX Instance
* @ingroup psmx
*
* Returns an integer with the flags set for the features that are supported by the
* provided PSMX Instance.
*
* @param[in] psmx_instance A PSMX instance
* @returns The set of features supported by this PSMX instance
*/
typedef dds_psmx_features_t (*dds_psmx_supported_features_fn) (const struct dds_psmx *psmx_instance);
/**
* @brief Table of pointers to functions operating on a PSMX Instance
* @ingroup psmx
*/
typedef struct dds_psmx_ops {
dds_psmx_type_qos_supported_fn type_qos_supported;
dds_psmx_create_topic_fn create_topic; /**< non-null for interface version 0, null for version 1 */
dds_psmx_delete_topic_fn delete_topic;
dds_psmx_deinit_fn deinit; /**< non-null for interface version 0, null for version 1 */
dds_psmx_get_node_identifier_fn get_node_id;
dds_psmx_supported_features_fn supported_features;
dds_psmx_create_topic_with_type_fn create_topic_with_type; /**< undefined for interface version 0, non-null for version 1 */
dds_psmx_delete_fn delete_psmx; /**< undefined for interface version 0, non-null for version 1 */
} dds_psmx_ops_t;
/**
* @brief Definition of the function for constructing a PSMX Endpoint for a PSMX Topic
* @ingroup psmx
*
* @param[in] psmx_topic The PSMX Topic to create the PSMX Endpoint for
* @param[in] qos QoS of the corresponding DDS endpoint
* @param[in] endpoint_type The type of endpoint to create, either READER or WRITER
* @returns A new PSMX Endpoint or a null pointer on error
*/
typedef struct dds_psmx_endpoint * (*dds_psmx_create_endpoint_fn) (struct dds_psmx_topic *psmx_topic, const struct dds_qos *qos, dds_psmx_endpoint_type_t endpoint_type);
/**
* @brief Definition of the function for destructing a PSMX Endpoint
* @ingroup psmx
*
* Called after the last operation on the PSMX Endpoint has completed and no further
* operations will be invoked; called prior to destructing the PSMX Topic.
*
* @param[in] psmx_endpoint The PSMX Endpoint to be destructed
* @returns a DDS return code, should be DDS_RETCODE_OK
*/
typedef dds_return_t (*dds_psmx_delete_endpoint_fn) (struct dds_psmx_endpoint *psmx_endpoint);
/**
* @brief Table of pointers to functions operating on a PSMX Topic
* @ingroup psmx
*/
typedef struct dds_psmx_topic_ops {
dds_psmx_create_endpoint_fn create_endpoint;
dds_psmx_delete_endpoint_fn delete_endpoint;
} dds_psmx_topic_ops_t;
/**
* @brief Definition of the function for requesting a loan from a PSMX Writer
* @ingroup psmx
*
* The PSMX Instance is the owner of the loan and implements the allocation and the
* freeing of the memory for the `dds_loaned_sample_t`, the `dds_psmx_metadata_t` it
* references and the payload it references.
*
* The `dds_loaned_sample_t` is reference counted and the free function referenced through
* the "ops" table is invoked once the reference count drops to 0.
*
* The PSMX Plugin is required to properly initialize all fields:
*
* - ops
* - metadata, the contents of the memory it points to may be undefined
* - sample_ptr, the contents of the memory it points to may be undefined
*
* The loan_origin and refc fields are set by Cyclone DDS following a succesful return.
*
* The `sample_ptr` in the Loaned Sample must point to a unique memory block of at least
* `size_requested` bytes and be suitably aligned to directly store any of the types in
* application-representation to which the various supported IDL types map.
*
* `size_requested` is equal to `sizeof_type` in the PSMX create topic call if:
* - the loan is to be used for a raw sample (implies `IS_MEMCPY_SAFE` set in the type properties)
* - `sizeof_type` was non-0 in the call to create the PSMX Topic
*
* @param[in] psmx_endpoint The PSMX Writer to borrow from
* @param[in] size_requested The size of the loan requested in bytes
* @returns A pointer to the Loaned Sample on success or a null pointer on failure
*/
typedef dds_loaned_sample_t * (*dds_psmx_endpoint_request_loan_fn) (struct dds_psmx_endpoint *psmx_endpoint, uint32_t size_requested);
/**
* @brief Definition of function for writing data via a PSMX Writer
* @ingroup psmx
*
* The PSMX Plugin is expected to publish the payload and the metadata of the Loaned
* Sample via the PSMX Instance to its subscribers as described in the overview. The
* Loaned Sample:
*
* - originated in a successful request for a loan from this PSMX Instance;
* - has the metadata and payload set correctly;
* - has a metadata state that is not `UNINITIALIZED`.
*
* Cyclone DDS assumes:
*
* - that the `dds_loaned_sample_t` outlives the PSMX write operation
* - that the `sample_ptr` and `metadata` are invalidated by the PSMX write operation
*
* and will consequently not touch the `sample_ptr` and `metadata` after the operation and
* only invoke the Loaned Sample's `free` function.
*
* If the operations fails and returns an error, the DDS write (or write-like) operation
* that caused it will report an error to the application. It is unspecified whether or
* not any other deliver paths may or may not have been provided with the data when this
* happens.
*
* @param[in] psmx_endpoint The PSMX Writer to publish the data on
* @param[in] data The Loaned Sample containing the data to publish
* @param[in] keysz The size of the serialized key blob, 0 for keyless topics
* @param[in] key The serialized key, a null pointer for keyless topics
* @returns A DDS return code
*/
typedef dds_return_t (*dds_psmx_endpoint_write_with_key_fn) (struct dds_psmx_endpoint *psmx_endpoint, dds_loaned_sample_t *data, size_t keysz, const void *key);
/**
* @brief Definition of function for writing data via a PSMX Writer
* @ingroup psmx
*
* Equivalent to `dds_psmx_endpoint_write_with_key_fn` with `keysz` = 0 and `key` = NULL
*/
typedef dds_return_t (*dds_psmx_endpoint_write_fn) (struct dds_psmx_endpoint *psmx_endpoint, dds_loaned_sample_t *data);
/**
* @brief Definition of function for taking data from a PSMX Reader
* @ingroup psmx
*
* Return an unread sample available to the PSMX Reader and remove it from the set of
* samples available to the PSMX Reader. It should ensure, firstly, that a sample for
* each key value for which data is available shall eventually be returned, and, secondly,
* that samples for a given key value are returned in the order of publication.
*
* The Loaned Sample shall be fully initialized on return, with a metadata sample state
* different from `UNINITIALIZED`.
*
* (Currently not called.)
*
* @param[in] psmx_endpoint The PSMX Reader to take the data from
* @returns a Loaned Sample for an unread sample, or a null pointer if none is available
*/
typedef dds_loaned_sample_t * (*dds_psmx_endpoint_take_fn) (struct dds_psmx_endpoint *psmx_endpoint);
/**
* @brief Definition of function to request asynchronous delivery of new data by a PSMX Reader
* @ingroup psmx
*
* The PSMX Plugin is requested to arrange for data arriving at the PSMX Reader to be
* delivered to Cyclone DDS as if a background thread exists that contains a loop body:
* ```
* dds_loaned_sample_t *ls = dds_psmx_endpoint_ops.take(psmx_endpoint)
* if (ls != NULL) {
* dds_reader_store_loaned_sample(reader, ls);
* }
* dds_loaned_sample_unref(data)
* ```
* (alternatively calling `dds_reader_store_loaned_sample_wr_metadata` for each sample)
*
* @param[in] psmx_endpoint The PSMX Reader on which to enable asynchronous delivery
* @param[in] reader The DDS Reader to which the data is to be delivered
* @returns a DDS return code
*/
typedef dds_return_t (*dds_psmx_endpoint_on_data_available_fn) (struct dds_psmx_endpoint *psmx_endpoint, dds_entity_t reader);
/**
* @brief Table of pointers to functions that are used on a PSMX Endpoint
* @ingroup psmx
*/
typedef struct dds_psmx_endpoint_ops {
dds_psmx_endpoint_request_loan_fn request_loan;
dds_psmx_endpoint_write_fn write; /**< write, not required if `write_key` is defined */
dds_psmx_endpoint_take_fn take;
dds_psmx_endpoint_on_data_available_fn on_data_available;
dds_psmx_endpoint_write_with_key_fn write_with_key; /**< may be null for backwards compatibility if `write` is defined */
} dds_psmx_endpoint_ops_t;
/**
* @brief Type representing a PSMX Instance in a DDS Domain Entity
* @ingroup psmx
*
* Each PSMX Instance is represented in a DDS Domain Entity by a pointer to a `struct dds_psmx`.
* The PSMX Plugin is responsible for allocating and constructing it on initialization in a constructor
* as described in the overview.
*/
typedef struct dds_psmx {
dds_psmx_ops_t ops; /**< operations on the PSMX Instance */
const char *instance_name; /**< name of this PSMX Instance */
int32_t priority; /**< priority for this interface */
const struct ddsi_locator *locator; /**< PSMX Locator for this PSMX Instance */
dds_psmx_instance_id_t instance_id; /**< Numeric PSMX Instance ID for this PSMX Instance */
void *psmx_topics; /**< Reserved, must be 0 */
} dds_psmx_t;
/**
* @brief Type representing a PSMX Topic in a DDS Domain Entity
* @ingroup psmx
*/
typedef struct dds_psmx_topic {
dds_psmx_topic_ops_t ops; /**< operations on the PSMX Topic */
struct dds_psmx *psmx_instance; /**< PSMX Instance which created this PSMX Topic */
const char *topic_name; /**< Topic name */
const char *type_name; /**< Type name */
dds_loan_data_type_t data_type; /**< Reserved, must be 0 */
void *psmx_endpoints; /**< Reserved, must be 0 */
dds_data_type_properties_t data_type_props; /**< Properties of the data type associated with this topic */
} dds_psmx_topic_t;
/**
* @brief Type representing a PSMX Endpoint in a DDS Domain Entity
* @ingroup psmx
*/
typedef struct dds_psmx_endpoint {
dds_psmx_endpoint_ops_t ops; /**< operations on the PSMX Endpoint */
struct dds_psmx_topic *psmx_topic; /**< PSMX Topic for this endpoint */
dds_psmx_endpoint_type_t endpoint_type; /**< Type of endpoint (READER or WRITER) */
} dds_psmx_endpoint_t;
/**
* @brief nop
* @ingroup psmx
*
* does nothing, exists for backwards compatibility only
*
* @param[in] psmx_topic ignored
* @param[in,out] list ignored
* @return `DDS_RETCODE_OK`
*/
DDS_DEPRECATED_EXPORT dds_return_t dds_add_psmx_topic_to_list (struct dds_psmx_topic *psmx_topic, void **list);
/**
* @brief nop
* @ingroup psmx
*
* does nothing, exists for backwards compatibility only
*
* @param[in] psmx_endpoint ignored
* @param[in,out] list ignored
* @return `DDS_RETCODE_OK`
*/
DDS_DEPRECATED_EXPORT dds_return_t dds_add_psmx_endpoint_to_list (struct dds_psmx_endpoint *psmx_endpoint, void **list);
/**
* @brief initialization function for PSMX instance (interface version 0)
* @ingroup psmx
*
* Shall be called by a constructor function for a PSMX Plugin implementing interface
* version 0 as described in the overview.
*
* @param[in] psmx The PSMX instance to initialize
* @return a DDS return code
*/
DDS_EXPORT dds_return_t dds_psmx_init_generic (struct dds_psmx *psmx);
/**
* @brief cleanup function for a PSMX instance (interface version 0)
* @ingroup psmx
*
* Shall be called by the destructor function of PSMX Plugin implementing interface
* version 0 as described in the documentation of "dds_psmx_deinit_fn".
*
* @param[in] psmx the PSMX instance to cleanup
* @return a DDS return code
*/
DDS_EXPORT dds_return_t dds_psmx_cleanup_generic (struct dds_psmx *psmx);
/**
* @brief init function for topic (interface version 0)
* @ingroup psmx
*
* Shall be called by de topic constructor function for a PSMX Plugin implementing
* interface version 0.
*
* @param[in] psmx_topic the topic to initialize
* @param[in] ops vtable for this psmx_topic
* @param[in] psmx the PSMX instance
* @param[in] topic_name the topic name
* @param[in] type_name the DDS type name for this topic
* @param[in] data_type_props the data type's properties
* @return a DDS return code
*/
DDS_EXPORT dds_return_t dds_psmx_topic_init_generic (struct dds_psmx_topic *psmx_topic, const dds_psmx_topic_ops_t *ops, const struct dds_psmx *psmx, const char *topic_name, const char *type_name, dds_data_type_properties_t data_type_props);
/**
* @brief cleanup function for a topic (interface version 0)
* @ingroup psmx
*
* Shall be called by de topic destructor function for a PSMX Plugin implementing
* interface version 0 as described in the documentation of "dds_psmx_delete_topic_fn".
*
* @param[in] psmx_topic the topic to de-initialize
* @return a DDS return code
*/
DDS_EXPORT dds_return_t dds_psmx_topic_cleanup_generic (struct dds_psmx_topic *psmx_topic);
/**
* @brief Returns the string associated with the option_name in the PSMX config string.
* @ingroup psmx
*
* The C string returned from this function should be freed by the user using `ddsrt_free`.
*
* The option "SERVICE_NAME" is treated as an alias for "INSTANCE_NAME".
*
* @param[in] conf a double-\0 terminated configuration string in the
* same format as that passed to the PSMX Plugin's constructor
* function (see the overview).
* @param[in] option_name the option to look up
* @return pointer to a newly allocated string on the heap if found, NULL if not found or out of memory.
*/
DDS_EXPORT char *dds_psmx_get_config_option_value (const char *conf, const char *option_name);
#if defined (__cplusplus)
}
#endif
#endif /* DDS_PSMX_H */