extend sertopic interface and move the concept of a type descriptor to just the sertopic definition
Signed-off-by: Erik Boasson <eb@ilities.com>
This commit is contained in:
parent
c169df6227
commit
e631567c35
11 changed files with 269 additions and 124 deletions
|
@ -9,8 +9,8 @@
|
|||
*
|
||||
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
|
||||
*/
|
||||
#ifndef DDSI_SER_H
|
||||
#define DDSI_SER_H
|
||||
#ifndef DDSI_SERDATA_DEFAULT_H
|
||||
#define DDSI_SERDATA_DEFAULT_H
|
||||
|
||||
#include "os/os.h"
|
||||
#include "ddsi/q_plist.h" /* for nn_prismtech_writer_info */
|
||||
|
|
|
@ -41,11 +41,19 @@ struct ddsi_sertopic {
|
|||
typedef void (*ddsi_sertopic_deinit_t) (struct ddsi_sertopic *tp);
|
||||
|
||||
/* Release any memory allocated by ddsi_sertopic_to_sample */
|
||||
typedef void (*ddsi_sertopic_free_sample_t) (const struct ddsi_sertopic *d, void *sample, dds_free_op_t op);
|
||||
typedef void (*ddsi_sertopic_zero_samples_t) (const struct ddsi_sertopic *d, void *samples, size_t count);
|
||||
|
||||
/* Release any memory allocated by ddsi_sertopic_to_sample */
|
||||
typedef void (*ddsi_sertopic_realloc_samples_t) (void **ptrs, const struct ddsi_sertopic *d, void *old, size_t oldcount, size_t count);
|
||||
|
||||
/* Release any memory allocated by ddsi_sertopic_to_sample (also undo sertopic_alloc_sample if "op" so requests) */
|
||||
typedef void (*ddsi_sertopic_free_samples_t) (const struct ddsi_sertopic *d, void **ptrs, size_t count, dds_free_op_t op);
|
||||
|
||||
struct ddsi_sertopic_ops {
|
||||
ddsi_sertopic_deinit_t deinit;
|
||||
ddsi_sertopic_free_sample_t free_sample;
|
||||
ddsi_sertopic_zero_samples_t zero_samples;
|
||||
ddsi_sertopic_realloc_samples_t realloc_samples;
|
||||
ddsi_sertopic_free_samples_t free_samples;
|
||||
};
|
||||
|
||||
struct ddsi_sertopic *ddsi_sertopic_ref (const struct ddsi_sertopic *tp);
|
||||
|
@ -55,8 +63,26 @@ uint32_t ddsi_sertopic_compute_serdata_basehash (const struct ddsi_serdata_ops *
|
|||
inline void ddsi_sertopic_deinit (struct ddsi_sertopic *tp) {
|
||||
tp->ops->deinit (tp);
|
||||
}
|
||||
inline void ddsi_sertopic_zero_samples (const struct ddsi_sertopic *tp, void *samples, size_t count) {
|
||||
tp->ops->zero_samples (tp, samples, count);
|
||||
}
|
||||
inline void ddsi_sertopic_realloc_samples (void **ptrs, const struct ddsi_sertopic *tp, void *old, size_t oldcount, size_t count)
|
||||
{
|
||||
tp->ops->realloc_samples (ptrs, tp, old, oldcount, count);
|
||||
}
|
||||
inline void ddsi_sertopic_free_samples (const struct ddsi_sertopic *tp, void **ptrs, size_t count, dds_free_op_t op) {
|
||||
tp->ops->free_samples (tp, ptrs, count, op);
|
||||
}
|
||||
inline void ddsi_sertopic_zero_sample (const struct ddsi_sertopic *tp, void *sample) {
|
||||
ddsi_sertopic_zero_samples (tp, sample, 1);
|
||||
}
|
||||
inline void *ddsi_sertopic_alloc_sample (const struct ddsi_sertopic *tp) {
|
||||
void *ptr;
|
||||
ddsi_sertopic_realloc_samples (&ptr, tp, NULL, 0, 1);
|
||||
return ptr;
|
||||
}
|
||||
inline void ddsi_sertopic_free_sample (const struct ddsi_sertopic *tp, void *sample, dds_free_op_t op) {
|
||||
tp->ops->free_sample (tp, sample, op);
|
||||
ddsi_sertopic_free_samples (tp, &sample, 1, op);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -61,4 +61,9 @@ uint32_t ddsi_sertopic_compute_serdata_basehash (const struct ddsi_serdata_ops *
|
|||
}
|
||||
|
||||
extern inline void ddsi_sertopic_deinit (struct ddsi_sertopic *tp);
|
||||
extern inline void ddsi_sertopic_zero_samples (const struct ddsi_sertopic *tp, void *samples, size_t count);
|
||||
extern inline void ddsi_sertopic_realloc_samples (void **ptrs, const struct ddsi_sertopic *tp, void *old, size_t oldcount, size_t count);
|
||||
extern inline void ddsi_sertopic_free_samples (const struct ddsi_sertopic *tp, void **ptrs, size_t count, dds_free_op_t op);
|
||||
extern inline void ddsi_sertopic_zero_sample (const struct ddsi_sertopic *tp, void *sample);
|
||||
extern inline void ddsi_sertopic_free_sample (const struct ddsi_sertopic *tp, void *sample, dds_free_op_t op);
|
||||
extern inline void *ddsi_sertopic_alloc_sample (const struct ddsi_sertopic *tp);
|
||||
|
|
|
@ -30,13 +30,56 @@ static void sertopic_default_deinit (struct ddsi_sertopic *tp)
|
|||
(void)tp;
|
||||
}
|
||||
|
||||
static void sertopic_default_free_sample (const struct ddsi_sertopic *sertopic_common, void *sample, dds_free_op_t op)
|
||||
static void sertopic_default_zero_samples (const struct ddsi_sertopic *sertopic_common, void *sample, size_t count)
|
||||
{
|
||||
const struct ddsi_sertopic_default *tp = (const struct ddsi_sertopic_default *)sertopic_common;
|
||||
dds_sample_free (sample, tp->type, op);
|
||||
memset (sample, 0, tp->type->m_size * count);
|
||||
}
|
||||
|
||||
static void sertopic_default_realloc_samples (void **ptrs, const struct ddsi_sertopic *sertopic_common, void *old, size_t oldcount, size_t count)
|
||||
{
|
||||
const struct ddsi_sertopic_default *tp = (const struct ddsi_sertopic_default *)sertopic_common;
|
||||
const size_t size = tp->type->m_size;
|
||||
char *new = dds_realloc (old, size * count);
|
||||
if (new && count > oldcount)
|
||||
memset (new + size * oldcount, 0, size * (count - oldcount));
|
||||
for (size_t i = 0; i < count; i++)
|
||||
{
|
||||
void *ptr = (char *) new + i * size;
|
||||
ptrs[i] = ptr;
|
||||
}
|
||||
}
|
||||
|
||||
static void sertopic_default_free_samples (const struct ddsi_sertopic *sertopic_common, void **ptrs, size_t count, dds_free_op_t op)
|
||||
{
|
||||
if (count > 0)
|
||||
{
|
||||
const struct ddsi_sertopic_default *tp = (const struct ddsi_sertopic_default *)sertopic_common;
|
||||
const struct dds_topic_descriptor *type = tp->type;
|
||||
const size_t size = type->m_size;
|
||||
#ifndef NDEBUG
|
||||
for (size_t i = 0, off = 0; i < count; i++, off += size)
|
||||
assert ((char *)ptrs[i] == (char *)ptrs[0] + off);
|
||||
#endif
|
||||
if (type->m_flagset & DDS_TOPIC_NO_OPTIMIZE)
|
||||
{
|
||||
char *ptr = ptrs[0];
|
||||
for (size_t i = 0; i < count; i++)
|
||||
{
|
||||
dds_sample_free (ptr, type, DDS_FREE_CONTENTS);
|
||||
ptr += size;
|
||||
}
|
||||
}
|
||||
if (op & DDS_FREE_ALL_BIT)
|
||||
{
|
||||
dds_free (ptrs[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const struct ddsi_sertopic_ops ddsi_sertopic_ops_default = {
|
||||
.deinit = sertopic_default_deinit,
|
||||
.free_sample = sertopic_default_free_sample
|
||||
.zero_samples = sertopic_default_zero_samples,
|
||||
.realloc_samples = sertopic_default_realloc_samples,
|
||||
.free_samples = sertopic_default_free_samples
|
||||
};
|
||||
|
|
|
@ -1040,7 +1040,7 @@ int rtps_init (void)
|
|||
make_builtin_endpoint_xqos (&gv.builtin_endpoint_xqos_rd, &gv.default_xqos_rd);
|
||||
make_builtin_endpoint_xqos (&gv.builtin_endpoint_xqos_wr, &gv.default_xqos_wr);
|
||||
|
||||
make_special_topics (); /* FIXME: leaking these for now */
|
||||
make_special_topics ();
|
||||
|
||||
os_mutexInit (&gv.participant_set_lock);
|
||||
os_condInit (&gv.participant_set_cond, &gv.participant_set_lock);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue