plist/xqos fini early out if nothing to be done
All incoming samples end up in ddsi_plist_fini, usually one with nothing present, sometimes one containing status info or a keyhash. The "present" flags allow this to be a very quick operation in these simple cases, and this should be made use of. Signed-off-by: Erik Boasson <eb@ilities.com>
This commit is contained in:
parent
ca8742bfba
commit
8ae005a05a
1 changed files with 9 additions and 0 deletions
|
@ -1741,6 +1741,7 @@ static const struct piddesc_index piddesc_vendor_index[] = {
|
||||||
table too small or too large */
|
table too small or too large */
|
||||||
static const struct piddesc *piddesc_unalias[18 + SECURITY_PROC_ARRAY_SIZE];
|
static const struct piddesc *piddesc_unalias[18 + SECURITY_PROC_ARRAY_SIZE];
|
||||||
static const struct piddesc *piddesc_fini[18 + SECURITY_PROC_ARRAY_SIZE];
|
static const struct piddesc *piddesc_fini[18 + SECURITY_PROC_ARRAY_SIZE];
|
||||||
|
static uint64_t plist_fini_mask, qos_fini_mask;
|
||||||
static ddsrt_once_t table_init_control = DDSRT_ONCE_INIT;
|
static ddsrt_once_t table_init_control = DDSRT_ONCE_INIT;
|
||||||
|
|
||||||
static size_t pid_to_index (nn_parameterid_t pid)
|
static size_t pid_to_index (nn_parameterid_t pid)
|
||||||
|
@ -1836,6 +1837,10 @@ static void ddsi_plist_init_tables_real (void)
|
||||||
{
|
{
|
||||||
assert (fini_index < sizeof (piddesc_fini) / sizeof (piddesc_fini[0]));
|
assert (fini_index < sizeof (piddesc_fini) / sizeof (piddesc_fini[0]));
|
||||||
piddesc_fini[fini_index++] = &table[j];
|
piddesc_fini[fini_index++] = &table[j];
|
||||||
|
if (table[j].flags & PDF_QOS)
|
||||||
|
qos_fini_mask |= table[j].present_flag;
|
||||||
|
else
|
||||||
|
plist_fini_mask |= table[j].present_flag;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1876,12 +1881,16 @@ static void plist_or_xqos_fini (void * __restrict dst, size_t shift, uint64_t pm
|
||||||
if (shift > 0)
|
if (shift > 0)
|
||||||
{
|
{
|
||||||
dds_qos_t *qos = dst;
|
dds_qos_t *qos = dst;
|
||||||
|
if ((qos->present & qos_fini_mask) == 0)
|
||||||
|
return;
|
||||||
pfs = (struct flagset) { NULL, NULL, 0 };
|
pfs = (struct flagset) { NULL, NULL, 0 };
|
||||||
qfs = (struct flagset) { .present = &qos->present, .aliased = &qos->aliased };
|
qfs = (struct flagset) { .present = &qos->present, .aliased = &qos->aliased };
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ddsi_plist_t *plist = dst;
|
ddsi_plist_t *plist = dst;
|
||||||
|
if ((plist->present & plist_fini_mask) == 0 && (plist->qos.present & qos_fini_mask) == 0)
|
||||||
|
return;
|
||||||
pfs = (struct flagset) { .present = &plist->present, .aliased = &plist->aliased };
|
pfs = (struct flagset) { .present = &plist->present, .aliased = &plist->aliased };
|
||||||
qfs = (struct flagset) { .present = &plist->qos.present, .aliased = &plist->qos.aliased };
|
qfs = (struct flagset) { .present = &plist->qos.present, .aliased = &plist->qos.aliased };
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue