support for query conditions
This also fixes #87. Signed-off-by: Erik Boasson <eb@ilities.com>
This commit is contained in:
parent
b21c7f032c
commit
f0675ca7f1
4 changed files with 477 additions and 318 deletions
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
Loading…
Add table
Add a link
Reference in a new issue