reduce dependency on sertopic->status_cb_entity

Signed-off-by: Erik Boasson <eb@ilities.com>
This commit is contained in:
Erik Boasson 2018-10-29 13:26:24 +08:00
parent 7cb80e7851
commit 3e343d032a
8 changed files with 44 additions and 29 deletions

View file

@ -82,6 +82,7 @@ typedef void (*ddsi_serdata_to_ser_unref_t) (struct ddsi_serdata *d, const ddsi_
otherwise malloc() is to be used for those. (This allows read/take to be given a block of memory
by the caller.) */
typedef bool (*ddsi_serdata_to_sample_t) (const struct ddsi_serdata *d, void *sample, void **bufptr, void *buflim);
typedef bool (*ddsi_serdata_topicless_to_sample_t) (const struct ddsi_sertopic *topic, const struct ddsi_serdata *d, void *sample, void **bufptr, void *buflim);
/* Test key values of two serdatas for equality (with the same ddsi_serdata_ops, but not necessarily

View file

@ -41,27 +41,23 @@
#define CDR_LE 0x0001
#endif
struct CDRHeader
{
struct CDRHeader {
unsigned short identifier;
unsigned short options;
};
struct serdatapool /* FIXME: now a serdatapool */
{
struct serdatapool {
struct nn_freelist freelist;
};
typedef struct dds_key_hash
{
typedef struct dds_key_hash {
char m_hash [16]; /* Key hash value. Also possibly key. Suitably aligned for accessing as uint32_t's */
unsigned m_set : 1; /* has it been initialised? */
unsigned m_iskey : 1; /* m_hash is key value */
}
dds_key_hash_t;
struct ddsi_serdata_default
{
struct ddsi_serdata_default {
struct ddsi_serdata c;
uint32_t pos;
uint32_t size;
@ -82,18 +78,18 @@ struct ddsi_serdata_default
};
struct dds_key_descriptor;
struct dds_topic_descriptor;
#ifndef DDS_TOPIC_INTERN_FILTER_FN_DEFINED
#define DDS_TOPIC_INTERN_FILTER_FN_DEFINED
typedef bool (*dds_topic_intern_filter_fn) (const void * sample, void *ctx);
#endif
struct ddsi_sertopic_default
{
struct ddsi_sertopic_default {
struct ddsi_sertopic c;
uint16_t native_encoding_identifier; /* (PL_)?CDR_(LE|BE) */
void * type;
struct dds_topic_descriptor * type;
unsigned nkeys;
uint32_t flags;

View file

@ -13,6 +13,7 @@
#define DDSI_SERTOPIC_H
#include "util/ut_avl.h"
#include "ddsc/dds_public_alloc.h"
struct ddsi_serdata;
struct ddsi_serdata_ops;
@ -39,12 +40,23 @@ 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);
struct ddsi_sertopic_ops {
ddsi_sertopic_deinit_t deinit;
ddsi_sertopic_free_sample_t free_sample;
};
struct ddsi_sertopic *ddsi_sertopic_ref (const struct ddsi_sertopic *tp);
void ddsi_sertopic_unref (struct ddsi_sertopic *tp);
uint32_t ddsi_sertopic_compute_serdata_basehash (const struct ddsi_serdata_ops *ops);
inline void ddsi_sertopic_deinit (struct ddsi_sertopic *tp) {
tp->ops->deinit (tp);
}
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);
}
#endif

View file

@ -272,14 +272,14 @@ static struct ddsi_serdata *serdata_default_from_ser (const struct ddsi_sertopic
struct ddsi_serdata *ddsi_serdata_from_keyhash_cdr (const struct ddsi_sertopic *tpcmn, const nn_keyhash_t *keyhash)
{
/* FIXME: not quite sure this is correct, though a check against a specially hacked OpenSplice suggests it is */
if (!(tpcmn->status_cb_entity->m_descriptor->m_flagset & DDS_TOPIC_FIXED_KEY))
const struct ddsi_sertopic_default *tp = (const struct ddsi_sertopic_default *)tpcmn;
if (!(tp->type->m_flagset & DDS_TOPIC_FIXED_KEY))
{
/* keyhash is MD5 of a key value, so impossible to turn into a key value */
return NULL;
}
else
{
const struct ddsi_sertopic_default *tp = (const struct ddsi_sertopic_default *)tpcmn;
struct ddsi_serdata_default *d = serdata_default_new(tp, SDK_KEY);
d->hdr.identifier = CDR_BE;
serdata_default_append_blob (&d, 1, sizeof (keyhash->value), keyhash->value);

View file

@ -38,7 +38,7 @@ void ddsi_sertopic_unref (struct ddsi_sertopic *sertopic)
{
if (os_atomic_dec32_ov (&sertopic->refc) == 1)
{
sertopic->ops->deinit (sertopic);
ddsi_sertopic_deinit (sertopic);
os_free (sertopic->name_typename);
os_free (sertopic->name);
os_free (sertopic->typename);
@ -59,3 +59,6 @@ uint32_t ddsi_sertopic_compute_serdata_basehash (const struct ddsi_serdata_ops *
memcpy (&res, digest, sizeof (res));
return res;
}
extern inline void ddsi_sertopic_deinit (struct ddsi_sertopic *tp);
extern inline void ddsi_sertopic_free_sample (const struct ddsi_sertopic *tp, void *sample, dds_free_op_t op);

View file

@ -25,11 +25,18 @@
/* FIXME: sertopic /= ddstopic so a lot of stuff needs to be moved here from dds_topic.c and the free function needs to be implemented properly */
static void deinit_sertopic_default (struct ddsi_sertopic *tp)
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)
{
const struct ddsi_sertopic_default *tp = (const struct ddsi_sertopic_default *)sertopic_common;
dds_sample_free (sample, tp->type, op);
}
const struct ddsi_sertopic_ops ddsi_sertopic_ops_default = {
.deinit = deinit_sertopic_default
.deinit = sertopic_default_deinit,
.free_sample = sertopic_default_free_sample
};