add QoS to ignore local readers/writers (#78)

Adds a new "ignorelocal" QoS to the readers/writers to ignore local
matching readers/writers, with three settings:

* DDS_IGNORELOCAL_NONE: default
* DDS_IGNORELOCAL_PARTICIPANT: ignores readers/writers in the same
  participant
* DDS_IGNORELOCAL_PROCESS: ignores readers/writers in the same process

These can be set/got using dds_qset_ignorelocal and
dds_qget_ignorelocal.

If a matching reader or writer is ignored because of this setting, it is
as-if that reader or writer doesn't exist.  No traffic will be generated
or data retained on its behalf.

There are no consequences for interoperability as this is (by
definition) a local affair.

Signed-off-by: Erik Boasson <eb@ilities.com>
This commit is contained in:
Erik Boasson 2019-04-15 11:42:56 +02:00 committed by eboasson
parent a6b5229510
commit 4778d6c5df
5 changed files with 103 additions and 0 deletions

View file

@ -136,6 +136,16 @@ typedef enum dds_presentation_access_scope_kind
}
dds_presentation_access_scope_kind_t;
/** Ignore-local QoS: Applies to DataReader, DataWriter */
typedef enum dds_ignorelocal_kind
{
DDS_IGNORELOCAL_NONE,
DDS_IGNORELOCAL_PARTICIPANT,
DDS_IGNORELOCAL_PROCESS
}
dds_ignorelocal_kind_t;
/**
* @brief Allocate memory and initialize default QoS-policies
*
@ -465,6 +475,16 @@ dds_qset_durability_service (
int32_t max_instances,
int32_t max_samples_per_instance);
/**
* @brief Set the ignore-local policy of a qos structure
*
* @param[in,out] qos - Pointer to a dds_qos_t structure that will store the policy
* @param[in] ignore - True if readers and writers owned by the same participant should be ignored
*/
DDS_EXPORT void dds_qset_ignorelocal (
dds_qos_t * __restrict qos,
dds_ignorelocal_kind_t ignore);
/**
* @brief Get the userdata from a qos structure
*
@ -753,6 +773,19 @@ dds_qget_durability_service (
int32_t *max_instances,
int32_t *max_samples_per_instance);
/**
* @brief Get the ignore-local qos policy
*
* @param[in] qos - Pointer to a dds_qos_t structure storing the policy
* @param[in,out] ignore - Pointer that will store whether to ignore readers/writers owned by the same participant (optional)
*
* @returns - false iff any of the arguments is invalid or the qos is not present in the qos object
*/
DDS_EXPORT bool
dds_qget_ignorelocal (
const dds_qos_t * __restrict qos,
dds_ignorelocal_kind_t *ignore);
#if defined (__cplusplus)
}
#endif

View file

@ -658,6 +658,16 @@ void dds_qset_durability_service
}
}
void dds_qset_ignorelocal (dds_qos_t * __restrict qos, dds_ignorelocal_kind_t ignore)
{
if (qos) {
qos->ignorelocal.value = (nn_ignorelocal_kind_t) ignore;
qos->present |= QP_CYCLONE_IGNORELOCAL;
} else {
DDS_ERROR("Argument QoS is NULL\n");
}
}
bool dds_qget_userdata (const dds_qos_t * __restrict qos, void **value, size_t *sz)
{
if (!qos || !(qos->present & QP_USER_DATA)) {
@ -931,3 +941,14 @@ bool dds_qget_durability_service (const dds_qos_t * __restrict qos, dds_duration
}
return true;
}
bool dds_qget_ignorelocal (const dds_qos_t * __restrict qos, dds_ignorelocal_kind_t *ignore)
{
if (!qos || !(qos->present & QP_CYCLONE_IGNORELOCAL)) {
return false;
}
if (ignore) {
*ignore = (dds_ignorelocal_kind_t) qos->ignorelocal.value;
}
return true;
}