assign an index to query conditions
This index can then be used as an index into a bitmap to keep track which query conditions are matched by a sample or an instance. Signed-off-by: Erik Boasson <eb@ilities.com>
This commit is contained in:
parent
1d746a866d
commit
eee8f6cc59
3 changed files with 43 additions and 24 deletions
|
@ -247,6 +247,7 @@ typedef struct dds_readcond
|
|||
struct
|
||||
{
|
||||
dds_querycondition_filter_fn m_filter;
|
||||
unsigned m_index; /* index in RHC condition masks */
|
||||
} m_query;
|
||||
}
|
||||
dds_readcond;
|
||||
|
|
|
@ -45,6 +45,7 @@ dds_create_readcond(
|
|||
cond->m_rd_guid = rd->m_entity.m_guid;
|
||||
if (kind == DDS_KIND_COND_QUERY) {
|
||||
cond->m_query.m_filter = filter;
|
||||
cond->m_query.m_index = UINT_MAX;
|
||||
}
|
||||
dds_rhc_add_readcondition (cond);
|
||||
return cond;
|
||||
|
|
|
@ -152,6 +152,9 @@
|
|||
even when generating an invalid sample for an unregister message using
|
||||
the tkmap data. */
|
||||
|
||||
typedef uint32_t querycond_mask_t;
|
||||
#define MAX_ATTACHED_QUERYCONDS (CHAR_BIT * sizeof (querycond_mask_t))
|
||||
|
||||
#define TRACE(...) DDS_LOG(DDS_LC_RHC, __VA_ARGS__)
|
||||
|
||||
/******************************
|
||||
|
@ -299,6 +302,7 @@ struct rhc
|
|||
os_mutex lock;
|
||||
dds_readcond * conds; /* List of associated read conditions */
|
||||
uint32_t nconds; /* Number of associated read conditions */
|
||||
uint32_t nqconds; /* Number of associated query conditions */
|
||||
};
|
||||
|
||||
struct trigger_info
|
||||
|
@ -2129,17 +2133,20 @@ static uint32_t rhc_get_cond_trigger (struct rhc_instance * const inst, const dd
|
|||
return m ? 1 : 0;
|
||||
}
|
||||
|
||||
void dds_rhc_add_readcondition (dds_readcond * cond)
|
||||
void dds_rhc_add_readcondition (dds_readcond *cond)
|
||||
{
|
||||
/* On the assumption that a readcondition will be attached to a
|
||||
waitset for nearly all of its life, we keep track of all
|
||||
readconditions on a reader in one set, without distinguishing
|
||||
between those attached to a waitset or not. */
|
||||
|
||||
struct rhc * rhc = cond->m_rhc;
|
||||
struct rhc *rhc = cond->m_rhc;
|
||||
struct ut_hhIter iter;
|
||||
struct rhc_instance * inst;
|
||||
|
||||
assert ((dds_entity_kind (&cond->m_entity) == DDS_KIND_COND_READ && cond->m_query.m_filter == 0) ||
|
||||
(dds_entity_kind (&cond->m_entity) == DDS_KIND_COND_QUERY && cond->m_query.m_filter != 0));
|
||||
|
||||
cond->m_qminv = qmask_from_dcpsquery (cond->m_sample_states, cond->m_view_states, cond->m_instance_states);
|
||||
|
||||
os_mutexLock (&rhc->lock);
|
||||
|
@ -2153,8 +2160,29 @@ void dds_rhc_add_readcondition (dds_readcond * cond)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
cond->m_rhc_next = rhc->conds;
|
||||
rhc->nconds++;
|
||||
if (cond->m_query.m_filter)
|
||||
{
|
||||
/* Attaching a query condition means selecting an available index in the bitmasks of matching conditions, clearing the bit in all the masks & evaluating the condition on all samples. For the clearing and the setting of the instance mask, we need to scan all instances, not just the non-empty ones. */
|
||||
dds_readcond *rc;
|
||||
querycond_mask_t inv_qcmask = ~(querycond_mask_t)0;
|
||||
assert (cond->m_query.m_index == UINT_MAX);
|
||||
for (rc = rhc->conds; rc != NULL; rc = rc->m_rhc_next)
|
||||
if (rc->m_query.m_filter != 0)
|
||||
{
|
||||
assert (rc->m_query.m_index < MAX_ATTACHED_QUERYCONDS);
|
||||
inv_qcmask &= ~((querycond_mask_t)1 << rc->m_query.m_index);
|
||||
}
|
||||
if (inv_qcmask == 0) abort (); /* FIXME: must return an error instead of crashing */
|
||||
unsigned index = 0;
|
||||
while (!(inv_qcmask & ((querycond_mask_t)1 << index)))
|
||||
index++;
|
||||
cond->m_query.m_index = index;
|
||||
|
||||
rhc->nqconds++;
|
||||
}
|
||||
rhc->conds = cond;
|
||||
|
||||
TRACE ("add_readcondition(%p, %x, %x, %x) => %p qminv %x ; rhc %u conds\n",
|
||||
|
@ -2164,31 +2192,20 @@ void dds_rhc_add_readcondition (dds_readcond * cond)
|
|||
os_mutexUnlock (&rhc->lock);
|
||||
}
|
||||
|
||||
void dds_rhc_remove_readcondition (dds_readcond * cond)
|
||||
void dds_rhc_remove_readcondition (dds_readcond *cond)
|
||||
{
|
||||
struct rhc * rhc = cond->m_rhc;
|
||||
dds_readcond * iter;
|
||||
dds_readcond * prev = NULL;
|
||||
|
||||
struct rhc *rhc = cond->m_rhc;
|
||||
dds_readcond **ptr;
|
||||
os_mutexLock (&rhc->lock);
|
||||
iter = rhc->conds;
|
||||
while (iter)
|
||||
ptr = &rhc->conds;
|
||||
while (*ptr != cond)
|
||||
ptr = &(*ptr)->m_rhc_next;
|
||||
*ptr = (*ptr)->m_rhc_next;
|
||||
rhc->nconds--;
|
||||
if (cond->m_query.m_filter)
|
||||
{
|
||||
if (iter == cond)
|
||||
{
|
||||
if (prev)
|
||||
{
|
||||
prev->m_rhc_next = iter->m_rhc_next;
|
||||
}
|
||||
else
|
||||
{
|
||||
rhc->conds = iter->m_rhc_next;
|
||||
}
|
||||
rhc->nconds--;
|
||||
break;
|
||||
}
|
||||
prev = iter;
|
||||
iter = iter->m_rhc_next;
|
||||
rhc->nqconds--;
|
||||
cond->m_query.m_index = UINT_MAX;
|
||||
}
|
||||
os_mutexUnlock (&rhc->lock);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue