support for query conditions

This also fixes #87.

Signed-off-by: Erik Boasson <eb@ilities.com>
This commit is contained in:
Erik Boasson 2019-02-10 16:52:07 +01:00
parent b21c7f032c
commit f0675ca7f1
4 changed files with 477 additions and 318 deletions

View file

@ -64,7 +64,7 @@ dds_rhc_take(
void dds_rhc_set_qos (struct rhc * rhc, const struct nn_xqos * qos);
void dds_rhc_add_readcondition (dds_readcond * cond);
bool dds_rhc_add_readcondition (dds_readcond * cond);
void dds_rhc_remove_readcondition (dds_readcond * cond);
bool dds_rhc_add_waitset (dds_readcond * cond, dds_waitset * waitset, dds_attach_t x);

View file

@ -34,8 +34,14 @@ dds_create_querycondition(
if (rc == DDS_RETCODE_OK) {
dds_readcond *cond = dds_create_readcond(r, DDS_KIND_COND_QUERY, mask, filter);
assert(cond);
hdl = cond->m_entity.m_hdl;
const bool success = (cond->m_entity.m_deriver.delete != 0);
dds_reader_unlock(r);
if (success) {
hdl = cond->m_entity.m_hdl;
} else {
dds_delete (cond->m_entity.m_hdl);
hdl = DDS_ERRNO(DDS_RETCODE_OUT_OF_RESOURCES);
}
} else {
DDS_ERROR("Error occurred on locking reader\n");
hdl = DDS_ERRNO(rc);

View file

@ -47,7 +47,12 @@ dds_create_readcond(
cond->m_query.m_filter = filter;
cond->m_query.m_index = UINT_MAX;
}
dds_rhc_add_readcondition (cond);
if (!dds_rhc_add_readcondition (cond)) {
/* FIXME: current entity management code can't deal with an error late in the creation of the
entity because it doesn't allow deleting it again ... instead use a hack to signal a problem
to the caller and let that one handle it. */
cond->m_entity.m_deriver.delete = 0;
}
return cond;
}
@ -65,6 +70,7 @@ dds_create_readcondition(
if (rc == DDS_RETCODE_OK) {
dds_readcond *cond = dds_create_readcond(rd, DDS_KIND_COND_READ, mask, 0);
assert(cond);
assert(cond->m_entity.m_deriver.delete);
hdl = cond->m_entity.m_hdl;
dds_reader_unlock(rd);
} else {

File diff suppressed because it is too large Load diff